热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议

node.js的crypto在0.8版本,这个模块的主要功能是加密解密。node利用OpenSSL库(https:www.openssl.orgsource)来实现它的加密技术,这

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接口,这样用起来方便,运行速度也快。

 

以下你可以看到内容:

一、首先看一下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还可以用来验证数据完整性。双方再交换结束信息。握手结束

 


推荐阅读
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • 技术分享:如何在没有公钥的情况下实现JWT密钥滥用
      ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • 微信回应「10 元就能在朋友圈改定位」;谷歌官方首次提及 Android 11;Node 8.16.2 发布 | 极客头条...
    微信回应「10元就能在朋友圈改定位」;谷歌官方首次提及Android11;Node8.16.2发布|极客头条,Go语言社区,Golang程序员人脉社 ... [详细]
  • phpstudy云服务器安装,如何安装phpstudy
    本文目录一览:1、phpstudy安装在哪本地电脑还是服务器? ... [详细]
  • Git 第二章 Git 安装和卸载
    1.Git安装1.1软件下载打开[git官网]https:git-scm.com,下载git对应操作系统的版本。所有东西下载慢的话就可以去找镜像!官网 ... [详细]
author-avatar
丁仪亓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有