浅析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 相关文章推荐
JS 文字符串转换unicode编码函数
May 30 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
Aug 02 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
Jun 26 Javascript
JavaScript基础知识学习笔记
Dec 02 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
Jun 01 Javascript
关于javascript的一些知识以及循环详解
Sep 12 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
Sep 14 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
Mar 10 Javascript
react+antd 递归实现树状目录操作
Nov 02 Javascript
分享15个Webpack实用的插件!!!
Mar 31 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php实现图片缩略图的方法
2016/03/29 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python中subprocess批量执行linux命令
2018/04/27 Python
python3 拼接字符串的7种方法
2018/09/12 Python
python redis 删除key脚本的实例
2019/02/19 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
工作的心得体会
2013/12/31 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
盲山观后感
2015/06/11 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
Python中tqdm的使用和例子
2022/09/23 Python