rsa php前台加密后台解密源码,使用RSA实现前端公钥加密后端私钥解密

项目中在用户登录时需要进行用户名和密码加密,这里选用了RSA非对称加密的方式.

公钥私钥:OpenSSL的公钥私钥(Node crypto模块限制)

前端: jsencrypt库加密

后端: Node crypto模块

使用openssl生成公钥私钥

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 // 生成对应公钥

这里已经生成了公钥和私钥,公钥私钥的使用可以分为两种方式

在使用时使用fs.readFileSync()来读取

直接将公私钥拷贝出来放到配置文件中(私钥要保证正确的换行格式,否则crypto不能正确的使用私钥,可以在每行末尾添加\n\来确保格式正确)

前端使用jsencrypt库加密

这个库可以使用模块加载的方式使用,下面的代码也是使用这种方式,当然也可以在页面中通过

const JSEncrypt = require("jsencrypt"); // 引入模块

const str = "i will be encrypto";

const encrypt = new JSEncrypt.JSEncrypt(); // 实例化加密对象

encrypt.setPublicKey(publicKey); // 设置公钥

const encryptoPasswd = encrypt.encrypt(str) // 加密明文

服务端使用Node crypto模块解密

解密函数实现

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值