# 使用PBKDF2进行密钥派生 å¯¹åº”çš„ç®—æ³•è§„æ ¼è¯·æŸ¥çœ‹[å¯†é’¥æ´¾ç”Ÿç®—æ³•è§„æ ¼ï¼šPBKDF2](crypto-key-derivation-overview.md#pbkdf2算法)。 ## 开呿¥éª¤ 1. æž„é€ [PBKDF2Spec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#pbkdf2spec11)å¯¹è±¡ï¼Œä½œä¸ºå¯†é’¥æ´¾ç”Ÿå‚æ•°è¿›è¡Œå¯†é’¥æ´¾ç”Ÿã€‚ PBKDF2Spec是[KdfSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#kdfspec11)çš„åç±»ï¼Œéœ€è¦æŒ‡å®šï¼š - algName:指定算法'PBKDF2'。 - passwordï¼šç”¨äºŽç”Ÿæˆæ´¾ç”Ÿå¯†é’¥çš„原始密ç 。 如果使用string类型,需è¦ç›´æŽ¥ä¼ 入用于密钥派生的数æ®ï¼Œè€Œä¸æ˜¯HexStringã€base64ç‰å—ç¬¦ä¸²ç±»åž‹ã€‚åŒæ—¶éœ€è¦ç¡®ä¿è¯¥å—符串为utf-8ç¼–ç ,å¦åˆ™æ´¾ç”Ÿç»“果会有差异。 - salt:ç›å€¼ã€‚ - iterations:é‡å¤è¿ç®—的次数,需è¦ä¸ºæ£æ•´æ•°ã€‚ - keySizeï¼šç›®æ ‡å¯†é’¥çš„å—节长度,需è¦ä¸ºæ£æ•´æ•°ã€‚ 2. 调用[cryptoFramework.createKdf](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatekdf11),指定å—ç¬¦ä¸²å‚æ•°'PBKDF2|SHA256',创建密钥派生算法为PBKDF2ã€HMAC函数摘è¦ç®—法为SHA256的密钥派生函数对象(Kdf)。 3. 输入PBKDF2Spec对象,调用[Kdf.generateSecret](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesecret-2)进行密钥派生。 Kdf.generateSecret的多ç§è°ƒç”¨å½¢å¼å¦‚表所示。 | 接å£å | è¿”å›žæ–¹å¼ | | -------- | -------- | | generateSecret(params: KdfSpec, callback: AsyncCallback<DataBlob>): void | callback异æ¥ç”Ÿæˆ | | generateSecret(params: KdfSpec): Promise<DataBlob> | Promise异æ¥ç”Ÿæˆ | | generateSecretSync(params: KdfSpec): DataBlob | åŒæ¥ç”Ÿæˆ | - 通过await返回结果: ```ts import { cryptoFramework } from '@kit.CryptoArchitectureKit'; async function kdfAwait() { let spec: cryptoFramework.PBKDF2Spec = { algName: 'PBKDF2', password: '123456', salt: new Uint8Array(16), iterations: 10000, keySize: 32 }; let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); let secret = await kdf.generateSecret(spec); console.info("key derivation output is " + secret.data); } ``` - 通过Promise返回结果: ```ts import { cryptoFramework } from '@kit.CryptoArchitectureKit'; import { BusinessError } from '@kit.BasicServicesKit'; function kdfPromise() { let spec: cryptoFramework.PBKDF2Spec = { algName: 'PBKDF2', password: '123456', salt: new Uint8Array(16), iterations: 10000, keySize: 32 }; let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); let kdfPromise = kdf.generateSecret(spec); kdfPromise.then((secret) => { console.info("key derivation output is " + secret.data); }).catch((error: BusinessError) => { console.error("key derivation error."); }); } ``` - é€šè¿‡åŒæ¥æ–¹å¼è¿”回结果: ```ts import { cryptoFramework } from '@kit.CryptoArchitectureKit'; import { BusinessError } from '@kit.BasicServicesKit'; function kdfSync() { let spec: cryptoFramework.PBKDF2Spec = { algName: 'PBKDF2', password: '123456', salt: new Uint8Array(16), iterations: 10000, keySize: 32 }; let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); let secret = kdf.generateSecretSync(spec); console.info("[Sync]key derivation output is " + secret.data); } ```