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。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这里给您提供一个简单的web端RSA签名验签工具的实现思路。 1. 前端页面 我们可以用HTML和JavaScript来实现这个工具的前端页面。具体来说,我们需要一个输入框让用户输入待签名或待验签的数据,另一个输入框让用户输入私钥公钥,以及两个按钮分别用于签名验签操作。代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>RSA签名验签工具</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.12/jsrsasign-all-min.js"></script> </head> <body> <h1>RSA签名验签工具</h1> <form> <label for="data">待签名/待验签数据:</label> <input type="text" id="data"><br><br> <label for="key">私钥/公钥:</label> <textarea id="key" rows="5" cols="40"></textarea><br><br> <button type="button" onclick="sign()">签名</button> <button type="button" onclick="verify()">验签</button> </form> <div id="result"></div> <script src="rsa.js"></script> </body> </html> ``` 其中,我们引入了jsrsasign库,这是一个JS实现的RSA加密库,可以方便地进行RSA签名验签操作。 2. JS实现 我们需要在前端编写一个JS文件来实现签名验签操作。代码如下: ```javascript function sign() { var data = document.getElementById("data").value; var key = document.getElementById("key").value; var rsa = new RSAKey(); rsa.readPrivateKeyFromPEMString(key); var sig = rsa.signString(data, "sha256"); document.getElementById("result").textContent = sig; } function verify() { var data = document.getElementById("data").value; var key = document.getElementById("key").value; var rsa = new RSAKey(); rsa.readPublicKeyFromPEMString(key); var sig = document.getElementById("result").textContent; var verified = rsa.verifyString(data, sig); if (verified) { document.getElementById("result").textContent = "验签成功"; } else { document.getElementById("result").textContent = "验签失败"; } } ``` 这里我们定义了两个函数:`sign()`和`verify()`,分别用于签名验签操作。`sign()`函数首先从输入框中获取待签名数据和私钥,然后调用RSAKey对象的`readPrivateKeyFromPEMString()`方法读取私钥,接着调用`signString()`方法对待签名数据进行签名,最后将签名结果显示在页面上。`verify()`函数类似,从输入框中获取待验签数据和公钥,然后调用RSAKey对象的`readPublicKeyFromPEMString()`方法读取公钥,接着从页面中获取签名结果,并调用`verifyString()`方法进行验签操作,最后将验签结果显示在页面上。 3. 后端支持 由于RSA签名验签需要使用私钥公钥,而这些密钥通常是保存在后端服务器上的,所以我们还需要在后端编写一些代码来支持这个工具。具体来说,我们可以使用Node.js和Express框架来搭建一个简单的后端服务器,然后在服务器上生成密钥对,并将公钥传回给前端页面。代码如下: ```javascript const express = require('express'); const app = express(); const fs = require('fs'); const path = require('path'); const https = require('https'); const { RSAKey } = require('jsrsasign'); const privateKey = fs.readFileSync(path.join(__dirname, 'private.pem'), 'utf8'); const publicKey = fs.readFileSync(path.join(__dirname, 'public.pem'), 'utf8'); app.get('/', (req, res) => { const html = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf8'); res.send(html.replace('%PUBLIC_KEY%', publicKey)); }); https.createServer({ key: privateKey, cert: fs.readFileSync(path.join(__dirname, 'cert.pem'), 'utf8') }, app).listen(3000, () => { console.log('Server started on port 3000'); }); function generateKeyPair() { const rsa = new RSAKey(); rsa.generate(2048, '10001'); const privatePem = rsa.getPrivateKey(); const publicPem = rsa.getPublicKey(); fs.writeFileSync(path.join(__dirname, 'private.pem'), privatePem, 'utf8'); fs.writeFileSync(path.join(__dirname, 'public.pem'), publicPem, 'utf8'); } ``` 这里我们使用了Node.js的内置模块fs和path来读取密钥文件,使用了Express框架搭建了一个简单的Web服务器,并且使用了https模块来支持HTTPS协议。在服务器启动时,我们调用了`generateKeyPair()`函数来生成密钥对并保存到文件中,然后在处理GET请求时,将公钥传回给前端页面。 4. 使用方法 使用这个工具非常简单,只需要按照以下步骤操作即可: - 在终端中运行`node app.js`启动服务器; - 在浏览器中访问`https://localhost:3000`打开前端页面; - 在输入框中输入待签名/验签数据; - 在另一个输入框中输入私钥/公钥; - 点击“签名”按钮或“验签”按钮,即可得到签名结果或验签结果。 注意:由于我们使用了自签名证书,所以在访问页面时可能会遇到“不安全连接”的提示,这时需要手动信任证书才能继续使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值