JavaScript生成RSA非對稱秘鑰


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
})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM