• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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