1# HMAC(ArkTS) 2 3HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)。具体的场景介绍及支持的算法规格,请参考[HMAC介绍与算法规格](huks-hmac-overview.md)。 4 5## 开发步骤 6 7**生成密钥** 8 91. 指定密钥别名。 10 112. 初始化密钥属性集。 12 133. 调用[generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9)生成密钥,HMAC支持的规格请参考[密钥生成](huks-key-generation-overview.md#支持的算法)。 14 15除此之外,开发者也可以参考[密钥导入](huks-key-import-overview.md#支持的算法)的规格介绍,导入已有的密钥。 16 17**执行HMAC** 18 191. 获取密钥别名。 20 212. 获取待运算的数据。 22 233. 调用[initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9)初始化密钥会话,并获取会话的句柄handle。 24 254. 调用[finishSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksfinishsession9)结束密钥会话,获取哈希后的数据。 26 27```ts 28/* 29 * 以下以HMAC密钥的Promise操作使用为例 30 */ 31import { huks } from '@kit.UniversalKeystoreKit'; 32 33let HmackeyAlias = 'test_HMAC'; 34let handle: number; 35let plainText = '123456'; 36let hashData: Uint8Array; 37 38function StringToUint8Array(str: String) { 39 let arr: number[] = new Array(); 40 for (let i = 0, j = str.length; i < j; ++i) { 41 arr.push(str.charCodeAt(i)); 42 } 43 return new Uint8Array(arr); 44} 45 46function Uint8ArrayToString(fileData: Uint8Array) { 47 let dataString = ''; 48 for (let i = 0; i < fileData.length; i++) { 49 dataString += String.fromCharCode(fileData[i]); 50 } 51 return dataString; 52} 53 54function GetHMACProperties() { 55 const properties: Array<huks.HuksParam> = [{ 56 tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 57 value: huks.HuksKeyAlg.HUKS_ALG_HMAC 58 }, { 59 tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 60 value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 61 }, { 62 tag: huks.HuksTag.HUKS_TAG_PURPOSE, 63 value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_MAC 64 }, { 65 tag: huks.HuksTag.HUKS_TAG_DIGEST, 66 value: huks.HuksKeyDigest.HUKS_DIGEST_SHA384, 67 }]; 68 return properties; 69} 70 71async function GenerateHMACKey() { 72 /* 73 * 模拟生成密钥场景 74 * 1. 确定密钥别名 75 */ 76 /* 77 * 2. 获取生成密钥算法参数配置 78 */ 79 let genProperties = GetHMACProperties(); 80 let options: huks.HuksOptions = { 81 properties: genProperties 82 } 83 /* 84 * 3. 调用generateKeyItem 85 */ 86 await huks.generateKeyItem(HmackeyAlias, options) 87 .then((data) => { 88 console.info(`promise: generate HMAC Key success`); 89 }).catch((error: Error) => { 90 console.error(`promise: generate HMAC Key failed, ${JSON.stringify(error)}`); 91 }) 92} 93 94async function HMACData() { 95 /* 96 * 模拟HMAC场景 97 * 1. 获取密钥别名 98 */ 99 /* 100 * 2. 获取待哈希的数据 101 */ 102 /* 103 * 3. 获取HMAC算法参数配置 104 */ 105 let hmacProperties = GetHMACProperties(); 106 let options: huks.HuksOptions = { 107 properties: hmacProperties, 108 inData: StringToUint8Array(plainText) 109 } 110 /* 111 * 4. 调用initSession获取handle 112 */ 113 await huks.initSession(HmackeyAlias, options) 114 .then((data) => { 115 handle = data.handle; 116 }).catch((error: Error) => { 117 console.error(`promise: init EncryptData failed, ${JSON.stringify(error)}`); 118 }) 119 /* 120 * 5. 调用finishSession获取HMAC的结果 121 */ 122 await huks.finishSession(handle, options) 123 .then((data) => { 124 console.info(`promise: HMAC data success, data is ` + Uint8ArrayToString(data.outData as Uint8Array)); 125 hashData = data.outData as Uint8Array; 126 }).catch((error: Error) => { 127 console.error(`promise: HMAC data failed, ${JSON.stringify(error)}`); 128 }) 129} 130``` 131