网上找了一圈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上搜到了一个用于后台的加解密插件能够成功解密。
1.前端插件:jsencrypt
- 安装
npm install jsencryptimport { 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-jsencryptconst 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(前台数据);