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

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

加密算法crypto

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

无法反编译的加密方式

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

rush: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进制的字符但是简单生成个密文看来是很麻烦了。

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

可以反编译的加密算法

rush:js;"> //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不可能用意念传输还是需要来通过网络传输才行,所以还是又被黑的可能性,于是乎就产生了一个神奇的秘钥算法,两台机器之间只需要传递几个值便可以相互知道最终的秘钥,而就算是这些传递的值被抓走了,也无法破译最终秘钥因为关键的几个值只存储于终端上不在传输流通。

好了上代码

rush:js;"> //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: , generator: , one_key: }, DiffieHellman { _handle: { verifyError: 0 },verifyError: 0 } ] [ , '91de86d30fae396603a64ef3f38f24f82d7d505c5f546f6c6ef2d14d7e77c2511744d76f8b26ff15d2870090620cd7339987806cc0b8519f39eb7b1fa63a0e7b' ] 91de86d30fae396603a64ef3f38f24f82d7d505c5f546f6c6ef2d14d7e77c2511744d76f8b26ff15d2870090620cd7339987806cc0b8519f39eb7b1fa63a0e7b 91de86d30fae396603a64ef3f38f24f82d7d505c5f546f6c6ef2d14d7e77c2511744d76f8b26ff15d2870090620cd7339987806cc0b8519f39eb7b1fa63a0e7b

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

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

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...