博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js 使用 RSA 做加密
阅读量:6293 次
发布时间:2019-06-22

本文共 1718 字,大约阅读时间需要 5 分钟。

RSA

RSA加密算法是一种非对称加密算法。

假设 A 与 B 通信。A 和 B 都提供一个公开的公钥。A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密。B 接收到这串密文后,用自己的私钥解密,用 A 提供的公钥验签。

为什么要先签名后加密?如果你先加密后签名,非法用户通过获取的公钥就可以破解签名,破解之后就可以替换签名。

详细的原理可以参考以下文档:

node-rsa

在 node.js 中使用 rsa 算法,我们使用的是 这个包。

const NodeRSA = require('node-rsa');const a_public_key_data = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----';const a_private_key_data = '-----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----';const b_public_key_data = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----';const b_private_key_data = '-----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----';// 生成 A 的公私钥对象const a_public_key = new NodeRSA(a_public_key_data);const a_private_key = new NodeRSA(a_private_key_data);// 生成 B 的公私钥对象const a_public_key = new NodeRSA(a_public_key_data);const a_private_key = new NodeRSA(a_private_key_data);const text = 'Hello RSA!';// 加签并加密const sign = a_private_key.sign(text, 'base64', 'utf8');console.log('A 私钥加签:', sign);const encrypted = a_public_key.encrypt(sign, 'base64');console.log('B 公钥加密:', encrypted);// 解密并验签const decrypted = a_public_key.decrypt(encrypted, 'utf8');console.log('B 私钥解密:', decrypted);const verify = a_public_key.verify(text, decrypted, 'utf8', 'base64');console.log('A 公钥验签:', verify);

serialize

接口传递的一般是复杂的对象,所以我们需要把对象按一定的顺序排列并序列化成字符串再进行签名加密的操作

const serialize = (obj) => {  const str = [];  Object.keys(obj).sort().forEach((key) => {    if (obj.hasOwnProperty(key)) {      str.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));    }  });  return str.join('&');};

注意

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

博客首发地址:

转载于:https://www.cnblogs.com/chaohangz/p/9824811.html

你可能感兴趣的文章
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>