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<DataBlob>): void | callback异步生成。 | 34 | generateSecret(params: KdfSpec): Promise<DataBlob> | 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