MD5与SHA-256与SHA-1详细对比与建议-附录带数据和测试代码

769 阅读3分钟

MD5与SHA-256与SHA-1对比与建议

各个摘要算法特点

MD5:

  • 长度:128位哈希值
  • 性能:快速
  • 安全性:不足,已经被证明存在碰撞攻击。

SHA-1:

  • 长度:160位哈希值
  • 性能:一般
  • 安全性:较高,但已经有了攻击的报告。

SHA-256:

  • 长度:256位哈希值
  • 性能:较慢
  • 安全性:高,目前没有被证明的攻击。

摘要算法性能对比

摘要算法性能对比.jpg

对比了原始字符串长度为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();
    }
}

文章链接

王小云是怎么破解md5的?揭秘:md5算法原理

谷歌首次成功实现SHA-1碰撞攻击

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情