正常狀況下使用md5加密html
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; }
或者java
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】node
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(信息-摘要算法),它的做用是讓大容量信息在用數字簽名軟件簽署私人密匙前被「壓縮」成一種保密的格式(就是把一個任意長度的字節串變換成必定長的大整數).無論是md二、md4仍是md5,它們都須要得到一個隨機長度的信息併產生一個128位的信息摘要.app
MD5 算法的哈希值大小爲 128 位。是一種不可逆的算法。ide
算法特色:
一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
二、容易計算:從原數據計算出MD5值很容易。
三、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。
四、強抗碰撞:已知原數據和其MD5值,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。
五、不可逆性: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