node-rsa模塊加密遇到的一些坑


一些說在前面的:

    RSA是一種塊加密的算法,所以對於明文需要將他們分成固定的塊長度,考慮到輸入的數據長度的問題,所以加解密的填充有好幾種:

  1. 無填充,就是直接對明文進行加密

  2. PKCS1。將數據長度分成密鑰長度-11byte,比如密鑰是1024bit,那么長度就是1024/8-11=117bytes,具體的格式:先填0,2,然后隨機生成其他的byte,后面才是真正的數據

  3. PKCS1_OAEP將數據長度分成密鑰長度-41byte,比如密鑰是1024bit,那么長度就是1024/8-41=77bytes,先填0,隨機或者是固定的測試向量加20個bytes,然后加20個數字簽名的數據,最后才是數據

  4. SSLV23,將數據長度分成密鑰長度-11byte,比如密鑰是1024bit,那么長度就是1024/8-11=117bytes,具體的格式:先填0,2,填入8個3,填入一個'\0',最后才是真正的數據。

前端需要將密碼rsa加密后再傳輸給后端,所以需要引入一個較小的庫,所以用了node-rsa
import NodeRSA from 'node-rsa'
RSA_PUBLIC_KEY = ‘公鑰’
function rsaEncrypt (message, key) {
let clientKey = new NodeRSA(RSA_PUBLIC_KEY)
let encrypted = clientKey.encrypt(message, 'base64')
return encrypted
}

  

這么寫是加密出來的結果可能是錯滴~在 node-rsa模塊中加解密默認使用 pkcs1_oaep填充方式 ,而在js中加密解密默認使用的是 pkcs1,在node-rsa中提供了函數可以修改這個選項
function rsaEncrypt (message, key) {
let clientKey = new NodeRSA(RSA_PUBLIC_KEY)
// 在node-rsa模塊中加解密默認使用 pkcs1_oaep ,而在js中加密解密默認使用的是 pkcs1
clientKey.setOptions({encryptionScheme: 'pkcs1'}) //就是新增這一行代碼
let encrypted = clientKey.encrypt(message, 'base64')
return encrypted
}
 

 


免責聲明!

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



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