網上找了一圈node.js的RSA解密方法,多數是在同一端進行加密和解密,但是我要的需求是前端加密,發給后台解密。起初前端Vue項目使用jsencrypt插件對數據進行加密,然后傻傻的去后台也npm安裝jsencrypt , 以為用它在后端解密就行, 但是一引用就會報錯,它不是一個后端插件,所以不要在后端用裝這個。node.js自帶有加密模塊crypto,但是嘗試了很多次用crypto解密前端發過來的數據都報錯了:Error: error:0406506C:rsa routines:rsa_ossl_private_decrypt:data greater than mod len。最后實在是沒有辦法,在npm上搜到了一個用於后台的加解密插件能夠成功解密。后來對JS模塊化有一點了解之后理解了為什么會報錯(我是一個前端小白)
### 1.前端插件:jsencrypt
- 安裝
npm install jsencrypt
import { JSEncrypt } from 'jsencrypt'
-
關於密鑰格式
前端的公鑰我直接賦值的,用記事本打開 pub.pem公鑰文件直接復制的,粘貼到代碼里會有語法錯誤,我把每一行都加上了引號,行與行之間用加號連接。
"-----BEGIN RSA PRIVATE KEY-----"
+"MIICXAIBAAKBgQC0ujuQTkK10GVRk/V/QkavO25DLgsiL22l6QCtCO7+2MVLlZON"
+"Qj9d5AgAgmSqqfO0ZNbq6yde1zyXR5Mligq1CU+qNj72mJ6Bk7cz/gWFOcz8bGpK"
.......后面省略
2.node.js后端插件:node-jsencrypt
- 安裝
npm install --save node-jsencrypt
const JSEncrypt = require('node-jsencrypt')
-
用法:與jsencrypt用法完全相同
-
關於密鑰格式:后端我是用fs讀取私鑰文件。
// 設置私鑰
const prvKey = fs.readFileSync('../openssl/rsa-prv.pem').toString() // 路徑自己決定,用toString()轉換成字符串,不轉會報錯
let jsencrypt = new JSEncrypt()
jsencrypt.setPrivateKey(prvKey)
// 解密數據
let dec_by_prv = jsencrypt.decrypt(前台數據);