使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)
正常情况下使用md5加密
var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.createHash('md5').update(data).digest('hex'); return md5; }
实际开发中经常需要前端nodejs调用后端java接口,使用上述方法会出现中文加密结果不同的情况,解决方法如下:
var crypto = require('crypto'); var md5Sign = function (data) { // 加入字符编码 var md5 = crypto.createHash('md5').update(data, 'utf-8').digest('hex'); return md5; }
或者
var crypto = require('crypto'); var Buffer = require('buffer').Buffer; var md5Sign = function (data) { // 将字符转换成二进制流 var str = new Buffer(data).toString('binary'); var md5 = crypto.createHash('md5').update(str).digest('hex'); return md5; }
【crypto】
The crypto module provides cryptographic functionality that includes a set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign and verify functions.
即:crypto是一套集成了包含OpenSSL的散列,HMAC、密码、解密、签名和验证功能的加密模块。
关于crypto加密模块的使用,可以参考:http://blog.fens.me/nodejs-crypto/
【md5】
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),它的作用是让大容量信息在用数字签名软件签署私人密匙前被“压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要.
MD5 算法的哈希值大小为 128 位。是一种不可逆的算法。
算法特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、不可逆性:MD5结果不能反推明文,不可逆。
实际应用上,例如我知道‘password’的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一个数据库存起来,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道这个是口令‘password‘使用MD5处理之后的值,原来的口令就是’password'。MD5在身份鉴别系统中用于口令保护已经是很久了事情了,大部分黑客也有针对这种Hash方式准备相应的数据库进行反查,这种数据库称为彩虹表,MD5的安全性大大减弱。
【彩虹表】
彩虹表(Rainbow Table)是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备。一般主流的彩虹表都在100G以上。 这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码。这是空间/时间替换的典型实践, 比每一次尝试都计算哈希的暴力破解处理时间少而储存空间多,但却比简单的对每条输入散列翻查表的破解方式储存空间少而处理时间多。使用加盐的KDF函数可以使这种攻击难以实现。
属性:密码对的集合
大小:主流的在100G以上
作用:快速地根据哈希值破解各类密码
参考资料:http://blog.csdn.net/u011202334/article/details/50585777
http://blog.csdn.net/fdipzone/article/details/50768339
http://blog.csdn.net/u011202334/article/details/50585777
http://www.cnblogs.com/ajun/p/4167280.html