本文全是网上抄过来的。
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