JavaScript 正在导出 RSA-OAEP public 密钥
JavaScript Exporting RSA-OAEP public key
我正在尝试使用 here 中描述的导出密钥来访问 public 密钥。我有以下代码:
window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048, //can be 1024, 2048, or 4096
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
},
true, //whether the key is extractable (i.e. can be used in exportKey)
["encrypt", "decrypt"] //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
)
.then(function(key){
//returns a keypair object
console.log(key);
console.log(key.publicKey);
console.log(key.privateKey);
window.crypto.subtle.exportKey("spki",key.publicKey)
.then(function(keydata){
//returns the exported key data
console.log(keydata);
document.getElementById("key").innerHTML = String(key.publicKey)
})
.catch(function(err){
console.error(err);
});
})
我想查看 public 密钥,例如将其设置为 HTML 元素,目前 HTML 元素被设置为 [object CryptoKey]。如何直接访问 public 键?
谢谢
编辑:
window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048, //can be 1024, 2048, or 4096
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
},
true, //whether the key is extractable (i.e. can be used in exportKey)
["encrypt", "decrypt"] //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
)
.then(function(key){
//returns a keypair object
console.log(key);
console.log(key.publicKey);
console.log(key.privateKey);
window.crypto.subtle.exportKey("spki",key.publicKey)
.then(function(keydata){
//returns the exported key data
console.log(keydata);
var publicKeyB64 = ab2str(keydata);
document.getElementById("key").innerHTML = publicKeyB64;
})
.catch(function(err){
console.error(err);
});
})
function ab2str( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
keydata
是一个 ArrayBuffer,其中包含导出为 DER 格式的 public 键。由于 DER 是二进制的,因此需要将结果编码为文本,例如使用 base64
选择您喜欢的函数,将 ArrayBuffer 转换为来自 Converting between strings and ArrayBuffers
的字符串
var publicKeyB64 = btoa(ab2str(keydata));
document.getElementById("key").innerHTML = publicKeyB64;
我正在尝试使用 here 中描述的导出密钥来访问 public 密钥。我有以下代码:
window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048, //can be 1024, 2048, or 4096
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
},
true, //whether the key is extractable (i.e. can be used in exportKey)
["encrypt", "decrypt"] //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
)
.then(function(key){
//returns a keypair object
console.log(key);
console.log(key.publicKey);
console.log(key.privateKey);
window.crypto.subtle.exportKey("spki",key.publicKey)
.then(function(keydata){
//returns the exported key data
console.log(keydata);
document.getElementById("key").innerHTML = String(key.publicKey)
})
.catch(function(err){
console.error(err);
});
})
我想查看 public 密钥,例如将其设置为 HTML 元素,目前 HTML 元素被设置为 [object CryptoKey]。如何直接访问 public 键?
谢谢
编辑:
window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048, //can be 1024, 2048, or 4096
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
},
true, //whether the key is extractable (i.e. can be used in exportKey)
["encrypt", "decrypt"] //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
)
.then(function(key){
//returns a keypair object
console.log(key);
console.log(key.publicKey);
console.log(key.privateKey);
window.crypto.subtle.exportKey("spki",key.publicKey)
.then(function(keydata){
//returns the exported key data
console.log(keydata);
var publicKeyB64 = ab2str(keydata);
document.getElementById("key").innerHTML = publicKeyB64;
})
.catch(function(err){
console.error(err);
});
})
function ab2str( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
keydata
是一个 ArrayBuffer,其中包含导出为 DER 格式的 public 键。由于 DER 是二进制的,因此需要将结果编码为文本,例如使用 base64
选择您喜欢的函数,将 ArrayBuffer 转换为来自 Converting between strings and ArrayBuffers
的字符串var publicKeyB64 = btoa(ab2str(keydata));
document.getElementById("key").innerHTML = publicKeyB64;