SHA-1和MD5 笔记

简单回顾 SHA-1 和 MD5 算法。

Hash 函数

Hash 函数 H(M), 作用于一任意长度的消息 M,返回一固定长度的散列值h:h=H(M),作为初始消息的独一无二的“数字指纹”,从而能保证数据的完整性和惟一性。Hash算法是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,Hash 函数扮演了一个重要的角色。对 Hash 值,又称”数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。hash函数并不完全可靠,不同文件产生相同 MD5 和 SHA1 的几率还是有的,只是不高。

通过 Hash 算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

Hash 函数的安全性在于其产生散列值的操作过程具有较强的单向性(不可逆性)。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。这符合了数字签名的特性,数字签名只能用非对称算法。

Hash 函数一般用于产生消息摘要,密钥加密等,常见的有:

  • MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法。
  • SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;

MD5

MD5,一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。

MD5(RFC1321)是Rivest于1991年对MD4的改进版本。它对输入仍以 512 位分组,其输出是 4个32位字的级联,与 MD4 相同。MD5 比 MD4 来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

MD5 通常用于密码的加密存储,数字签名,文件完整性验证等。

Java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.security.NoSuchAlgorithmException;
public static String computeHash(String input) {
byte[] hashed_str = null;
String res = null;
try {
java.security.MessageDigest alg = java.security.MessageDigest.getInstance("md5");
alg.update(input.getBytes());
hashed_str = alg.digest();
res = javax.xml.bind.DatatypeConverter.printHexBinary(hashed_str);
} catch (NoSuchAlgorithmException ex) {
System.out.println("Exception: " + ex);
} finally {
return res;
}
}

SHA-1

SHA-1,一种不可逆的、防冲突,并具有良好的雪崩效应的加密算法。该算法输入报文的最大长度不超过 2^64 位,产生的输出是一个 160 位的报文摘要。输入是按 512 位(64 字节)的分组进行处理的,并产生20个字节的被称为信息认证代码或信息摘要的输出。

Java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.security.NoSuchAlgorithmException;
public static String computeHash(String input) {
byte[] hashed_str = null;
String res = null;
try {
java.security.MessageDigest alg = java.security.MessageDigest.getInstance("SHA-1");
alg.update(input.getBytes());
hashed_str = alg.digest();
res = javax.xml.bind.DatatypeConverter.printHexBinary(hashed_str);
} catch (NoSuchAlgorithmException ex) {
System.out.println("Exception: " + ex);
} finally {
return res;
}
}

SHA-1与MD5的比较

因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

  • 强行攻击的安全性:SHA-1与MD5 的最大区别在于其摘要比MD5 摘要长 32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5 是2128 数量级的操作,SHA-1 是2160 数量级的操作。因而,SHA-1 对强行攻击的强度更大。
  • 速度:由于SHA-1 的循环步骤比MD5 多(80:64)且要处理的缓存大(160 比特:128 比特),SHA-1 的运行速度比MD5 慢。

最后上张比较图。

应用-网站用户名密码保存

网站用户名密码的保存方式:

  • 明文 hash 后保存,如 md5
  • MD5+Salt 方式,这个 salt 可以随机

网站用户名密码保存通常会用到 MD5 + Salt。salt 就是服务端在接收了客户输入的原字符串后再加一段自定义的字符串,然后对新产生的字符串一起进行加密,提高安全性。示例代码

参考链接
数字签名算法MD5和SHA-1的比较

徐阿衡 wechat
欢迎关注:徐阿衡的微信公众号
客官,打个赏呗~