HarmonyOS 鸿蒙Next中使用huks加解密数据

HarmonyOS 鸿蒙Next中使用huks加解密数据 使用huks加解密数据

3 回复

示例代码(以加解密字符串为例)

interface EncryptData {
  content: string,
  iv: string
}
function stringToArray(str: string) {
  return new util.TextEncoder().encodeInto(str)
}
function arrayToString(arr: Uint8Array) {
  return util.TextDecoder.create().decodeToString(arr)
}
async function encrypt(content: string): Promise<EncryptData> {
  const random = cryptoFramework.createRandom()
  const iv = random.generateRandomSync(16).data
  const options: huks.HuksOptions = {
    inData: stringToArray(content),
    properties: [
      {
        tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
        value: huks.HuksKeyAlg.HUKS_ALG_AES
      },
      {
        tag: huks.HuksTag.HUKS_TAG_PURPOSE,
        value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT
      },
      {
        tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
        value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256
      },
      {
        tag: huks.HuksTag.HUKS_TAG_PADDING,
        value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7
      },
      {
        tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
        value: huks.HuksCipherMode.HUKS_MODE_CBC
      },
      {
        tag: huks.HuksTag.HUKS_TAG_IV,
        value: iv
      }
    ]
  }
  const session = await huks.initSession('key', options)
  const res = await huks.finishSession(session.handle, options)
  return {
    content: encodeBase64ToString(res.outData as Uint8Array),
    iv: encodeBase64ToString(iv)
  }
}
async function decrypt(encryptData: EncryptData): Promise<string> {
  const options: huks.HuksOptions = {
    inData: decodeBase64(encryptData.content),
    properties: [
      {
        tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
        value: huks.HuksKeyAlg.HUKS_ALG_AES
      },
      {
        tag: huks.HuksTag.HUKS_TAG_PURPOSE,
        value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
      },
      {
        tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
        value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256
      },
      {
        tag: huks.HuksTag.HUKS_TAG_PADDING,
        value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7
      },
      {
        tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
        value: huks.HuksCipherMode.HUKS_MODE_CBC
      },
      {
        tag: huks.HuksTag.HUKS_TAG_IV,
        value: decodeBase64(encryptData.iv)
      }
    ]
  }
  const session = await huks.initSession('key', options)
  const res = await huks.finishSession(session.handle, options)
  return arrayToString(res.outData as Uint8Array)
}

更多关于HarmonyOS 鸿蒙Next中使用huks加解密数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS Next HUKS密钥管理服务

HarmonyOS Next中的HUKS(Hardware Unified Key Store)提供了一套完整的密钥管理服务,支持密钥的生成、存储以及使用密钥进行数据加解密操作。

核心功能与接口

  • 初始化参数:使用 huks.init() 接口初始化加解密操作所需的参数。
  • 生成密钥:使用 huks.generateKey() 接口生成密钥。
  • 加密数据:使用 huks.encrypt() 接口对数据进行加密。
  • 解密数据:使用 huks.decrypt() 接口对加密数据进行解密。

权限申请

要使用HUKS服务,必须在应用的 module.json5 配置文件中声明以下权限:

"requestPermissions": [
  {
    "name": "ohos.permission.USE_HUKS"
  }
]

在HarmonyOS Next中,使用HUKS(HarmonyOS Universal Keystore)进行数据加解密,核心流程包括密钥生成、加密与解密操作。以下是关键步骤与代码示例:

1. 生成密钥

首先使用huks.generateKeyItem()生成对称密钥(如AES)或非对称密钥对。

import { huks } from '@kit.UniversalKeystoreKit';

let keyAlias = 'test_aes_key';
let properties = [
  { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_AES },
  { tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 },
  { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT },
  { tag: huks.HuksTag.HUKS_TAG_PADDING, value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7 },
  { tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, value: huks.HuksCipherMode.HUKS_MODE_CBC }
];

let options = { properties: properties };
await huks.generateKeyItem(keyAlias, options);

2. 加密数据

通过huks.init()huks.update()huks.finish()分步加密。

let plainText = 'Hello HarmonyOS';
let cipherData: Uint8Array;

let initOptions = {
  properties: [
    { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_AES },
    { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT },
    { tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 },
    { tag: huks.HuksTag.HUKS_TAG_PADDING, value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7 },
    { tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, value: huks.HuksCipherMode.HUKS_MODE_CBC },
    { tag: huks.HuksTag.HUKS_TAG_IV, value: new Uint8Array(16) } // 初始化向量
  ]
};

let handle = await huks.initSession(keyAlias, initOptions);
await huks.updateSession(handle, { data: new Uint8Array(plainText.split('').map(char => char.charCodeAt(0))) });
let finishResult = await huks.finishSession(handle, {});
cipherData = finishResult.data;

3. 解密数据

解密流程与加密类似,仅需将HUKS_TAG_PURPOSE改为HUKS_KEY_PURPOSE_DECRYPT

let initOptionsDecrypt = {
  properties: [
    ...initOptions.properties.filter(p => p.tag !== huks.HuksTag.HUKS_TAG_PURPOSE),
    { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT }
  ]
};

let handleDecrypt = await huks.initSession(keyAlias, initOptionsDecrypt);
await huks.updateSession(handleDecrypt, { data: cipherData });
let finishResultDecrypt = await huks.finishSession(handleDecrypt, {});
let decryptedText = String.fromCharCode(...finishResultDecrypt.data);

注意事项:

  • 密钥管理:密钥通过keyAlias标识,需保障其唯一性。
  • 算法参数:加解密时HUKS_TAG_IV等参数需保持一致。
  • 错误处理:建议使用try-catch封装异步调用,处理HuksError
  • 密钥删除:不再使用的密钥可通过huks.deleteKeyItem(keyAlias)清理。

此流程适用于HarmonyOS Next的Stage模型,实际开发需根据API版本调整参数。

回到顶部