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