浅析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 相关文章推荐
使用正则替换变量
May 05 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
Apr 24 Javascript
javascript常用代码段搜集
Dec 04 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
jQuery实现文字自动横移
Jan 08 Javascript
vue移动UI框架滑动加载数据的方法
Mar 12 Javascript
轻松解决JavaScript定时器越走越快的问题
May 13 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
谈谈JavaScript中的函数
Sep 08 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 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构造函数实例讲解
2013/11/13 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
如何使用php实现评委评分器
2015/07/31 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python迭代器与生成器详解
2016/03/10 Python
Python中的字符串替换操作示例
2016/06/27 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
欢迎领导检查标语
2014/06/27 职场文书
捐助感谢信
2015/01/22 职场文书
研究生个人学年总结
2015/02/14 职场文书
工程催款通知书
2015/04/17 职场文书
幼儿园教师辞职信
2019/06/21 职场文书