浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议
node.js的crypto在0.8版本,这个模块的主要功能是加密解密。
node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术,
这是因为OpenSSL已经是一个广泛被采用的加密算法。它包括了类似MD5 or SHA-1 算法,这些算法你可以利用在你的应用中。
作为工程师,对于openssl一个开源的软件库,你没有用过,你应该听过这个名字。openssl是使用C/C++实现算法的。
Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口,这样用起来方便,运行速度也快。
同步文章:http://www.mwcxs.top/page/421.html,欢迎访问交流学习社区,社区源码在github上:https://github.com/saucxs/nodeJSBlog,欢迎fork和start。
以下你可以看到内容:
一、首先看一下hash算法
二、HMAC算法
三、加密算法知识
四、SSL协议
一、首先看一下hash算法
1.1创建hash实例
通过crypto.createHash()函数,,创建一个hash实例,但是需要调用md5,sha1,sha256,sha512算法来实现实例的创建。
const hash = crypto.createHash('md5');
这样带有md5加密算法的hash实例创建成功。可以把md5换成sha1护着其他的。
MD5是最常用的,但是他有一定的碰撞的问题,你可以使用更新的sha1算法。
1.2加密数据
通过hash.update('需要机密的字符串')函数,实现加密。
hash.update('需要加密的字符串');
这样数据就加密好了,但是我怎么看到我加密的数据。
注意:hash.update()方法是有记忆功能的,实际就是将字符串相加
1.3获取hash对象
可以通过hash.digest()函数实现字符串加密返回。
hash.digest()
直接运行 hash.digest(); 出现了乱码,因为它默认返回的是2进制的数据;
所以使用的是
hash.digest('hex');
这样就可以以16进制的形式显示出来
md5.digest();这个方法被调用了,hash 对象就被清空了是不能被重用的。
2、md5加密的栗子
const crypto = require('crypto');
const hash = crypto.createHash('md5'); hash.update('HEllo World');
hash.update('hhhhhhh'); console.log(hash.digest('hex'));
使用node index.js方式运行,因为crypto需要用到nodeJS的核心模块。(注:crypto.js是我们自己编写的js文件)
输出结果:
28210daaea2a2a4dcc6d29f775671854
3、md5的update()函数由记忆功能
以下是crypto.js代码:
const crypto = require('crypto');
const hash = crypto.createHash('md5'); hash.update('HEllo Worldhhhhhhh'); console.log(hash.digest('hex'));
运行,结果一样:
4、sha1的加密算法
const crypto = require('crypto');
const hash = crypto.createHash('sha1'); hash.update('HEllo Worldhhhhhhh'); console.log(hash.digest('hex'));
输出结果:
f67592206f0fe61cb3123cabf8d9dbe160a7f54a
5、sha256的加密算法
const crypto = require('crypto');
const hash = crypto.createHash('sha256'); hash.update('HEllo Worldhhhhhhh'); console.log(hash.digest('hex'));
输出结果
300bfc4b9f19bcfc6a8fac7ea54e4e8d31b0cea544c23f9e4cea21dc94c3ea22
6、sha512的加密算法
const crypto = require('crypto');
const hash = crypto.createHash('sha512'); hash.update('HEllo Worldhhhhhhh'); console.log(hash.digest('hex'));
输出结果
062e805ad0c342151275dec7c25f4bc15fca747f70395cda6b41d6fce7c5954628e0f42587f5d6d3d6312ae353f72208c9ca6bfdd7b953dbb51317db79abfc34
二、HMAC算法
翻译之后的就是"哈希运算消息认证码"
利用哈希算法,以一个密钥和一个消息为输入,生成一个加密串作为输出。
HMAC可以有效防止一些类似md5的彩虹表等攻击,比如一些常见的密码直接MD5存入数据库的,可能被反向破解。
crypto.createHmac(algorithm, key)
这个方法返回和createHash一样,返回一个HMAC的实例,有update和digest方法。
但是这个key怎么获取呢?这个要说一下SSL,利用opensll命令来创建一个key.pem,这个key.pem就是key,就是这个秘钥。
这样我们就生成了一个秘钥key.pem
var crypto = require('crypto');
var fs = require('fs'); var pem = fs.readFileSync('key.pem');
var key = pem.toString('ascii'); var hmac = crypto.createHmac('sha1', key); hmac.update('foo'); hmac.digest('hex');
'7b058f2f33ca28da3ff3c6506c978825718c7d42'
先通过 fs.readFileSync 方法读取了key.pem密钥,
然后将它转为ascii码,
最后通过 createHmac(‘sha1’, key) 方法获得HMAC实例,
然后执行update和digest,
生成一串密钥字符串。
注意:由于key的不同,所以同样的字符串’foo’经过hmac加密后生成的16进制字符串也是不同的,从而更加保障了数据的安全性。
三、加密算法知识
1、什么是加密算法?
加密算法很容易理解,就是把明文变成人家看不懂的东西,然后送给自己想要的送到的地方,接收方用配套的解密算法又把密文解开成明文,这样就不怕密文给人家截获而泄密。
2、加密算法的种类 ?
大致分为2类,一种是基于key的,一种不是基于key的。 不基于key的算法就是消息双方都通过一定的加密和解密算法来进行通信,这种算法缺点很明显如果加密算法被破解了就泄露了。
3、基于key的加密算法?
key是一个什么东西呢?随便你,可以是一个随机产生的数字,或者一个单词,啥都行,只要你用的算法认为你选来做key的东西合法就行。所以基于key的加密算法又分为2类:对称加密和不对称加密。对称加密算法的原理很容易理解,通信一方用KEK加密明文,另一方收到之后用同样的KEY来解密就可以得到明文。
4、不对称加密算法?
不对称加密指双方用不同的KEY加密和解密明文,通信双方都要有自己的公共密钥和私有密钥。举个例子比较容易理解,我们们假设通信双方分别是A,B. A,拥有KEY_A1,KEY_A2,其中KEY_A1是A的私有密钥,KEY_A2是A的公共密钥。 B,拥有KEY_B1,KEY_B2,其中KEY_B1是B的私有密钥,KEY_B2是B的公共密钥。公共密钥和私有密钥的特点是,经过其中任何一把加密过的明文,只能用另外一把才能够解开。也就是说经过KEY_A1加密过的明文,只有KEY_A2才能够解密,反之亦然。
4.1不对称加密算法通信过程:
4.1.1公共秘钥交换
A-------->;KEY_A2------------>B
A<--------KEY_B2<------------A
这个过程叫做公共密钥交换,老外管这叫keyexchange。
4.1.2公共秘钥解密
之后A和B就分别用对方的公共密钥解密,用自己的私有密钥加密。 一般公共密钥是要发布出去的,这就是SSL使用的验证机制(注意不是数据传输机制)。
常用的不对称加密一般有RSA,DSA,DH等。我们一般使用RSA。
四、SSL协议
4.1 SSL简介
openssl的命令很多,整理一下:
SSL(SecureSocketLayer)是netscape公司提出的主要用于web的安全通信标准,.
TLS(TransportLayerSecurity)是IETF的TLS工作组在SSL3.0基础之上提出的安全通信标准,
SSL/TLS提供的安全机制可以保证应用层数据在互联网络传输不被监听,伪造和窜改。
1、一般情况下的网络协议应用中,数据在机器中经过简单的由上到下的几次包装,就进入网络,如果这些包被截获的话,那么可以很容易的根据网络协议得到里面的数据.由网络监听工具可以很容易的做到这一点。
2、SSL就是为了加密这些数据而产生的协议,可以这么理解,它是位与应用层和 TCP/IP之间的一层,数据经过它流出的时候被加密,再往TCP/IP送,而数据从TCP/IP流入之后先进入它这一层被解密,同时它也能够验证网络连接两端的身份(根据我们之前学习的不对称加密算法只是可知)。
3、SSL协议包含2个子协议,一个是包协议,一个是握手协议。包协议位于握手协议更下一层,我们暂时对包协议的内容没有兴趣。SSL握手过程说简单点就是:通信双方通过不对称加密算法来协商好一个对称加密算法以及使用的key,然后用这个算法加密以后所有的数据完成应用层协议的数据交换。
4.2 SSL通信流程:
握手一般都是由client发起的,SSL也不例外。
1、client送给server它自己本身使用的ssl的version(ssl一共有三个version),加密算法的一些配置,和一些随机产生的数据,以及其他在SSL协议中需要用到的信息。
2、server送给client它自己的SSL的version,加密算法的配置,随机产生的数据,还会用自己的私有密钥加密SERVER-HELLO信息。Server还同时把自己的证书文件给送
过去。同时有个可选的项目,就是server可以要求需要客户的certificate。
3、client就用server送过来的certificate来验证server的身份。如果server身份验证没通过,本次通信结束。通过证书验证之后,得到server的公共密钥,解开server送来的
被其用私有密钥加密过的SERVER-HELLO信息,看看对头与否。如果不对,说明对方只有该server的公共密钥而没有私有密钥,必是假的。通信告吹。
4、client使用到目前为止所有产生了的随机数据(sharedsecret),client产生本次握手中的premastersecret(这个步骤是有可能有server的参与的,由他们使用的加密算法决
定),并且把这个用server的公共密钥加密,送回给server.如果server要求需要验证client,那么client也需要自己把自己的证书送过去,同时送一些自己签过名的数据过去。
RSA就是我们上一章说过的一种不对称加密算法。首先server把自己的RSA公共密钥送给client,client于是用这个key加密一个随机产生的值(这个随机产生的值就是
sharedsecret),再把结果送给server.
5、Server验证完client的身份之后,然后用自己的私有密钥解密得到premastersecret然后双方利用这个premastersecret来共同协商,得到mastersecret. 6、双方用master
一起产生真正的sessionkey,着就是他们在剩下的过程中的对称加密的key了。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。
同步文章:http://www.mwcxs.top/page/421.html,欢迎访问交流学习社区,社区源码在github上:https://github.com/saucxs/nodeJSBlog,欢迎fork和start。
浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议的更多相关文章
- 60.浅谈nodejs中的Crypto模块
转自:https://www.cnblogs.com/c-and-unity/articles/4552059.html node.js的crypto在0.8版本并没有改版多少,这个模块的主要功能是加 ...
- nodejs中的Crypto模块
我是属于实用型的选手,千万别问我过多原理性的东西,我只知道,这个是最好的,我就用它. http://cnodejs.org/topic/504061d7fef591855112bab5
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...
- 【转】浅析Python中的struct模块
[转]浅析Python中的struct模块 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概 ...
- 介绍nodejs中的path模块的几个方法
webpack中常用的: var path = require('path') 是nodejs中的path模块,介绍一下webpack中常用的几个path模块的方法: 应用node环境的时候,这个pa ...
- nodejs中的fs模块中的方法
nodejs中的fs模块 引入模块 const fs =require("fs") 检测文件是否存在fs.stat(path,callback) fs.stat("./n ...
- Nodejs进阶:crypto模块中你需要掌握的安全基础
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址. 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速度增长.同时,各类网络安全问题层出不穷.在信 ...
- 使用 nodejs 中的 http 模块实现几个超实用的工具
nodejs 方便了我们前端开发者进行一些服务端上的操作,可以进行无缝地衔接.像其他一些后端语言,如 php, golang, java 等,都需要一定的学习成本,而 nodejs 则就是为前端开发者 ...
- 浅析Python中的struct模块
最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...
随机推荐
- NanUI文档 - 打包并使用内嵌式的HTML/CSS/JS资源
NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript相互掉用(待更新...) 如何处理Nan ...
- IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)
1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public ...
- 移动端下拉刷新上拉加载-mescroll.js插件
最近无意间看到有这么一个上拉刷新下拉加载的插件 -- mescroll.js,个人感觉挺好用的,官网地址是:http://www.mescroll.com 然后我就看了一下文档,简单的写了一个小dem ...
- 《C++程序设计语言(英文第四版)》【PDF】下载
<C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...
- SQL基本查询_子查询(实验四)
SQL基本查询_子查询(实验四) 1.查询所有员工中薪水低于"孙军"的员工姓名和薪水: 2.查询与部门编号为"01"的岗位相同的员工姓名.岗位.薪水及部门号: ...
- Wincc flexable的IO域组态
1.题目 2.新建三个变量 3.组态画面,添加IO域1 1)常规设置 2)属性设置 4.组态IO域2 1)常规项 2)属性设置 5.组态第三个IO域 1)常规设置 2)属性设置 6.此外可以设置动画 ...
- rtmp指令解释--转
指令 Core rtmp 语法:rtmp { ... } 上下文:根 描述:保存所有 RTMP 配置的块. server 语法:server { ... } 上下文:rtmp 描述:声明一个 RTMP ...
- JavaScript连等赋值
最近探究js原理的过程中遇到了这个挺有趣的问题. 先贴代码: var a = {n:1} a.x = a = {n:2} alert(a.x) //undefined 在弄懂这个之前,我们先普及一个知 ...
- LVS-DR集群搭建
安装LVS 下载源码包,安装时需要根据自己的内核,下载 ipvsadm-1.26.tar.gz的源码包,在进行编译安装以后,我们需要检查必需包是否安装: 1.对内核文件做链接 # uname -r 2 ...
- 在亚马逊linux环境上装mysql+添加启动项
安装mysql sudo yum install mysql sudo yum install mysql-server sudo yum install mysql-devel 添加到系统启动项su ...