1# 生成密钥(ArkTS)
2
3
4以生成DH密钥为例,生成随机密钥。具体的场景介绍及支持的算法规格,请参考[密钥生成支持的算法](huks-key-generation-overview.md#支持的算法)。
5
6> **注意:**
7> 密钥别名中禁止包含个人数据等敏感信息。
8
9## 开发步骤
10
111. 指定待生成的密钥别名keyAlias。
12   - 密钥别名的最大长度为128字节。
13   - 对于不同业务间生成的密钥,HUKS将基于业务身份信息进行存储路径隔离,不会因为和其他业务密钥同名导致冲突。
14
152. 初始化密钥属性集。通过[HuksParam](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksparam)封装密钥属性,搭配Array组成密钥属性集,并赋值给[HuksOptions](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksoptions)中的properties字段。
16   密钥属性集中必须包含[HuksKeyAlg](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukskeyalg)、[HuksKeySize](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukskeysize)、[HuksKeyPurpose](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukskeypurpose)属性,即必传TAG,HUKS_TAG_ALGORITHM、HUKS_TAG_PURPOSE、HUKS_TAG_KEY_SIZE。注:一个密钥只能有一类PURPOSE,并且,生成密钥时指定的用途要与使用时的方式一致,否则会导致异常,请参考[密钥用途](huks-key-generation-overview.md#密钥用途)
17
183. 调用[huks.generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9),传入密钥别名和密钥属性集,生成密钥。
19
20> **说明:**
21> 如果业务再次使用相同别名调用HUKS生成密钥,HUKS将生成新密钥并直接覆盖历史的密钥文件。
22
23
24```ts
25/* 以下以生成DH密钥为例 */
26import { huks } from '@kit.UniversalKeystoreKit';
27
28/* 1.确定密钥别名 */
29let keyAlias = 'dh_key';
30/* 2.初始化密钥属性集 */
31let properties1: Array<huks.HuksParam> = [
32  {
33    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
34    value: huks.HuksKeyAlg.HUKS_ALG_DH
35  },
36  {
37    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
38    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE
39  },
40  {
41    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
42    value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048
43  }
44];
45let huksOptions: huks.HuksOptions = {
46  properties: properties1,
47  inData: new Uint8Array(new Array())
48}
49
50/* 3.生成密钥 */
51function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions) {
52  return new Promise<void>((resolve, reject) => {
53    try {
54      huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {
55        if (error) {
56          reject(error);
57        } else {
58          resolve(data);
59        }
60      });
61    } catch (error) {
62      throw (error as Error);
63    }
64  });
65}
66
67async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
68  console.info(`enter promise generateKeyItem`);
69  try {
70    await generateKeyItem(keyAlias, huksOptions)
71      .then((data) => {
72        console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);
73      })
74      .catch((error: Error) => {
75        console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);
76      });
77  } catch (error) {
78    console.error(`promise: generateKeyItem input arg invalid, ` + JSON.stringify(error));
79  }
80}
81
82async function TestGenKey() {
83  await publicGenKeyFunc(keyAlias, huksOptions);
84}
85```
86