詳解Node.js API系列 Crypto加密模塊(1)

MD5加密算法

算法簡介

MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest開發出來,經md二、md3和md4發展而來。它的做用是讓大容量信息在用數字簽名軟件簽署私人密匙前被「壓縮」成一種保密的格式(就是把一個任意長度的字節串變換成必定長的大整數).無論是md二、md4仍是md5,它們都須要得到一個隨機長度的信息併產生一個128位的信息摘要.node

MD5 算法的哈希值大小爲 128 位。是一種不可逆的算法。算法

算法特色

  • 兩個不一樣的明文不會獲得相同的輸出值
  • MD5結果不能反推明文,不可逆

安全性

從安全的角度講,MD5的輸出爲128位,若採用純強力攻擊尋找一個消息具備給定Hash值的計算困難性爲2128,用每秒可試驗1000000000個消息的計算機需時1.07×1022年。若採用生日攻擊法,尋找有相同Hash值的兩個消息須要試驗264個消息,用每秒可試驗1000000000個消息的計算機需時585年。數據庫

實際應用上,例如我知道‘password’的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那麼我就用一個數據庫存起來,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道這個是口令‘password‘使用MD5處理以後的值,原來的口令就是’password'。MD5在身份鑑別系統中用於口令保護已是好久了事情了,大部分黑客也有針對這種Hash方式準備相應的數據庫進行反查,這種數據庫稱爲彩虹表,MD5的安全性大大減弱。api

MD5加密例程

var crypto = require('crypto');var content = 'password'var md5 = crypto.createHash('md5');
md5.update(content);var d = md5.digest('hex');  //MD5值是5f4dcc3b5aa765d61d8327deb882cf99

SHA1算法

算法簡介

SHA1的全稱是Secure Hash Algorithm(安全哈希算法)。加密哈希函數將任意長度的二進制字符串映射爲固定長度的小型二進制字符串。加密哈希函數有這樣一個屬性:在計算上不大可能找到散列爲相同的值的兩個不一樣的輸入;也就是說,兩組數據的哈希值僅在對應的數據也匹配時纔會匹配。數據的少許更改會在哈希值中產生不可預知的大量更改。因此你很難從加密後的文字中找到蛛絲馬跡。安全

SHA1 算法的哈希值大小爲 160 位。是一種不可逆的算法。服務器

SHA1加密例程

var crypto = require('crypto');var content = 'password'var shasum = crypto.createHash('sha1');
shasum.update(content);var d = shasum.digest('hex');

MD5與sha1的不一樣點

  • MD5 使用小端排序LITTLE-ENDIAN,sha1 使用大端排序BIG-ENDIAN
  • MD5最後生成的摘要信息是16個字節,SHA1是20個字節。網絡

 

 

隨着互聯網的發展,MD5已經變得愈來愈不安全了,黑客能夠經過彩虹表,查出MD5值所對應的密碼,爲了解決這個問題,不少網站都開始採用須要密鑰加密的Hmac算法。函數

Hmac算法

HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code),HMAC運算利用哈希算法,以一個密鑰和一個消息爲輸入,生成一個消息摘要做爲輸出。網站

認證流程

(1) 先由客戶端向服務器發出一個驗證請求。ui

(2) 服務器接到此請求後生成一個隨機數並經過網絡傳輸給客戶端(此爲挑戰)。

(3) 客戶端將收到的隨機數提供給ePass,由ePass使用該隨機數與存儲在ePass中的密鑰進行HMAC-MD5運算並獲得一個結果做爲認證證據傳給服務器(此爲響應)。

(4) 與此同時,服務器也使用該隨機數與存儲在服務器數據庫中的該客戶密鑰進行HMAC-MD5運算,若是服務器的運算結果與客戶端傳回的響應結果相同,則認爲客戶端是一個合法用戶

BAE加密驗證

bae的PHP代碼簽名參考

Signture = urlencode(base64_encode(hash_hmac('sha1', Content, SecretKey,true)))
  • SecretKey 加密的要是
  • Content 傳輸的內容
  • sha1生成的算法

Node.js版本的

Signture = require('crypto').createHmac('sha1', SecrectKey).
        update(content).digest().toString('base64');
相關文章
相關標籤/搜索