HarmonyOS 鸿蒙Next 这段代码来自官网,用于导入RSA2048密钥对,可一旦修改成仅导入公钥就失败。为何?
HarmonyOS 鸿蒙Next 这段代码来自官网,用于导入RSA2048密钥对,可一旦修改成仅导入公钥就失败。为何?
这段官网代码还特别说明了 【若改为 HUKS_KEY_TYPE_PUBLIC_KEY 时表示仅导入公钥】
可若改成仅导入公钥就报错, 而导入RSA公钥是个很常见的需求。
以下是官网代码。
---------------------------------------------
/* 以下以导入RSA2048密钥的Callback操作使用为例 */
```javascript
import { huks } from '[@kit](/user/kit).UniversalKeystoreKit'
let rsa2048KeyPairMaterial = new Uint8Array([
0x01, 0x00, 0x00, 0x00, // 密钥算法(小端表示)huks.HuksKeyAlg.HUKS_ALG_RSA = 1
0x00, 0x08, 0x00, 0x00, // 密钥大小(比特):2048
0x00, 0x01, 0x00, 0x00, // 模数n长度(字节):256
0x03, 0x00, 0x00, 0x00, // 公钥指数e长度(字节):3
0x00, 0x01, 0x00, 0x00, // 私钥指数d长度(字节):256
// 模数n
0xc5, 0x35, 0x62, 0x48, 0xc4, 0x92, 0x87, 0x73, 0x0d, 0x42, 0x96, 0xfc, 0x7b, 0x11, 0x05, 0x06,
0x0f, 0x8d, 0x66, 0xc1, 0x0e, 0xad, 0x37, 0x44, 0x92, 0x95, 0x2f, 0x6a, 0x55, 0xba, 0xec, 0x1d,
0x54, 0x62, 0x0a, 0x4b, 0xd3, 0xc7, 0x05, 0xe4, 0x07, 0x40, 0xd9, 0xb7, 0xc2, 0x12, 0xcb, 0x9a,
0x90, 0xad, 0xe3, 0x24, 0xe8, 0x5e, 0xa6, 0xf8, 0xd0, 0x6e, 0xbc, 0xd1, 0x69, 0x7f, 0x6b, 0xe4,
0x2b, 0x4e, 0x1a, 0x65, 0xbb, 0x73, 0x88, 0x6b, 0x7c, 0xaf, 0x7e, 0xd0, 0x47, 0x26, 0xeb, 0xa5,
0xbe, 0xd6, 0xe8, 0xee, 0x9c, 0xa5, 0x66, 0xa5, 0xc9, 0xd3, 0x25, 0x13, 0xc4, 0x0e, 0x6c, 0xab,
0x50, 0xb6, 0x50, 0xc9, 0xce, 0x8f, 0x0a, 0x0b, 0xc6, 0x28, 0x69, 0xe9, 0x83, 0x69, 0xde, 0x42,
0x56, 0x79, 0x7f, 0xde, 0x86, 0x24, 0xca, 0xfc, 0xaa, 0xc0, 0xf3, 0xf3, 0x7f, 0x92, 0x8e, 0x8a,
0x12, 0x52, 0xfe, 0x50, 0xb1, 0x5e, 0x8c, 0x01, 0xce, 0xfc, 0x7e, 0xf2, 0x4f, 0x5f, 0x03, 0xfe,
0xa7, 0xcd, 0xa1, 0xfc, 0x94, 0x52, 0x00, 0x8b, 0x9b, 0x7f, 0x09, 0xab, 0xa8, 0xa4, 0xf5, 0xb4,
0xa5, 0xaa, 0xfc, 0x72, 0xeb, 0x17, 0x40, 0xa9, 0xee, 0xbe, 0x8f, 0xc2, 0xd1, 0x80, 0xc2, 0x0d,
0x44, 0xa9, 0x59, 0x44, 0x59, 0x81, 0x3b, 0x5d, 0x4a, 0xde, 0xfb, 0xae, 0x24, 0xfc, 0xa3, 0xd9,
0xbc, 0x57, 0x55, 0xc2, 0x26, 0xbc, 0x19, 0xa7, 0x9a, 0xc5, 0x59, 0xa3, 0xee, 0x5a, 0xef, 0x41,
0x80, 0x7d, 0xf8, 0x5e, 0xc1, 0x1d, 0x32, 0x38, 0x41, 0x5b, 0xb6, 0x92, 0xb8, 0xb7, 0x03, 0x0d,
0x3e, 0x59, 0x0f, 0x1c, 0xb3, 0xe1, 0x2a, 0x95, 0x1a, 0x3b, 0x50, 0x4f, 0xc4, 0x1d, 0xcf, 0x73,
0x7c, 0x14, 0xca, 0xe3, 0x0b, 0xa7, 0xc7, 0x1a, 0x41, 0x4a, 0xee, 0xbe, 0x1f, 0x43, 0xdd, 0xf9,
// 公钥指数e
0x01, 0x00, 0x01,
// 私钥指数d
0x88, 0x4b, 0x82, 0xe7, 0xe3, 0xe3, 0x99, 0x75, 0x6c, 0x9e, 0xaf, 0x17, 0x44, 0x3e, 0xd9, 0x07,
0xfd, 0x4b, 0xae, 0xce, 0x92, 0xc4, 0x28, 0x44, 0x5e, 0x42, 0x79, 0x08, 0xb6, 0xc3, 0x7f, 0x58,
0x2d, 0xef, 0xac, 0x4a, 0x07, 0xcd, 0xaf, 0x46, 0x8f, 0xb4, 0xc4, 0x43, 0xf9, 0xff, 0x5f, 0x74,
0x2d, 0xb5, 0xe0, 0x1c, 0xab, 0xf4, 0x6e, 0xd5, 0xdb, 0xc8, 0x0c, 0xfb, 0x76, 0x3c, 0x38, 0x66,
0xf3, 0x7f, 0x01, 0x43, 0x7a, 0x30, 0x39, 0x02, 0x80, 0xa4, 0x11, 0xb3, 0x04, 0xd9, 0xe3, 0x57,
0x23, 0xf4, 0x07, 0xfc, 0x91, 0x8a, 0xc6, 0xcc, 0xa2, 0x16, 0x29, 0xb3, 0xe5, 0x76, 0x4a, 0xa8,
0x84, 0x19, 0xdc, 0xef, 0xfc, 0xb0, 0x63, 0x33, 0x0b, 0xfa, 0xf6, 0x68, 0x0b, 0x08, 0xea, 0x31,
0x52, 0xee, 0x99, 0xef, 0x43, 0x2a, 0xbe, 0x97, 0xad, 0xb3, 0xb9, 0x66, 0x7a, 0xae, 0xe1, 0x8f,
0x57, 0x86, 0xe5, 0xfe, 0x14, 0x3c, 0x81, 0xd0, 0x64, 0xf8, 0x86, 0x1a, 0x0b, 0x40, 0x58, 0xc9,
0x33, 0x49, 0xb8, 0x99, 0xc6, 0x2e, 0x94, 0x70, 0xee, 0x09, 0x88, 0xe1, 0x5c, 0x4e, 0x6c, 0x22,
0x72, 0xa7, 0x2a, 0x21, 0xdd, 0xd7, 0x1d, 0xfc, 0x63, 0x15, 0x0b, 0xde, 0x06, 0x9c, 0xf3, 0x28,
0xf3, 0xac, 0x4a, 0xa8, 0xb5, 0x50, 0xca, 0x9b, 0xcc, 0x0a, 0x04, 0xfe, 0x3f, 0x98, 0x68, 0x81,
0xac, 0x24, 0x53, 0xea, 0x1f, 0x1c, 0x6e, 0x5e, 0xca, 0xe8, 0x31, 0x0d, 0x08, 0x12, 0xf3, 0x26,
0xf8, 0x5e, 0xeb, 0x10, 0x27, 0xae, 0xaa, 0xc3, 0xad, 0x6c, 0xc1, 0x89, 0xdb, 0x7d, 0x5a, 0x12,
0x55, 0xad, 0x11, 0x19, 0xa1, 0xa9, 0x8f, 0x0b, 0x6d, 0x78, 0x8d, 0x1c, 0xdf, 0xe5, 0x63, 0x82,
0x0b, 0x7d, 0x23, 0x04, 0xb4, 0x75, 0x8c, 0xed, 0x77, 0xfc, 0x1a, 0x85, 0x29, 0x11, 0xe0, 0x61,
]);
/* 1.确定密钥别名 */
let keyAlias = 'RSA_sample';
/* 2.封装密钥属性集和密钥材料 */
let properties: Array<huks.HuksParam> = [
{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_RSA
},
{
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048
},
{
// 此 tag表示密钥导入后的用途,导入后将不可更改
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
},
{
// 此 tag表示需导入的密钥类型
tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE,
// 此 value表示导入密钥对,若改为HUKS_KEY_TYPE_PUBLIC_KEY时表示仅导入公钥
value: huks.HuksImportKeyType.HUKS_KEY_TYPE_KEY_PAIR
},
]
let options: huks.HuksOptions = {
properties: properties,
inData: rsa2048KeyPairMaterial
};
/* 3.明文导入密钥 */
try {
huks.importKeyItem(keyAlias, options, (error, data) => {
if (error) {
console.error(`callback: importKeyItem failed` + error);
} else {
console.info(`callback: importKeyItem success`);
}
});
} catch (error) {
console.error(`callback: importKeyItem input arg invalid` + error);
}
更多关于HarmonyOS 鸿蒙Next 这段代码来自官网,用于导入RSA2048密钥对,可一旦修改成仅导入公钥就失败。为何?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
楼主您好!这个文档里关于 导入密钥格式 有说明,如果导入的是非对称密钥-公钥,导入格式需要是 X.509规范的DER格式,可以参考 公钥材料格式 检查是否是公钥格式问题,另外有具体的报错日志吗?方便的话可以贴下具体的报错日志。
更多关于HarmonyOS 鸿蒙Next 这段代码来自官网,用于导入RSA2048密钥对,可一旦修改成仅导入公钥就失败。为何?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
很遗憾,提问前,我已经试过导入 X.509规范的DER格式了,照样报错。
另外,捕获的 error 信息太简单,没有参考价值。
如果华为单独写段导入RSA公钥的代码就好了。
楼主方便提供一段能复现的代码demo吗?如果公钥涉及敏感信息,可以在工单系统上提单,附上样例demo:
https://developer.huawei.com/consumer/cn/support/feedback/#/ticketCard
function ImportkeyPublic() { let rsa2048KeyPairMaterial = new Uint8Array([ 0x01, 0x00, 0x00, 0x00, // 密钥算法(小端表示)huks.HuksKeyAlg.HUKS_ALG_RSA = 1 0x00, 0x08, 0x00, 0x00, // 密钥大小(比特):2048 0x00, 0x01, 0x00, 0x00, // 模数n长度(字节):256 0x03, 0x00, 0x00, 0x00, // 公钥指数e长度(字节):3 0x00, 0x00, 0x00, 0x00, // 私钥指数d长度(字节):0 // 模数n 0xc5, 0x35, 0x62, 0x48, 0xc4, 0x92, 0x87, 0x73, 0x0d, 0x42, 0x96, 0xfc, 0x7b, 0x11, 0x05, 0x06, 0x0f, 0x8d, 0x66, 0xc1, 0x0e, 0xad, 0x37, 0x44, 0x92, 0x95, 0x2f, 0x6a, 0x55, 0xba, 0xec, 0x1d, 0x54, 0x62, 0x0a, 0x4b, 0xd3, 0xc7, 0x05, 0xe4, 0x07, 0x40, 0xd9, 0xb7, 0xc2, 0x12, 0xcb, 0x9a, 0x90, 0xad, 0xe3, 0x24, 0xe8, 0x5e, 0xa6, 0xf8, 0xd0, 0x6e, 0xbc, 0xd1, 0x69, 0x7f, 0x6b, 0xe4, 0x2b, 0x4e, 0x1a, 0x65, 0xbb, 0x73, 0x88, 0x6b, 0x7c, 0xaf, 0x7e, 0xd0, 0x47, 0x26, 0xeb, 0xa5, 0xbe, 0xd6, 0xe8, 0xee, 0x9c, 0xa5, 0x66, 0xa5, 0xc9, 0xd3, 0x25, 0x13, 0xc4, 0x0e, 0x6c, 0xab, 0x50, 0xb6, 0x50, 0xc9, 0xce, 0x8f, 0x0a, 0x0b, 0xc6, 0x28, 0x69, 0xe9, 0x83, 0x69, 0xde, 0x42, 0x56, 0x79, 0x7f, 0xde, 0x86, 0x24, 0xca, 0xfc, 0xaa, 0xc0, 0xf3, 0xf3, 0x7f, 0x92, 0x8e, 0x8a, 0x12, 0x52, 0xfe, 0x50, 0xb1, 0x5e, 0x8c, 0x01, 0xce, 0xfc, 0x7e, 0xf2, 0x4f, 0x5f, 0x03, 0xfe, 0xa7, 0xcd, 0xa1, 0xfc, 0x94, 0x52, 0x00, 0x8b, 0x9b, 0x7f, 0x09, 0xab, 0xa8, 0xa4, 0xf5, 0xb4, 0xa5, 0xaa, 0xfc, 0x72, 0xeb, 0x17, 0x40, 0xa9, 0xee, 0xbe, 0x8f, 0xc2, 0xd1, 0x80, 0xc2, 0x0d, 0x44, 0xa9, 0x59, 0x44, 0x59, 0x81, 0x3b, 0x5d, 0x4a, 0xde, 0xfb, 0xae, 0x24, 0xfc, 0xa3, 0xd9, 0xbc, 0x57, 0x55, 0xc2, 0x26, 0xbc, 0x19, 0xa7, 0x9a, 0xc5, 0x59, 0xa3, 0xee, 0x5a, 0xef, 0x41, 0x80, 0x7d, 0xf8, 0x5e, 0xc1, 0x1d, 0x32, 0x38, 0x41, 0x5b, 0xb6, 0x92, 0xb8, 0xb7, 0x03, 0x0d, 0x3e, 0x59, 0x0f, 0x1c, 0xb3, 0xe1, 0x2a, 0x95, 0x1a, 0x3b, 0x50, 0x4f, 0xc4, 0x1d, 0xcf, 0x73, 0x7c, 0x14, 0xca, 0xe3, 0x0b, 0xa7, 0xc7, 0x1a, 0x41, 0x4a, 0xee, 0xbe, 0x1f, 0x43, 0xdd, 0xf9, // 公钥指数e 0x01, 0x00, 0x01 // 私钥指数d
]);
console.info(kyz123 num of bytes: ${rsa2048KeyPairMaterial.byteLength}
);
/* 1.确定密钥别名 /
let keyAlias = ‘RSA_sample_Public’;
/ 2.封装密钥属性集和密钥材料 /
let properties: Array<huks.HuksParam> = [
{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_RSA
},
{
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048
},
{
// 此 tag表示密钥导入后的用途,导入后将不可更改
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT
//| huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
},
{
// 此 tag表示需导入的密钥类型
tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE,
// 此 value表示导入密钥对,若改为HUKS_KEY_TYPE_PUBLIC_KEY时表示仅导入公钥
//value: huks.HuksImportKeyType.HUKS_KEY_TYPE_KEY_PAIR
value: huks.HuksImportKeyType.HUKS_KEY_TYPE_PUBLIC_KEY
},
]
let options: huks.HuksOptions = {
properties: properties,
inData: rsa2048KeyPairMaterial
};
/ 3.明文导入密钥 */
try {
huks.importKeyItem(keyAlias, options, (error, data) => {
if (error) {
console.error(kyz123 callback: importKeyItem failed
+ error);
} else {
console.info(kyz123 callback: importKeyItem success
);
}
});
} catch (error) {
console.error(kyz123 callback: importKeyItem input arg invalid
+ error);
}
}
在HarmonyOS(鸿蒙)系统中,如果你尝试修改官方提供的用于导入RSA2048密钥对的代码以仅导入公钥时遇到失败,这通常是因为代码逻辑或API使用不当所致。鸿蒙系统对于密钥管理有其特定的API和要求。
原因可能包括但不限于:
-
API不匹配:鸿蒙的密钥管理API可能要求同时导入私钥和公钥,或者导入公钥的方式与导入密钥对的方式不同。
-
参数设置错误:在修改代码以仅导入公钥时,可能未正确设置相关参数,如密钥格式、算法类型等。
-
权限问题:鸿蒙系统对密钥管理有严格的权限控制,如果未获得必要的权限,可能无法成功导入公钥。
-
代码逻辑错误:在修改代码过程中可能引入了逻辑错误,导致公钥导入失败。
为了解决这个问题,你需要仔细检查并对比官方提供的密钥导入代码与你修改后的代码,确保API使用正确、参数设置无误,并且拥有必要的权限。同时,确认你使用的鸿蒙系统版本与官方文档或示例代码的版本一致。
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html。