crypto作为nodeJS已经稳定下来的模块在整个node中具有举足轻重的地位,一切app都需要加密解密,那么crypto就是一个提供加密功能的模块。在这个模块中已经打包了OpenSSL hash,HMAC(哈希信息验证码),cipher(加密),decipher(解密),sign(签名)以及verify(验证)的功能。
加密算法crypto
我很难想象在PHP里面md5加密只是三个字符的一个方法而已,在node.js中没封装前竟然那么长!!
无法反编译的加密方式
话不多说直接上代码品鉴吧
最后的输出为
aa794f68b4f6ae5e590e9ed34e94d639 8aed1322e5450badb078e1fb60a817a1df25a2ca b03d8471e2c5f212289c3e2dcb95bd47
真真的输出了一堆16进制的字符但是简单生成个密文看来是很麻烦了。
可以反编译的加密算法
最终输出
3094e920cf4208e9cf1b209d4be9a2f018541c70db89b4e4fdcf3bda12d3abc7 我是一个大傻瓜 我是一个大傻瓜
这个的话感觉可以用于一般的密文通信。
DH协商秘钥算法
在http下真叫别人抓包了,所有的信息就泄露了,就算是你用密文通信,开始需要个key来解码呀,这个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加密解密就会安全多了。