rsa加密

Posted by Leo on 2022-03-10
Estimated Reading Time 1 Minutes
Words 470 In Total
Viewed Times

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

  • 公钥私钥:OpenSSL 的公钥私钥(Node crypto 模块限制)
  • 前端: jsencrypt 库加密
  • 后端: Node crypto 模块

使用 openssl 生成公钥私钥

linux 生成公钥私钥命令:

1
2
3
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 库加密

这个库可以使用模块加载的方式使用,下面的代码也是使用这种方式,当然也可以在页面中通过<script>标签引入,这种方式的使用请参考库的具体文档

1
2
3
4
5
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 模块解密

解密函数实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !