浅析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 相关文章推荐
Autocomplete Textbox Example javascript实现自动完成成功
Aug 17 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
Sep 28 Javascript
node.js中的fs.unlink方法使用说明
Dec 15 Javascript
jquery+html5制作超酷的圆盘时钟表
Apr 14 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
功能强大的jquery.validate表单验证插件
Nov 07 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
Apr 12 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
JavaScript类的继承操作实例总结
Dec 20 Javascript
Vue对象赋值视图不更新问题及解决方法
Jun 03 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数据库操作面向对象的优点
2006/10/09 PHP
PHP 基本语法格式
2009/12/15 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
资料员岗位职责
2013/11/17 职场文书
青蓝工程实施方案
2014/03/27 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
供用电专业求职信
2014/07/07 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
缅怀先烈主题班会
2015/08/14 职场文书