HarmonyOS鸿蒙Next中如何使用密钥库huks生成sm2密钥对

HarmonyOS鸿蒙Next中如何使用密钥库huks生成sm2密钥对 希望能有Demo提供密钥库huks生成sm2密钥对的代码案例。避免因为使用的ConvertX509ToECPublicKey方法不支持SM2格式导致的密钥长度问题。

密钥库(HUKS)生成SM2密钥对,导出公钥(x509)是92字节,后端无法通过ConvertX509ToECPublicKey来提取公钥,提示长度不对。但用加解密算法框架生成的sm2公钥长度91字节,是可以提取的

APP需要使用密钥库生成sm2密钥,对数据进行签名,然后把sm2公钥传送给服务端,服务端使用公钥进行验签,但服务端解析公钥失败。

3 回复

huks生成的密钥是不可见的,是由别名替代。

获取公钥的方法是:

let pubKey = x509Cert.getPublicKey();

x509是证书,可以参考证书开发指导中提取公钥的方法exportKeyItem。参考代码如下:

public static CreateKeyTest() {
    let keyAlias = "sm2KeyTest"

    //================option============================//
    let properties: Array<huks.HuksParam> = new Array();

    properties[0] = {
        tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
        value: huks.HuksKeyAlg.HUKS_ALG_SM2
    };
    properties[1] = {
        tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
        value: huks.HuksKeySize.HUKS_SM2_KEY_SIZE_256
    };
    properties[2] = {
        tag: huks.HuksTag.HUKS_TAG_PURPOSE,
        value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY
    };

    let options: huks.HuksOptions = {
        properties: properties
    }

//================option============================//

    huks.generateKeyItem(keyAlias, options, (error, data) => {
        if (!error) {
            huks.exportKeyItem(keyAlias, options).then((data) => {
                let huksPubKey = data.outData as Uint8Array;
                let base64 = new util.Base64Helper();
                let result = base64.encodeToStringSync(huksPubKey);
            })
        }
    });
)

如果出现通过加密库框架生成的公钥和密钥库导出的公钥长度不一致的问题,可能是由于加解密算法框架生成秘钥是ECC格式、秘钥库生成的秘钥是SM2格式导致的,例如ConvertX509ToECPublicKey方法是不支持SM2格式的,此时可以通过直接使用加密算法框架,或者将秘钥库生成的秘钥格式转成ECC的来解决该问题。

更多关于HarmonyOS鸿蒙Next中如何使用密钥库huks生成sm2密钥对的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用密钥库HUKS生成SM2密钥对可以通过以下步骤实现:

  1. 引入HUKS库:首先在代码中引入HUKS库,确保可以使用HUKS提供的API。

  2. 初始化HUKS:调用Huks.init()方法初始化HUKS库。

  3. 配置密钥参数:使用Huks.HuksOptions结构体配置生成SM2密钥对的参数。需要设置Huks.HUKS_TAG_ALGORITHMHuks.HUKS_ALG_SM2,并指定其他相关参数如密钥用途、密钥大小等。

  4. 生成密钥对:调用Huks.generateKey()方法,传入配置好的参数,生成SM2密钥对。

  5. 处理生成结果:检查生成结果,确保密钥对生成成功。

示例代码如下:

import huks from '@ohos.security.huks';

let keyAlias = 'my_sm2_key';
let properties = new Array();
properties[0] = {
    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
    value: huks.HuksKeyAlg.HUKS_ALG_SM2
};
properties[1] = {
    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN
};
properties[2] = {
    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
    value: huks.HuksKeySize.HUKS_SM2_KEY_SIZE_256
};
properties[3] = {
    tag: huks.HuksTag.HUKS_TAG_DIGEST,
    value: huks.HuksKeyDigest.HUKS_DIGEST_SM3
};

let options = {
    properties: properties
};

huks.generateKey(keyAlias, options, function (err, data) {
    if (err) {
        console.error(`Failed to generate SM2 key pair, error code: ${err.code}, message: ${err.message}`);
    } else {
        console.info('SM2 key pair generated successfully');
    }
});

以上代码展示了如何在HarmonyOS鸿蒙Next中使用HUKS生成SM2密钥对。

在HarmonyOS鸿蒙Next中,使用HUKS(HarmonyOS Universal KeyStore)生成SM2密钥对的步骤如下:

  1. 初始化HUKS:首先,调用Huks.init()初始化HUKS服务。
  2. 配置密钥参数:使用Huks.HuksKeyProperties设置密钥属性,指定算法为Huks.HuksKeyAlg.HUKS_ALG_SM2
  3. 生成密钥对:调用Huks.generateKey()方法,传入配置好的参数,生成SM2密钥对。
  4. 处理结果:检查生成结果,确保密钥对生成成功。

示例代码:

Huks.HuksKeyProperties keyProperties = new Huks.HuksKeyProperties();
keyProperties.setAlg(Huks.HuksKeyAlg.HUKS_ALG_SM2);
Huks.generateKey(keyProperties, new Huks.HuksCallback() {
    @Override
    public void onResult(int resultCode, Huks.HuksKey key) {
        if (resultCode == Huks.HUKS_SUCCESS) {
            // 密钥对生成成功
        }
    }
});

确保在AndroidManifest.xml中声明必要的权限。

回到顶部