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版本调整参数。

