项目中在用户登陆时须要进行用户名和密码加密,这里选用了RSA非对称加密的方式.javascript
linux生成公钥私钥命令:前端
genrsa -out rsa_private_key.pem 1024 // 生成1024位私钥 pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt // 把RSA私钥转换成PKCS8格式 rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem // 生成对应公钥
这里已经生成了公钥和私钥,公钥私钥的使用能够分为两种方式java
fs.readFileSync()
来读取\n\
来确保格式正确)这个库能够使用模块加载的方式使用,下面的代码也是使用这种方式,固然也能够在页面中经过<script>
标签引入,这种方式的使用请参考库的具体文档linux
const JSEncrypt = require("jsencrypt"); // 引入模块 const str = "i will be encrypto"; const encrypt = new JSEncrypt.JSEncrypt(); // 实例化加密对象 encrypt.setPublicKey(publicKey); // 设置公钥 const encryptoPasswd = encrypt.encrypt(str) // 加密明文
解密函数实现npm
function rsaDecrypt(text) { const privateKey = config.privateKey; let textBuffer, decryptText; try { textBuffer= new Buffer(text, "base64"); // jsencrypt 库在加密后使用了base64编码,因此这里要先将base64编码后的密文转成buffer decryptText= crypto.privateDecrypt({ key: new Buffer(privateKey), // 若是经过文件方式读入就没必要转成Buffer padding: constants.RSA_PKCS1_PADDING // 由于前端加密库使用的RSA_PKCS1_PADDING标准填充,因此这里也要使用RSA_PKCS1_PADDING }, textBuffer).toString(); } catch (err) { throw (new CommonError("errorMsg", errorCode)); } return decryptText; }