浅析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 复制或插入Html的实现方法小结
May 19 Javascript
javascript去掉前后空格的实例
Nov 07 Javascript
JavaScript中Cookie操作实例
Jan 09 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
Feb 21 Javascript
微信小程序获取微信运动步数的实例代码
Jul 20 Javascript
vue 子组件向父组件传值方法
Feb 26 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
Vue.js更改调试地址端口号的实例
Sep 19 Javascript
自己动手封装一个React Native多级联动
Sep 19 Javascript
详解如何提升JSON.stringify()的性能
Jun 12 Javascript
AutoJs实现刷宝短视频的思路详解
May 22 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的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
php验证session无效的解决方法
2014/11/04 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
Python正则表达式分组概念与用法详解
2017/06/24 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
销售简历自我评价
2014/01/24 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
数学系毕业生求职信
2014/05/29 职场文书
技术股东合作协议书
2014/12/02 职场文书
外贸英文求职信范文
2015/03/19 职场文书
人力资源部工作计划
2019/05/14 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers