跳到主要内容

使用X963KDF进行密钥派生(ArkTS)

从API version 22开始,算法库支持使用该算法进行密钥派生操作。

对应的算法规格请查看密钥派生算法规格:X963KDF

开发步骤

  1. 构造X963KdfSpec对象,作为密钥派生参数进行密钥派生。

    X963KdfSpec是KdfSpec的子类,需要指定:

    • algName:指定算法'X963Kdf'。

    • key:原始密钥材料。

      如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型。同时需要确保该字符串为utf-8编码,否则派生结果会有差异。

    • info:可选的上下文与应用相关信息,可为空,用于拓展短密钥。

    • keySize:目标密钥的字节长度,需要为正整数。

  2. 调用cryptoFramework.createKdf,指定字符串参数'X963KDF|SHA256',创建密钥派生算法为X963KDF、HMAC函数摘要算法为SHA256的密钥派生函数对象(Kdf)。

  3. 输入X963KdfSpec对象,调用Kdf.generateSecret进行密钥派生。

    Kdf.generateSecret的多种调用形式如表所示。

    接口名返回方式
    generateSecret(params: KdfSpec, callback: AsyncCallback<DataBlob>): voidcallback异步生成。
    generateSecret(params: KdfSpec): Promise<DataBlob>Promise异步生成。
    generateSecretSync(params: KdfSpec): DataBlob同步生成。
  • 通过await返回结果:

    import { cryptoFramework } from '@kit.CryptoArchitectureKit';
    import { buffer } from '@kit.ArkTS';

    async function kdfAwait() {
    let keyData = new Uint8Array(buffer.from('012345678901234567890123456789', 'utf-8').buffer);
    let infoData = new Uint8Array(buffer.from('infostring', 'utf-8').buffer);
    let spec: cryptoFramework.X963KdfSpec = {
    algName: 'X963KDF',
    key: keyData,
    info: infoData,
    keySize: 32
    };
    let kdf = cryptoFramework.createKdf('X963KDF|SHA256');
    let secret = await kdf.generateSecret(spec);
    console.info('key derivation output: ' + secret.data);
    }
  • 通过Promise返回结果:

    import { cryptoFramework } from '@kit.CryptoArchitectureKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    import { buffer } from '@kit.ArkTS';

    function kdfPromise() {
    let keyData = new Uint8Array(buffer.from('012345678901234567890123456789', 'utf-8').buffer);
    let infoData = new Uint8Array(buffer.from('infostring', 'utf-8').buffer);
    let spec: cryptoFramework.X963KdfSpec = {
    algName: 'X963KDF',
    key: keyData,
    info: infoData,
    keySize: 32
    };
    let kdf = cryptoFramework.createKdf('X963KDF|SHA256');
    let kdfPromise = kdf.generateSecret(spec);
    kdfPromise.then((secret) => {
    console.info('key derivation output: ' + secret.data);
    }).catch((error: BusinessError) => {
    console.error(`key derivation failed: errCode: ${error.code}, message: ${error.message}`);
    });
    }
  • 通过同步方式返回结果:

    import { cryptoFramework } from '@kit.CryptoArchitectureKit';
    import { buffer } from '@kit.ArkTS';

    function kdfSync() {
    let keyData = new Uint8Array(buffer.from('012345678901234567890123456789', 'utf-8').buffer);
    let infoData = new Uint8Array(buffer.from('infostring', 'utf-8').buffer);
    let spec: cryptoFramework.X963KdfSpec = {
    algName: 'X963KDF',
    key: keyData,
    info: infoData,
    keySize: 32
    };
    let kdf = cryptoFramework.createKdf('X963KDF|SHA256');
    let secret = kdf.generateSecretSync(spec);
    console.info('[Sync]key derivation output: ' + secret.data);
    }