gpt4 book ai didi

javascript - 如何将 Web 加密 key 导出到 jsrsasign

转载 作者:行者123 更新时间:2023-11-28 13:20:19 33 4
gpt4 key购买 nike

我尝试使用 Web Crypto 生成 RSA key 并用它来签署 jsrsasign 的字符串(Firefox does not support RSA-PSS)。因此,我导出 Web Crypto key 并将其转换为 PKCS8-PEM,但是当我调用 KEYUTIL.getKeyFromPlainPrivatePKCS8PEM 时将 key 导入 jsrsasign 会引发错误:格式错误的普通 PKCS8 私钥(代码:001)

我做错了什么? JSBin

window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"},
},
true,
["encrypt", "decrypt"]
)
.then(keyPair => window.crypto.subtle.exportKey("pkcs8", keyPair.privateKey))
.then(arrayBufferToBase64String)
.then(toPem)
.then(pem => {
var rsa = KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(pem); // throws: malformed plain PKCS8 private key(code:001)
var sig = rsa.signStringPSS('text', 'sha256', 32);
console.log('signature', sig);
})
.catch(::console.error)

function arrayBufferToString(arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer)
var byteString = '';
for (var i=0; i<byteArray.byteLength; i++) {
byteString += String.fromCharCode(byteArray[i]);
}
return byteString;
}

function arrayBufferToBase64String(arrayBuffer) {
return btoa(arrayBufferToString(arrayBuffer));
}

function toPem(key) {
return `
-----BEGIN RSA PRIVATE KEY-----
${key}
-----END RSA PRIVATE KEY-----
`;
}

编辑:

我刚刚意识到 jsrsasign 可以处理jwk:

window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"},
},
true,
["encrypt", "decrypt"]
)
.then(keyPair => window.crypto.subtle.exportKey("jwk", keyPair.privateKey))
.then(jwk => {
var rsa = KEYUTIL.getKey(jwk);
var sig = rsa.signStringPSS('text', 'sha256', 32);
console.log('signature', sig);
})
.catch(::console.error)

我更喜欢这个解决方案,但我仍然想知道为什么我的 pkcs8 解决方案不起作用。

最佳答案

将 PEM header 从 "----BEGIN RSA PRIVATE KEY-----" 更改为 "-----BEGIN PRIVATE KEY-- 不起作用---" 因为内容不同。我认为使用 JWK 进行文件导出是最好的方法,因为它在任何浏览器之间都具有很强的互操作性。我之前尝试过同样的操作,但是 PKCS#8 在某些浏览器上不起作用。

正如 Felix 所描述的,您的 RSA key 是一个 PKCS#1 key ,其中包含 "-----BEGIN RSA PRIVATE KEY----- “ PEM header 。

如果您需要将 PKCS#1 转换为 PKCS#8 key KEYUTIL 类可能会很有用,如下例所示:

keyobj = KEYUTIL.getKey("-----BEGIN RSA PRIVATE KEY-----..."); // your key
pkcs8pem = KEYUTIL.getPEM(keyobj, "PKCS8PRV");

关于javascript - 如何将 Web 加密 key 导出到 jsrsasign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33739022/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com