本文全是網上抄過來的。
1、sha-1 和 MD5
MD4(RFC1320) 是 MIT 的 RonaldL.Rivest 在 1990 年設計的,MD 是 MessageDigest 的縮寫;MD5(RFC1321) 是 Rivest 於 1991 年對 MD4 的改進版本,將任意長的明文 hash 成 128 bit 的雜湊值。
SHA1 是由 NIST NSA 設計為同 DSA 一起使用的,sha 是 Secure Hash algorithm 的縮寫;它對長度小於 2^64 的輸入,產生長度為 160bit 的散列值; SHA-1 設計時基於和 MD4 相同原理,並且模仿了該演算法。
不可以從訊息摘要中複原資訊;兩個不同的訊息不會產生同樣的訊息摘要。
參考:http://wenda.tianya.cn/wenda/thread?tid=7d8ae146f81491e7
參考:http://blog.csdn.net/candy_whut/archive/2009/02/03/3859830.aspx
2、HMAC
HMAC演算法需要有一個hash演算法和一個key。這個hash演算法的實現需滿足"data is hashed by iterating a basic compression function on blocks of data",演算法簡稱為 H;key簡稱為 K。
假設
B 是上面blocks的長度(byte)(B = 64 for MD5 and SHA-1);
L 是key的長度(byte)(L=16 for MD5, L=20 for SHA-1);
ipad = the byte 0x36 repeated B times;
opad = the byte 0x5C repeated B times;
K 可以是小於等於 B 的任意長度;如果 K 的長度大於 B,則 K = H(K)。建議 K 的長度不要小於 L,否則會降低演算法的安全強度。此演算法的公式:H(K XOR opad, H(K XOR ipad, text)),其中 text 為目標資料,具體步驟:
(1), 在 K 後添加0使其長度達到 B;
(2), 將 (1) 產生的 B 位元組長的字串與 ipad 做逐位異或運算;
(3), 將 text 的字元流 append to (2) 產生的 B 位元組長的字串;
(4), H 作用於 (3) 產生的字元流;
(5), 將 (1) 產生的 B 位元組長的字串與 opad 做逐位異或運算;
(6), 將 (4) 產生的雜湊值 append to (5) 產生的 B 位元組長的字串;
(7), H 作用於 (6) 產生的字元流。
參考:rfc2104