浅析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 相关文章推荐
jquery tools 系列 scrollable(2)
Sep 06 Javascript
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
javascript权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
AngularJS单选框及多选框实现双向动态绑定
Jan 13 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
Aug 24 Javascript
利用JavaScript的Map提升性能的方法详解
Aug 14 Javascript
js实现中文实时时钟
Jan 15 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
cmd下运行php脚本
2008/11/25 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
layer.prompt输入层的例子
2019/09/24 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python3处理HTTP请求的实例
2018/05/10 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Python 一句话生成字母表的方法
2019/01/02 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
深入学习python多线程与GIL
2019/08/26 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
投标人廉洁自律承诺书
2014/05/26 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
员工工作自我评价
2014/09/26 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
Django如何与Ajax交互
2021/04/29 Python
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP