Node-RSA 生成公私钥对、私钥签名、公钥验签

RSA加密算法是一种非对称加密算法。
假设 A 与 B 通信。A 和 B 都提供一个公开的公钥。A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密。B 接收到这串密文后,用自己的私钥解密,用 A 提供的公钥验签。
为什么要先签名后加密?如果你先加密后签名,非法用户通过获取的公钥就可以破解签名,破解之后就可以替换签名。

const NodeRSA = require(“node-rsa”);
const crypto = require(“crypto”);
const key = new NodeRSA({ b: 2048 }); //生成2048位的密钥
var publicDer = key.exportKey(“pkcs1-public-pem”); //公钥
var privateDer = key.exportKey(“pkcs1-private-pem”);//私钥
console.log(“公钥:”, publicDer);
console.log(“私钥:”, privateDer);
const text = “Hello RSA!”;
//导入私钥
//key.importKey(privateDer, “pkcs1-private-pem”);
// 加签并加密
const sign = key.sign(text, “base64”, “utf8”);
console.log(“A 私钥加签:”, sign);
const encrypted = key.encrypt(sign, “base64”);
console.log(“B 公钥加密:”, encrypted);
// 解密并验签
const decrypted = key.decrypt(encrypted, “utf8”);
console.log(“C 私钥解密:”, decrypted);
const verify = key.verify(text, decrypted, “utf8”, “base64”);
console.log(“D 公钥验签:”, verify);
// 加密
const crypto_encrypted = crypto.publicEncrypt(publicDer, Buffer.from(text)).toString(“base64”);
console.log(“E 公钥加密:”, crypto_encrypted);
// 解密
var crypto_decrypted = crypto.privateDecrypt({
key: privateDer,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
},
Buffer.from(crypto_encrypted, “base64”)
).toString(“utf8”);
console.log(“F 私钥解密:”, crypto_decrypted);
const decrypted2 = key.decrypt(crypto_encrypted, “utf8”);
console.log(“G 私钥解密:”, decrypted2);

注意:
RSA 算法有一定的计算量,加上 Node.js 不适合做计算密集型的操作。当接口被频繁调用可能会占用主线程,阻塞其他接口,使用了 RSA 的接口并发量会下降十倍左右。如非必要,谨慎在 Node.js 里使用 RSA。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值