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-----\n'
text += base64.replace(/[^\x00-\xff]/g, '$&\x01').replace(/.{64}\x01?/g, '$&\n')
text += '\n-----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
})