JavaScript生成RSA非对称秘钥
通过JavaScript生成RSA有两种方法。
非对称密钥的核心原理是:将生成的公钥发送给后端,同时使用私钥将信息数据加密后发送给后端。后端使用传送的公钥进行解密,获取数据。
window.crypto.subtle.generateKey()
window.crypto.subtle.generateKey(
{
name: 'RSA-OAEP', // 密钥加密算法
modulusLength: 2048, // RSA模数长度 can be 1024, 2048, or 4096
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: { name: 'SHA-256' } // 要使用的摘要函数的名称的DOMString 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((key) => {
window.crypto.subtle.exportKey( // exportKey方法,导出密钥
'pkcs8', // 导出键的类型,'pkcs8'指的是RSA/椭圆曲线私钥
key.privateKey // 要导出的密钥
).then((keydata1) => {
window.crypto.subtle.exportKey(
'spki',
key.publicKey
).then((keydata2) => {
const privateKey = RSA2text(keydata1, 1)
const publicKey = RSA2text(keydata2)
resolve({ privateKey, publicKey })
console.log(keydata1, keydata2)
}).catch((err) => {
console.error(err)
reject(err)
})
}).catch((err) => {
console.error(err)
reject(err)
})
}).catch((err) => {
console.error(err)
reject(err)
})
function RSA2text (buffer, isPrivate = 0) {
var binary = ''
var bytes = new Uint8Array(buffer)
var len = bytes.byteLength
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i])
}
var base64 = window.btoa(binary)
var text = '-----BEGIN ' + (isPrivate ? 'PRIVATE' : 'PUBLIC') + ' KEY-----
'
text += base64.replace(/[^x00-xff]/g, '$&x01').replace(/.{64}x01?/g, '$&
')
text += '
-----END ' + (isPrivate ? 'PRIVATE' : 'PUBLIC') + ' KEY-----'
return text
}
注意,该方法需要在安全上下文中才能使用。
※ 安全上下文:https请求下
node-rsa
// 使用node-rsa
const key = new NodeRSA({b: 2048}).generateKeyPair()
key.setOptions({signingScheme: 'pkcs1-sha256'})
const publicKey = RSA2text(key.exportKey('pkcs8-public-der')) // 公钥
const privateKey = RSA2text(key.exportKey('pkcs8-private-der'), 1) // 私钥
resolve({
privateKey: privateKey,
publicKey: publicKey
})