HarmonyOS Next 金鑰轉換技巧:提升加解密靈活性

SameX發表於2024-11-18

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。
主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。
本文為原創內容,任何形式的轉載必須註明出處及原作者。

一、引言

在當今數字化安全領域,金鑰轉換扮演著舉足輕重的角色。隨著資訊科技的飛速發展,不同系統、應用和裝置之間的資料互動日益頻繁,而這些互動往往依賴於加密技術來保障資料的機密性、完整性和可用性。然而,由於各種因素的影響,如系統升級、跨平臺協作或與遺留系統的相容性需求,金鑰的格式、型別和表示方式可能存在差異。例如,在企業進行數字化轉型過程中,可能需要將舊有系統中使用的特定格式金鑰轉換為新系統支援的格式,以確保資料加密的連續性;或者在移動應用與後端伺服器進行安全通訊時,可能需要根據伺服器端的要求對金鑰進行轉換。因此,掌握金鑰轉換技術對於實現安全、高效的資料互動至關重要。接下來,我們將深入探討 HarmonyOS Next 中的金鑰轉換技巧,以及它們如何提升加解密操作的靈活性。

二、對稱金鑰二進位制資料轉換

(一)3DES 轉換過程與程式碼示例(ArkTS)

  1. 轉換過程
    - 首先,獲取 3DES 二進位制金鑰資料並封裝成 DataBlob 物件。假設我們有一個長度為 192 位(24 位元組)的 3DES 金鑰資料,如下所示:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { BusinessError } from '@kit.BasicServicesKit';
function genKeyMaterialBlob(): cryptoFramework.DataBlob {
  let arr = [
    0xba, 0x3d, 0xc2, 0.71, 0x21, 0x1e, 0x30, 0x56,
    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0.7c,
    0xba, 0x3b, 0xc2, 0.71, 0xab, 0xa0, 0.30, 0.72];
  let keyMaterial = new Uint8Array(arr);
  return { data: keyMaterial };
}

- 這裡建立了一個包含 3DES 二進位制金鑰資料的 Uint8Array,並將其封裝成 DataBlob 物件,以便後續使用。
2. 然後,建立 3DES 對稱金鑰生成器並進行轉換:

function testConvertSymKey() {
  // 建立SymKeyGenerator例項
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
  // 根據指定的資料生成對稱金鑰
  let keyMaterialBlob = genKeyMaterialBlob();
  try {
    symKeyGenerator.convertKey(keyMaterialBlob, (error, key) => {
      if (error) {
        let e: BusinessError = error as BusinessError;
        console.error(`convertKey error, ${e.code}, ${e.message}`);
        return;
      }
      console.info('key algName:' + key.algName);
      console.info('key format:' + key.format);
      let encodedKey = key.getEncoded();
      console.info('key getEncoded hex: ' + encodedKey.data);
    })
  } catch (error) {
    let e: BusinessError = error as BusinessError;
    console.error(`convertKey failed, ${e.code}, ${e.message}`);
  }
}

- 建立一個金鑰演算法為 3DES、金鑰長度為 192 位的對稱金鑰生成器。接著呼叫 convertKey 方法,傳入封裝好的二進位制金鑰資料,嘗試將其轉換為對稱金鑰。如果轉換成功,在回撥函式中輸出金鑰的演算法名稱、格式以及二進位制資料(以十六進位制字串形式);如果轉換失敗,則捕獲異常並輸出錯誤資訊。

(二)HMAC 轉換過程與程式碼示例(ArkTS)

  1. 轉換過程
    - 先獲取 HMAC 二進位制金鑰資料並封裝成 DataBlob 物件。例如,假設我們有一個簡單的 HMAC 金鑰資料:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { BusinessError } from '@kit.BasicServicesKit';
function genHMACKeyMaterialBlob(): cryptoFramework.DataBlob {
  let arr = [0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0];
  let keyMaterial = new Uint8Array(arr);
  return { data: keyMaterial };
}

- 建立了一個包含 HMAC 二進位制金鑰資料的 Uint8Array,並封裝成 DataBlob 物件。
2. 接著建立 HMAC 對稱金鑰生成器並進行轉換:

function testConvertHMACKey() {
  // 建立SymKeyGenerator例項
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC');
  // 根據指定的資料生成對稱金鑰
  let keyMaterialBlob = genHMACKeyMaterialBlob();
  try {
    symKeyGenerator.convertKey(keyMaterialBlob, (error, key) => {
      if (error) {
        let e: BusinessError = error as BusinessError;
        console.error(`convertKey error, ${e.code}, ${e.message}`);
        return;
      }
      console.info('key algName:' + key.algName);
      console.info('key format:' + key.format);
      let encodedKey = key.getEncoded();
      console.info('key getEncoded hex: ' + encodedKey.data);
    })
  } catch (error) {
    let e: BusinessError = error as BusinessError;
    console.error(`convertKey failed, ${e.code}, ${e.message}`);
  }
}

- 建立一個金鑰演算法為 HMAC 的對稱金鑰生成器,然後呼叫 convertKey 方法傳入二進位制金鑰資料進行轉換。若成功,輸出金鑰相關資訊;若失敗,輸出錯誤資訊。

三、總結

在 HarmonyOS Next 中,金鑰轉換為加解密操作帶來了顯著的靈活性提升。對於對稱金鑰,透過如 3DES 和 HMAC 二進位制資料轉換的示例可知,我們可以將外部獲取或儲存的二進位制金鑰資料轉換為系統可直接使用的對稱金鑰格式。其方法主要包括獲取正確格式的二進位制資料,建立相應演算法的對稱金鑰生成器,然後使用 convertKey 方法進行轉換,並根據回撥函式或異常處理來判斷轉換結果。金鑰轉換的意義深遠,它打破了不同金鑰格式和來源之間的隔閡,使得在複雜的資訊系統環境中,無論是系統內部的金鑰管理,還是與外部系統的安全互動,都能夠更加順暢地進行。這有助於提高系統的相容性、可擴充套件性和安全性,確保資料在各種情況下都能得到有效的加密保護,從而為使用者提供更加可靠的安全保障。

相關文章