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

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加密解密就会安全多了。

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

(0)

相关推荐

  • nodejs中各种加密算法的实现详解

    前言 在大前端的趋势下,前端er也要懂点数据加密相关的知识才行,加密算法的实现和原理我们可以不用深究,毕竟加密是一门高深的学科,但是基本的加密方式和编码还是要掌握的,毕竟没吃过猪肉,猪跑还是见过的嘛. 我对常见的几种加密和签名的算法做个归纳,同时附上 nodejs 的编码实现. 加密算法 为了保证数据的安全性和防篡改,很多数据在传输中都进行了加密.举个场景的栗子,最近很多网站都升级到 https 协议, https 协议就是使用了非对称加密和hash签名,还有 github 使用的 ssh ,也

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

    crypto作为nodeJS已经稳定下来的模块在整个node中具有举足轻重的地位,一切app都需要加密解密,那么crypto就是一个提供加密功能的模块.在这个模块中已经打包了OpenSSL hash, HMAC(哈希信息验证码),cipher(加密),decipher(解密),sign(签名)以及verify(验证)的功能. 加密算法crypto 我很难想象在php里面md5加密只是三个字符的一个方法而已,在node.js中没封装前竟然那么长!! 无法反编译的加密方式 话不多说直接上代码品鉴吧

  • Node.js中路径处理模块path详解

    前言 在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了.下面我们就来详细介绍下关于Node.js中的路径处理模块path. 获取路径/文件名/扩展名 获取路径:path.dirname(filepath) 获取文件名:path.basename(filepath) 获取扩展名:path.extname(filepath) 获取所在路径 例子如下: var path = re

  • Node.js 条形码识别程序构建思路详解

    在这篇文章中,我们将展示一个非常简单的方法构建一个自定义的 Node 模块,该模块封装了Dynamsoft Barcode Reader SDK ,支持 Windows.Linux 和 OS X,同时我们将演示如何集成这块模块实现一个在线的条形码读取应用. 越来越多的 Web 开发者选择 Node 来构建网站,因为使用 JavaScript 来开发复杂的服务器端 Web 应用越来越便利.为了扩展在不同平台下的 Node 的功能,Node 允许开发者使用 C/C++ 来创建扩展. 介绍 Dynam

  • Node.Js中实现端口重用原理详解

    本文介绍了Node.Js中实现端口重用原理详解,分享给大家,具体如下: 起源,从官方实例中看多进程共用端口 const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); for (let i =

  • Node.js完整实现博客系统详解

    目录 一.项目功能说明 二.最终效果 三.文件目录结构说明 四.项目技术栈 五.核心技术 1. 使用Schema定义数据模型 2. mongoose 的操作 3. mogodb数据库的操作 4. 使用第三方插件 express-session:存取数据状态 5. 挂载路由 6. 使用md5对密码进行加密 六.遇到的问题 七.github链接 一.项目功能说明 登录.注册 新建博客 首页显示全部博客 查看博客详情页 查看博客评论区 修改.删除博客 二.最终效果 首页: 登录.注册: 详情页: 评论

  • Node.js 应用探索文件解压缩示例详解

    目录 引言 compressing 解压 压缩 archiver adm-zip 压缩 解压缩 总结 引言 今天在使用 node 脚本对文件处理时,需要实现一个功能,要对一个 zip 压缩包解压出来,修改里面的文件后,重新打包成zip包.node 解压缩文件的场景在实际应用中还是比较常见,下面介绍几个用来解压缩文件的库和使用方法. compressing compressing 是一个使用起来方便.功能非常强大的node库,它可以对文件.文件夹进行解压或压缩,支持tar.gzip.tgz.zip

  • 利用Node.js编写跨平台的spawn语句详解

    前言 Node.js 是跨平台的,也就是说它能运行在 Windows.OSX 和 Linux 平台上.很多 Node.js 开发者都是在 OSX 上做开发的,然后再将代码部署到 Linux 服务器上.由于 OSX 和 Linux 都是基于 Unix 的,因此两者共性很多.Windows 也是 Node.js 官方支持的平台,只要你通过正确的方式写代码,就能在各个平台上毫无压力的跑起来. Node.js 的子进程 (child_process) 模块下有一 spawn 函数,可以用于调用系统上的命

  • 基于Node.js搭建hexo博客过程详解

    一.安装新版本的nodejs和npm 安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 二.安装hexo note: 参考github,不要去其官网 安装Hexo npm install hexo-cli -g Setup your blog hexo init blemesh cd blemesh 安装Cactus主题,众多开源主题中比较简洁的一个: 主题页 Cactus页 git clone https://github.com/probber

  • node+js搭建时间服务器的思路详解

    目录 时间服务器 1.思路准备 1.1思路来源 1.2思路前提要求 1.3技术要求 2.实现 2.1实现准备 2.2搭建前台页面 2.3搭建后台服务器 2.3.1搭建后台 2.3.2后台处理要发送的数据 2.4前端处理获取的数据 2.4.1时间数据 2.4.2天气信息 2.5效果展示 3.总结 时间服务器 时间服务器 1.思路准备 1.1思路来源 这是在我的软件老师给的期末课程设计他要的是通过自己的知识储备,来设计一个前后端数据的展示与发送 1.2思路前提要求 1.搭建一个前台页面,要求简单易懂

  • 利用node.js实现反向代理的方法详解

    本文主要给大家介绍的是关于利用node.js实现反向代理的相关内容,分享出供大家参考学习,下面话不多说,来一起看看详细的介绍: 跨域问题是前端开发很常见的问题解决方案有很多种 jsonp返回 Access-Control-Allow-Origin:'*' (需要注意的是 对于post请求会变成option请求需求后端支持) 前端添加代理 前端添加代理 以vue-cli为例,前端添加代理 dev: { env: require('./dev.env'), port: 8888, autoOpenB

随机推荐