正常情況下使用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
