浅析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 相关文章推荐
从Ajax到JQuery Ajax学习
Feb 14 Javascript
通过jQuery源码学习javascript(三)
Dec 27 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
Mar 25 Javascript
js中的json对象详细介绍
Oct 29 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
浅谈JavaScript的事件
Feb 27 Javascript
使用JavaScript实现连续滚动字幕效果的方法
Jul 07 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
Node 自动化部署的方法
Oct 17 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
Jun 13 Javascript
vue如何实现自定义底部菜单栏
Jul 01 Javascript
JS实现简单的九宫格抽奖
Jun 28 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
nodejs 如何手动实现服务器
2018/08/20 NodeJs
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
python3实现逐字输出的方法
2019/01/23 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
python如何停止递归
2020/09/09 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
最经典的商业地产项目广告词
2014/03/13 职场文书
工商干部先进事迹
2014/05/14 职场文书
保护环境倡议书100字
2014/05/19 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
赢在中国观后感
2015/06/02 职场文书
MySQL 数据类型详情
2021/11/11 MySQL