浅析Node.js非对称加密方法


Posted in Javascript onJanuary 29, 2018

前言

刚回答了SegmentFault上一个兄弟提的问题《非对称解密出错》。这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下。

非对称加密的理论知识,可以参考笔者前面的文章《NODEJS进阶:CRYPTO模块之理论篇》。

完整的代码可以在 《Nodejs学习笔记》 找到,也欢迎大家关注 程序猿小卡的GitHub。

加密、解密方法

在Node.js中,负责安全的模块是crypto。非对称加密中,公钥加密,私钥解密,加解密对应的API分别如下。

加密函数:

crypto.publicEncrypt(key, buffer)

解密函数:

crypto.privateDecrypt(privateKey, buffer)

入门例子

假设有如下utils.js

// utils.js
const crypto = require('crypto');
// 加密方法
exports.encrypt = (data, key) => {
 // 注意,第二个参数是Buffer类型
 return crypto.publicEncrypt(key, Buffer.from(data));
};
// 解密方法
exports.decrypt = (encrypted, key) => {
 // 注意,encrypted是Buffer类型
 return crypto.privateDecrypt(key, encrypted);
};

测试代码app.js:

const utils = require('./utils');
const keys = require('./keys');
const plainText = '你好,我是程序猿小卡';
const crypted = utils.encrypt(plainText, keys.pubKey); // 加密
const decrypted = utils.decrypt(crypted, keys.privKey); // 解密
console.log(decrypted.toString()); // 你好,我是程序猿小卡

附上公钥、私钥 keys.js:

exports.privKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8ZECKnnO8XRDwttBbf5EmG0qV
8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kAZ6CZZo1vYgtzhlFnxd4V7Ra+
aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEjeogAOgXACaIqiFyrk3wIDAQAB
AoGBAKdrunYlqfY2fNUVAqAAdnvaVOxqa+psw4g/d3iNzjJhBRTLwDl2TZUXImEZ
QeEFueqVhoROTa/xVg/r3tshiD/QC71EfmPVBjBQJJIvJUbjtZJ/O+L2WxqzSvqe
wzYaTm6Te3kZeG/cULNMIL+xU7XsUmslbGPAurYmHA1jNKFpAkEA48aUogSv8VFn
R2QuYmilz20LkCzffK2aq2+9iSz1ZjCvo+iuFt71Y3+etWomzcZCuJ5sn0w7lcSx
nqyzCFDspQJBAN3O2VdQF3gua0Q5VHmK9AvsoXLmCfRa1RiKuFOtrtC609RfX4DC
FxDxH09UVu/8Hmdau8t6OFExcBriIYJQwDMCQQCZLjFDDHfuiFo2js8K62mnJ6SB
H0xlIrND2+/RUuTuBov4ZUC+rM7GTUtEodDazhyM4C4Yq0HfJNp25Zm5XALpAkBG
atLpO04YI3R+dkzxQUH1PyyKU6m5X9TjM7cNKcikD4wMkjK5p+S2xjYQc1AeZEYq
vc187dJPRIi4oC3PN1+tAkBuW51/5vBj+zmd73mVcTt28OmSKOX6kU29F0lvEh8I
oHiLOo285vG5ZtmXiY58tAiPVQXa7eU8hPQHTHWa9qp6
-----END RSA PRIVATE KEY-----
`;
exports.pubKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8
ZECKnnO8XRDwttBbf5EmG0qV8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kA
Z6CZZo1vYgtzhlFnxd4V7Ra+aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEje
ogAOgXACaIqiFyrk3wIDAQAB
-----END PUBLIC KEY-----
`;
Javascript 相关文章推荐
javascript OFFICE控件测试代码
Dec 08 Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 Javascript
js关闭父窗口时关闭子窗口
Apr 01 Javascript
jquery如何把数组变为字符串传到服务端并处理
Apr 30 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
angularjs数组判断是否含有某个元素的实例
Feb 27 Javascript
vue使用jsonp抓取qq音乐数据的方法
Jun 21 Javascript
koa上传excel文件并解析的实现方法
Aug 09 Javascript
vue-cli3配置与跨域处理方法
Aug 17 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
Sep 28 Javascript
JavaScript实现栈结构Stack过程详解
Mar 07 Javascript
360doc网站不登录就无法复制内容的解决方法
Jan 27 #Javascript
使用Vue写一个datepicker的示例
Jan 27 #Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
Jan 27 #Javascript
浅谈React中组件间抽象
Jan 27 #Javascript
React Native中NavigatorIOS组件的简单使用详解
Jan 27 #Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 #Javascript
使用D3.js创建物流地图的示例代码
Jan 27 #Javascript
You might like
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
javascript 回调函数详解
2014/11/11 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
如何高效率的查找一个月以内的数据
2012/04/15 面试题
交通法规咨询中心工作职责
2013/11/27 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
企业文化建设实施方案
2014/03/22 职场文书
伊琍体标语
2014/06/25 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
教师节获奖感言
2015/07/31 职场文书
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL
在 Python 中利用 Pool 进行多线程
2022/04/24 Python