• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用PBKDF2进行密钥派生(ArkTS)
2
3<!--Kit: Crypto Architecture Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @zxz--3-->
6<!--Designer: @lanming-->
7<!--Tester: @PAFT-->
8<!--Adviser: @zengyawen-->
9
10对应的算法规格请查看[密钥派生算法规格:PBKDF2](crypto-key-derivation-overview.md#pbkdf2算法)。
11
12## 开发步骤
13
141. 构造[PBKDF2Spec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#pbkdf2spec11)对象,作为密钥派生参数进行密钥派生。
15
16   PBKDF2Spec是[KdfSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#kdfspec11)的子类,需要指定:
17
18   - algName:指定算法'PBKDF2'。
19   - password:用于生成派生密钥的原始密码。
20      如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型。同时需要确保该字符串为utf-8编码,否则派生结果会有差异。
21   - salt:盐值。
22   - iterations:重复运算的次数,需要为正整数。
23   - keySize:目标密钥的字节长度,需要为正整数。
24
252. 调用[cryptoFramework.createKdf](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatekdf11),指定字符串参数'PBKDF2|SHA256',创建密钥派生算法为PBKDF2、HMAC函数摘要算法为SHA256的密钥派生函数对象(Kdf)。
26
273. 输入PBKDF2Spec对象,调用[Kdf.generateSecret](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesecret11)进行密钥派生。
28
29   Kdf.generateSecret的多种调用形式如表所示。
30
31   | 接口名 | 返回方式 |
32   | -------- | -------- |
33   | generateSecret(params: KdfSpec, callback: AsyncCallback&lt;DataBlob&gt;): void | callback异步生成。 |
34   | generateSecret(params: KdfSpec): Promise&lt;DataBlob&gt; | Promise异步生成。 |
35   | generateSecretSync(params: KdfSpec): DataBlob | 同步生成。 |
36
37- 通过await返回结果:
38
39  ```ts
40  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
41
42  async function kdfAwait() {
43    let spec: cryptoFramework.PBKDF2Spec = {
44      algName: 'PBKDF2',
45      password: '123456',
46      salt: new Uint8Array(16),
47      iterations: 10000,
48      keySize: 32
49    };
50    let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
51    let secret = await kdf.generateSecret(spec);
52    console.info("key derivation output is " + secret.data);
53  }
54  ```
55
56- 通过Promise返回结果:
57
58  ```ts
59  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
60  import { BusinessError } from '@kit.BasicServicesKit';
61
62  function kdfPromise() {
63    let spec: cryptoFramework.PBKDF2Spec = {
64      algName: 'PBKDF2',
65      password: '123456',
66      salt: new Uint8Array(16),
67      iterations: 10000,
68      keySize: 32
69    };
70    let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
71    let kdfPromise = kdf.generateSecret(spec);
72    kdfPromise.then((secret) => {
73      console.info("key derivation output is " + secret.data);
74    }).catch((error: BusinessError) => {
75      console.error("key derivation error.");
76    });
77  }
78  ```
79
80- 通过同步方式返回结果:
81
82  ```ts
83  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
84  import { BusinessError } from '@kit.BasicServicesKit';
85
86  function kdfSync() {
87    let spec: cryptoFramework.PBKDF2Spec = {
88      algName: 'PBKDF2',
89      password: '123456',
90      salt: new Uint8Array(16),
91      iterations: 10000,
92      keySize: 32
93    };
94    let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
95    let secret = kdf.generateSecretSync(spec);
96    console.info("[Sync]key derivation output is " + secret.data);
97  }
98  ```
99