node.js之基础加密算法模块crypto详解


Posted in Javascript onSeptember 11, 2018

crypto作为nodeJS已经稳定下来的模块在整个node中具有举足轻重的地位,一切app都需要加密解密,那么crypto就是一个提供加密功能的模块。在这个模块中已经打包了OpenSSL hash, HMAC(哈希信息验证码),cipher(加密),decipher(解密),sign(签名)以及verify(验证)的功能。

加密算法crypto

我很难想象在php里面md5加密只是三个字符的一个方法而已,在node.js中没封装前竟然那么长!!

无法反编译的加密方式

话不多说直接上代码品鉴吧

onst crypto = require('crypto');
function l(param) {
  console.log(param);
}
const md5 = crypto.createHash('md5');//创建一个md5 hash算法
md5.update('aa');//添加要转化的值
md5.update('cc');//与前面的要转化的值进行拼接
l(md5.digest('hex'));//打印16进制的密文,
const sha1 = crypto.createHash('sha1');//创建一个sh1 hash算法
sha1.update('bbbb');
l(sha1.digest('hex'));
const hmac = crypto.createHmac('md5', 'key');//创建一个带秘钥的sha1或者md5算法
hmac.update('aacc');
l(hmac.digest('hex'));

最后的输出为

aa794f68b4f6ae5e590e9ed34e94d639
8aed1322e5450badb078e1fb60a817a1df25a2ca
b03d8471e2c5f212289c3e2dcb95bd47

真真的输出了一堆16进制的字符但是简单生成个密文看来是很麻烦了。

一般用于密码的存储和登录注册之类的业务

可以反编译的加密算法

//AES 对称加密算法的一种。
//创建加密算法
function aesEncode(data, key) {
  const cipher = crypto.createCipher('aes192', key);
  var crypted = cipher.update(data, 'utf8', 'hex');
  crypted += cipher.final('hex');
  return crypted;
}
//创建解密算法
function aesDecode(encrypted, key) {
  const decipher = crypto.createDecipher('aes192', key);
  var decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}
var data = '我是一个大傻瓜';
var key = 'keykey';
l(aesEncode(data, key));
l(data);
l(aesDecode(aesEncode(data, key), key));

最终输出

3094e920cf4208e9cf1b209d4be9a2f018541c70db89b4e4fdcf3bda12d3abc7
我是一个大傻瓜
我是一个大傻瓜

这个的话感觉可以用于一般的密文通信。

DH协商秘钥算法

在http下真叫别人抓包了,所有的信息就泄露了,就算是你用密文通信,开始需要个key来解码呀,这个key不可能用意念传输还是需要来通过网络传输才行,所以还是又被黑的可能性,于是乎就产生了一个神奇的秘钥算法,两台机器之间只需要传递几个值便可以相互知道最终的秘钥,而就算是这些传递的值被抓走了,也无法破译最终秘钥因为关键的几个值只存储于终端上不在传输流通。

好了上代码

//DH算法协商秘钥
/**
 * 主动方使用的协商方法
 * @returns array():say是要传达给被动方的三个数据 one是自己要用的一个数据
 */
function dhOneSay() {
  var one = crypto.createDiffieHellman(512);
  var one_key = one.generateKeys();
  var prime = one.getPrime();
  var generator = one.getGenerator();
  var say = {
    prime: prime, generator: generator, one_key: one_key
  };

  return [say, one];
}
/**
 * 被动方使用的协商方法已经可以得到秘钥
 * @param {prime: prime, generator: generoter, one_key: one_key} props 
 * @returns array() two_key是要返回给主动方的秘数,theSecret是计算出来的秘钥
 */
function dhTwoGetSay(props) {
  var two = crypto.createDiffieHellman(props.prime, props.generator);
  var two_key = two.generateKeys();
  var theSecret = (two.computeSecret(props.one_key)).toString('hex');
  return [ two_key, theSecret ];
}
/**
 * 主动方收到被动方给予的秘钥后
 * @param str two_key 被动方返回的密数
 * @param str one 主动方最初的随机数
 * @returns str 计算出来的秘钥
 */
function dhOneGet(two_key,one){
return (one.computeSecret(two_key)).toString('hex');
}
//主动方自己产生数据
var oneSay=dhOneSay();
//被动方接受主动方传过来的数据进行计算,产生握手数据和最终的秘钥
var twoGetSay=dhTwoGetSay(oneSay[0]);
//主动方接收到被动方传来的数据进行计算得到最终秘钥
var oneSecret=dhOneGet(twoGetSay[0],oneSay[1]);
//被动方的秘钥早已产生了直接读取
var twoSecret=twoGetSay[1];
l(oneSay);
l(twoGetSay);
l(oneSecret);
l(twoSecret);

最终结果是

[ { prime: <Buffer ca 7c 9c 21 0d 90 68 4e 69 0b 49 c0 77 0c 4e aa de 92 91 a7 ac 50 17 a4 c2 26 1c 9f a2 32 e0 8c 76 88 de d6 f0 83 5c cd f7 eb 3a 8a 51 49 70 11 93 d3 ... >,
    generator: <Buffer 02>,
    one_key: <Buffer 20 75 74 5d 50 6b 32 59 19 68 87 36 a3 0e 6e a8 6b db 2f c5 48 5d 21 9c 35 3b 3d ce 15 fe b0 65 2d ea e0 b3 49 80 34 33 f5 f9 c4 5b 77 bd bb f9 fe 31 ... > },
  DiffieHellman { _handle: { verifyError: 0 }, verifyError: 0 } ]
[ <Buffer 47 46 86 88 b9 49 5f 6e 52 2a 26 9b c7 ce 5b d3 17 23 fa fa 6c 6d d1 9a 73 aa 8a e7 1a 16 7b 78 d5 40 85 00 da 29 8b 52 0e d5 a4 cb 37 72 49 e5 c5 26 ... >,
  '91de86d30fae396603a64ef3f38f24f82d7d505c5f546f6c6ef2d14d7e77c2511744d76f8b26ff15d2870090620cd7339987806cc0b8519f39eb7b1fa63a0e7b' ]
91de86d30fae396603a64ef3f38f24f82d7d505c5f546f6c6ef2d14d7e77c2511744d76f8b26ff15d2870090620cd7339987806cc0b8519f39eb7b1fa63a0e7b
91de86d30fae396603a64ef3f38f24f82d7d505c5f546f6c6ef2d14d7e77c2511744d76f8b26ff15d2870090620cd7339987806cc0b8519f39eb7b1fa63a0e7b

便可以发现最后两个秘钥的值是完全一样的(每次运行所产生的秘钥都是不同的,只要秘钥相同便说明对应得上),这样为了强化数据交互的安全性每次进行重要数据传输之前就可以先进行一次协商秘钥过程(可以协商完保存起来也可以每次都协商一遍),然后把协商出来的秘钥取固定位数为key进行aes加密解密就会安全多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习笔记(十三)Dom创建表格
Jan 21 Javascript
java、javascript实现附件下载示例
Aug 14 Javascript
jquery中push()的用法(数组添加元素)
Nov 25 Javascript
JavaScript返回0-1之间随机数的方法
Apr 06 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
Sep 16 Javascript
javascript函数自动执行常用方法汇总
Mar 28 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
May 11 Javascript
详解Angular Reactive Form 表单验证
Jul 06 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
深入解析koa之异步回调处理
Jun 17 Javascript
vue引用外部JS的两种种方法
Jan 28 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 #Javascript
浅谈Webpack核心模块tapable解析
Sep 11 #Javascript
原生js检测页面加载完毕的实例
Sep 11 #Javascript
vue props传值失败 输出undefined的解决方法
Sep 11 #Javascript
解决vue props 拿不到值的问题
Sep 11 #Javascript
vue首次赋值不触发watch的解决方法
Sep 11 #Javascript
JavaScript中Array方法你该知道的正确打开方法
Sep 11 #Javascript
You might like
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
优秀应届毕业生推荐信
2014/02/18 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
冰峪沟导游词
2015/02/09 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript