HarmonyOS鸿蒙Next密钥库huks生成的sm2密钥场景下,获取签名所需userid值的方法

HarmonyOS鸿蒙Next密钥库huks生成的sm2密钥场景下,获取签名所需userid值的方法 密钥库huks生成的sm2密钥,对数据进行签名所使用的userid值是什么

由于密钥库huks生成的sm2密钥算法是"sm2"而非"ECC",导致无法在另一端通过sm2的公钥对数据进行验签,考虑到huks的底层算法库为openssl,于是在另一端使用openssl 3.0+对数据进行验签,但验签结果为false,猜想原因可能是huks签名所采用的userid不一致。

openssl验证过程

  1. huks生成sm2密钥并导出公钥(base64文件pubkey.pem)
  2. 将签名值(二进制文件sign.txt)与原数据(file.txt)分析放入txt文件中
  3. openssl命令行验签:“openssl dgst -verify pubkey.pem -sm3 -signature sign.txt file.txt”

更多关于HarmonyOS鸿蒙Next密钥库huks生成的sm2密钥场景下,获取签名所需userid值的方法的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

该场景下可用如下方案实现:

1、先对消息生成摘要

openssl dgst -sm3 plain.bin

2、然后用类似的代码进行验签,如果openssl返回了1就是验签成功

void verifySignature(void)

{

uint8_t pubkey[] = {

0x30, 0x5A, 0x30, 0x14, 0x06, 0x08, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x2D, 0x06, 0x08,

0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x2D, 0x03, 0x42, 0x00, 0x04, 0x77, 0x58, 0x36, 0x91,

0x2E, 0x19, 0x5E, 0x0A, 0xD0, 0x5A, 0xA1, 0x17, 0x51, 0x5E, 0x1F, 0x18, 0xB9, 0xF8, 0xB3, 0xCB,

0xD3, 0xAE, 0xE6, 0x73, 0x9D, 0x6B, 0xAC, 0xE9, 0x08, 0xAB, 0x47, 0x2C, 0xDF, 0x2C, 0x6F, 0x3D,

0x85, 0x04, 0x12, 0x13, 0xB0, 0x9F, 0x2D, 0x03, 0xCE, 0xEE, 0x86, 0xBB, 0x12, 0xEB, 0x7F, 0x08,

0x48, 0x96, 0xB1, 0xDC, 0xF8, 0xD0, 0xD8, 0xDC, 0xAA, 0x42, 0x9B, 0x20,

};

uint8_t *pubkeyPointer = pubkey;

EVP_PKEY *evpPkey = d2i_PUBKEY(NULL, &pubkeyPointer, sizeof(pubkey));

LOGI("evpPkey %p sz %d", evpPkey, pubkeyPointer - pubkey);

EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(evpPkey, NULL);

EVP_PKEY_verify_init(ctx);

EVP_PKEY_CTX_set_signature_md(ctx, EVP_sm3());

uint8_t sig[] = {

0x30, 0x46,

0x02, 0x21, 0x00,

0x9E, 0x2C, 0xA7, 0xF2, 0x4E, 0x80, 0x54, 0x9D, 0xE7, 0x9D, 0x1B, 0x97, 0x38, 0x0E, 0x88, 0xEA,

0x09, 0xE1, 0x46, 0x50, 0x27, 0x88, 0xD5, 0x1C, 0xB9, 0xCC, 0xED, 0x7D, 0x43, 0x32, 0x50, 0x3C,

0x02, 0x21, 0x00,

0x81, 0x15, 0x61, 0xD7, 0x9A, 0xEE, 0x20, 0x3C, 0x4D, 0x92, 0x41, 0xBF, 0xD5, 0x8B, 0x38, 0x7C,

0x24, 0x91, 0x3A, 0x11, 0x18, 0x15, 0x58, 0xCD, 0xC1, 0x99, 0x18, 0x28, 0xBF, 0x8A, 0x0B, 0x73,

};

uint8_t plainDigest[] = {

0x15, 0x9C, 0xA3, 0xD6, 0x6A, 0x79, 0x7D, 0xD5, 0xF5, 0x90, 0x5A, 0x9F, 0x87, 0x19, 0xBD, 0x41,

0x21, 0xE7, 0x26, 0xEA, 0xB8, 0x83, 0x7F, 0x29, 0x64, 0x09, 0x3C, 0xA5, 0x19, 0xB3, 0x9F, 0x54,

};

int ret = EVP_PKEY_verify(ctx, sig, sizeof(sig), plainDigest, sizeof(plainDigest));

LOGI("ret = 0x%x", ret);

}

更多关于HarmonyOS鸿蒙Next密钥库huks生成的sm2密钥场景下,获取签名所需userid值的方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用HUKS(HarmonyOS Universal KeyStore)生成的SM2密钥进行签名时,获取签名所需的userid值可以通过以下步骤实现:

  1. HUKS密钥生成:首先使用HUKS生成SM2密钥对。生成密钥时,HUKS会返回一个密钥句柄(keyAlias),用于后续操作。

  2. 构建签名参数:使用HuksParam结构体来构建签名所需的参数。SM2签名需要指定HUKS_TAG_ALGORITHMHUKS_ALG_SM2,并设置HUKS_TAG_PURPOSEHUKS_KEY_PURPOSE_SIGN

  3. 设置userid:SM2签名时需要提供userid,这是SM2算法的一部分。可以通过HuksParam中的HUKS_TAG_SM2_USER_ID标签来设置useriduserid通常是一个字符串,长度不超过32字节。

  4. 执行签名操作:调用HuksSign函数进行签名操作,传入密钥句柄、签名参数和待签名的数据。签名过程中会使用到指定的userid

示例代码如下:

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

const keyAlias = 'mySm2KeyAlias';
const userId = '1234567812345678'; // 示例userid

let signOptions = {
    properties: [
        { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_SM2 },
        { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN },
        { tag: huks.HuksTag.HUKS_TAG_SM2_USER_ID, value: userId }
    ]
};

let signData = 'data to be signed';

huks.sign(keyAlias, signOptions, signData, (err, data) => {
    if (err) {
        console.error(`Error: ${err.code}, message: ${err.message}`);
    } else {
        console.info('Signature successful');
    }
});

以上代码展示了如何在HarmonyOS鸿蒙Next中使用HUKS生成的SM2密钥进行签名,并指定useriduserid值通过HUKS_TAG_SM2_USER_ID标签设置,并在签名操作中使用。

在HarmonyOS鸿蒙Next中,使用HUKS(HarmonyOS Universal KeyStore)生成SM2密钥时,获取签名所需的userid值可以通过以下步骤实现:

  1. 定义userid:SM2签名通常需要指定userid,这是一个标识用户的字符串,常见值为“1234567812345678”。

  2. 调用HUKS接口:在使用HUKS进行签名操作时,将userid作为参数传递给签名函数。例如,调用HuksSign接口时,将userid包含在options参数中。

  3. 示例代码

    HuksOptions options = {
        .userid = "1234567812345678",
        .useridLen = 16
    };
    int ret = HuksSign(&handle, &options, &signature);
    

确保userid与密钥生成时使用的值一致,以保证签名验证的正确性。

回到顶部