MD5与SHA-256与SHA-1对比与建议
各个摘要算法特点
MD5:
- 长度:128位哈希值
- 性能:快速
- 安全性:不足,已经被证明存在碰撞攻击。
SHA-1:
- 长度:160位哈希值
- 性能:一般
- 安全性:较高,但已经有了攻击的报告。
SHA-256:
- 长度:256位哈希值
- 性能:较慢
- 安全性:高,目前没有被证明的攻击。
摘要算法性能对比
对比了原始字符串长度为10,10000,20000时的MD5,SHA-256,SHA1加密所用的时间,结果显示:随着原始字符串长度的增加,加密所需的时间也会增加;SHA-256和SHA1的加密时间相对较长,而MD5加密时间相对较短。
结论
MD5是一种快速的哈希算法,但它的安全性已经被证明是不足的,因此不推荐在安全关键应用中使用。
SHA-1与SHA-256均是安全的哈希算法,SHA-1的安全性高,性能也和MD5相差不大。因此,如果有安全性要求,建议使用SHA-1。但是如果对安全性有较高的要求,建议选用SHA-256。
总的来说,选择加密算法还需要根据应用场景和性能需求进行考虑。
附录
原始结果
原始字符串长度: 10
MD5: 1885ms
SHA-256: 2292ms
SHA1: 1522ms
原始字符串长度: 10000
MD5: 12401ms
SHA-256: 22922ms
SHA1: 16159ms
原始字符串长度: 20000
MD5: 24258ms
SHA-256: 42928ms
SHA1: 30883ms
摘要算法性能对比测试代码
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class HashPerformanceTest {
private static final int TEST_COUNT = 100000;
private static List<String> hashList = new ArrayList<>();
public static void main(String[] args) throws Exception {
for (int i = 0; i < 3; i++) {
StringBuilder TEST_STRING = new StringBuilder("一二三四五六七八九十");
for (int j = 0; j < i*1000-1; j++) {
TEST_STRING.append("一二三四五六七八九十");
}
test(TEST_STRING.toString());
}
}
public static void test(String TEST_STRING) throws Exception {
System.out.println("原始字符串长度: "+TEST_STRING.length());
long startTime = System.nanoTime();
for (int i = 0; i < TEST_COUNT; i++) {
hashList.add(md5Hash(TEST_STRING));
}
long endTime = System.nanoTime();
System.out.println("MD5: " + TimeUnit.NANOSECONDS.toMillis(endTime - startTime) + "ms");
startTime = System.nanoTime();
for (int i = 0; i < TEST_COUNT; i++) {
hashList.add(sha256Hash(TEST_STRING));
}
endTime = System.nanoTime();
System.out.println("SHA-256: " + TimeUnit.NANOSECONDS.toMillis(endTime - startTime) + "ms");
startTime = System.nanoTime();
for (int i = 0; i < TEST_COUNT; i++) {
hashList.add(sha1Hash(TEST_STRING));
}
endTime = System.nanoTime();
System.out.println("SHA1: " + TimeUnit.NANOSECONDS.toMillis(endTime - startTime) + "ms");
}
private static String md5Hash(String input) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] inputBytes = input.getBytes();
byte[] hashBytes = messageDigest.digest(inputBytes);
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
private static String sha256Hash(String input) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] inputBytes = input.getBytes();
byte[] hashBytes = messageDigest.digest(inputBytes);
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
private static String sha1Hash(String input) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
byte[] inputBytes = input.getBytes();
byte[] hashBytes = messageDigest.digest(inputBytes);
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
}
文章链接
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情