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验证过程
- huks生成sm2密钥并导出公钥(base64文件pubkey.pem)
- 将签名值(二进制文件sign.txt)与原数据(file.txt)分析放入txt文件中
- 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
该场景下可用如下方案实现:
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
值可以通过以下步骤实现:
-
HUKS密钥生成:首先使用HUKS生成SM2密钥对。生成密钥时,HUKS会返回一个密钥句柄(
keyAlias
),用于后续操作。 -
构建签名参数:使用
HuksParam
结构体来构建签名所需的参数。SM2签名需要指定HUKS_TAG_ALGORITHM
为HUKS_ALG_SM2
,并设置HUKS_TAG_PURPOSE
为HUKS_KEY_PURPOSE_SIGN
。 -
设置userid:SM2签名时需要提供
userid
,这是SM2算法的一部分。可以通过HuksParam
中的HUKS_TAG_SM2_USER_ID
标签来设置userid
。userid
通常是一个字符串,长度不超过32字节。 -
执行签名操作:调用
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密钥进行签名,并指定userid
。userid
值通过HUKS_TAG_SM2_USER_ID
标签设置,并在签名操作中使用。
在HarmonyOS鸿蒙Next中,使用HUKS(HarmonyOS Universal KeyStore)生成SM2密钥时,获取签名所需的userid
值可以通过以下步骤实现:
-
定义
userid
:SM2签名通常需要指定userid
,这是一个标识用户的字符串,常见值为“1234567812345678”。 -
调用HUKS接口:在使用HUKS进行签名操作时,将
userid
作为参数传递给签名函数。例如,调用HuksSign
接口时,将userid
包含在options
参数中。 -
示例代码:
HuksOptions options = { .userid = "1234567812345678", .useridLen = 16 }; int ret = HuksSign(&handle, &options, &signature);
确保userid
与密钥生成时使用的值一致,以保证签名验证的正确性。