加密与解密是保证通讯安全的一种重要手段,现在加密算法已经有很多,并且都有成熟的软件包可以使用,这就大大降低了应用开发程序员的负担,只需要使用这些第三方提供的加密解密库就可以使用了,在node.js中其实提供了一个非常强大而且方便的加密与解密模块crypto,我们不需要使用第三方的npm库就能实现简单的加密与解密功能,毕竟使用加密与解密的目的就是为了保证通讯的安全,而使用非官方的第三方库总是有可能存在添加的后门或者什么的,而使用node.js自带的crypto模块就能最大程度的保证加密的安全性。

哈希值计算 crypto.hash

哈希值计算通常是用来对数据完整性和正确性做一个校验目的使用,当我们需要确保接受的数据是跟发送的数据一毛一样的时候,就可以通过分别计算发送数据的哈希值和接收到数据的哈希值。做一个简单的比较就能判断出来,两个一样的数据得到的哈希值肯定是一样的。哈希值不能逆向计算还原成原来的数据,所以只能用来验证数据。那么在node.js中该如何使用呢?

示例代码

上面的代码是抄录自node.js官方演示代码,我选择了其中最简单的使用方式,这种使用方式也是我们最常使用的,那就是对一个字符串或者一组数据进行哈希值计算。crypto.hash实现的哈希算法是使用固定的秘语secret作为计算的算子,node.js中还有一个与其类似的,但是可以改变秘语secret的加密类crypto.hmac。

可变哈希计算 crypto.hmac

示例代码

crypto.hmac的使用方法与crypto.hash很相似,唯一不同点就是多了一个可以自定义的秘语secret,使用定制的秘语secret的一个用途就是保存密码的时候可以提高安全性,毕竟使用默认秘语secret的哈希算法函数,只要知道使用了什么算法就能通过暴力碰撞获取到密码,但是使用了定制秘语secret的哈希函数,就算是使用穷举法也几乎是不可能破解的。

对称加密与解密

对称加密与解密的意思是加密与解密双方使用同一个秘语secret实现加解密算法运算,这种加密算法不需要什么公钥和私钥,使用起来比较方便,而且与哈希算法不同,对称加密解密是可以双向互逆运算的。

node.js中支持许多对称加密算法,不过到底有哪些加密算法是取决于你计算机中安装的openssl决定的,node.js只是去调用了openssl。这就给我们带来一个麻烦,那就是没有办法在文档中查找加密算法信息,这个之后就会知道麻烦在哪里。

对称加密使用过程

加密示例代码

让我们一步一步的来解释这个代码吧。

这一行是定义所使用的加密算法,通常有3个部分组成,中间用-连接,第一部分是加密算法名称aes,第二部分是加密长度192位,第三部分是加密认证方法(这部分可能理解有误)cbc

这一行是生成密钥key,注意最后的数字24,这个是生成的密钥key长度,最小是8,最大没限制不过必须是8的倍数才行,密钥key的长度是跟所用的加密算法相关的,因为文档中没有这部分信息,所以使用的时候只能不断的尝试,否则就会报错!

第6行是创建初始向量initialization vector,这也是一个非常关键但是文档中没有说明的地方,iv的长度也很关键,目前只知道长度必须是8的倍数,而且长度是跟所使用的算法位数是相关的,但是文档中没有地方明确说明,所以使用的时候也只能是不断尝试。

密钥key和初始向量initialization vector这两个关键参数的长度没有在node.js文档中写明确是非常遗憾的,导致我们使用的时候要么去查加密算法相关资料,要么只能一个一个手动尝试,非常的不方便。

这两行就很简单了,就是对输入的字符串进行加密计算,update(…,’utf8′, ‘hex’)中utf8是加密前字符串的编码格式,hex是加密后输出的编码格式。最后需要在加密后的字符串后面添加一个结束字符,这个工作由final(‘hex’)完成,hex也是输出的字符编码格式。

对称解密过程

解密示例代码

解密就是加密的逆过程,注意点也是一样的,就是密钥key和初始向量initialization vector这两个参数的长度,还有一点要要注意的是decipher.update输入的第一个参数只能是字符串,不能是buffer类型,个人感觉用buffer性能应该会更好点,可能以后会增加这个类型支持吧。

结语

到此这篇关于详解使用nodejs内置加密模块实现对等加密与解密的文章就介绍到这了,更多相关nodejs对等加密与解密内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!