浅析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 相关文章推荐
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
node.js开机自启动脚本文件
Dec 24 Javascript
javascript 兼容各个浏览器的事件
Feb 04 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
漫谈JS引擎的运行机制 你应该知道什么
Jun 15 Javascript
Angular.js中用ng-repeat-start实现自定义显示
Oct 18 Javascript
Javascript 普通函数和构造函数的区别
Nov 05 Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
May 12 Javascript
Vue组件通信实践记录(推荐)
Aug 15 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
实现两个文本框同时输入的实例
2017/09/25 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Flask之flask-session的具体使用
2018/07/26 Python
django框架自定义用户表操作示例
2018/08/07 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
python中wheel的用法整理
2020/06/15 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
函数指针的定义是什么
2016/08/14 面试题
创业计划书模版
2014/02/05 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
电工技术比武方案
2014/05/11 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
尝试使用Python爬取城市租房信息
2022/04/12 Python