MD5 与 SHA256 哈希算法对比

全面对比MD5和SHA256两种哈希算法的原理、安全性、性能差异,以及在密码存储、文件校验等场景中的最佳实践。

加密哈希 2026-05-27 8 分钟

MD5 与 SHA256 哈希算法对比

哈希算法是现代信息安全的基石之一。MD5 和 SHA256 是两种最常见的哈希算法,但它们的安全性和适用场景有很大差异。本文将深入对比这两种算法。

什么是哈希算法?

哈希(Hash)算法是一种将任意长度的输入数据转换为固定长度输出的单向函数。输出值称为哈希值(Hash Value)或摘要(Digest)。

哈希算法的核心特性

  1. 确定性:相同输入始终产生相同输出
  2. 单向性:无法从哈希值反推原始数据
  3. 抗碰撞性:极难找到两个不同的输入产生相同哈希值
  4. 雪崩效应:输入的微小变化导致输出的巨大变化

MD5 算法概述

MD5(Message-Digest Algorithm 5)由 Ronald Rivest 于 1991 年设计,产生 128 位(16 字节)的哈希值,通常表示为 32 位十六进制字符串。

MD5 特点

  • 输出长度:128 位(32 个十六进制字符)
  • 计算速度:非常快
  • 安全状态:已被破解,存在碰撞漏洞

MD5 碰撞攻击

2004 年,中国密码学家王小云教授展示了 MD5 的碰撞攻击方法——可以找到两个不同的输入产生相同的 MD5 值。此后,实际碰撞案例不断被证明:

MD5("Hello, World!") = 65a8e27d8879283831b664bd8b7f0ad4
MD5("Hello, World!") = 65a8e27d8879283831b664bd8b7f0ad4  // 相同输入,相同输出

// 但可以构造不同的输入得到相同的MD5值(碰撞)
MD5(文件A) = d41d8cd98f00b204e9800998ecf8427e
MD5(文件B) = d41d8cd98f00b204e9800998ecf8427e  // 不同文件,相同MD5!

SHA256 算法概述

SHA256 是 SHA-2(Secure Hash Algorithm 2)家族的一员,由美国国家安全局(NSA)设计,产生 256 位(32 字节)的哈希值。

SHA256 特点

  • 输出长度:256 位(64 个十六进制字符)
  • 计算速度:比 MD5 稍慢
  • 安全状态:目前安全,未发现有效的碰撞攻击

核心对比

特性 MD5 SHA256
输出长度 128 位 256 位
十六进制长度 32 字符 64 字符
计算速度 更快 稍慢
抗碰撞性 已被破解 安全
安全推荐 不推荐 推荐
典型用途 文件校验(非安全场景) 安全场景、数字签名

性能对比

在现代硬件上,两者的性能差异已经很小:

  • MD5:约 600-700 MB/s
  • SHA256:约 200-300 MB/s

SHA256 慢 2-3 倍,但对于大多数应用场景来说,这个差异可以忽略。

Java 代码示例

MD5 计算

import java.security.MessageDigest;
import java.util.Base64;

public String md5(String input) throws Exception {
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] digest = md.digest(input.getBytes("UTF-8"));
    StringBuilder sb = new StringBuilder();
    for (byte b : digest) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

SHA256 计算

import java.security.MessageDigest;

public String sha256(String input) throws Exception {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    byte[] digest = md.digest(input.getBytes("UTF-8"));
    StringBuilder sb = new StringBuilder();
    for (byte b : digest) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

使用示例

String text = "Hello, World!";

System.out.println("MD5:    " + md5(text));
// 输出: MD5: 65a8e27d8879283831b664bd8b7f0ad4

System.out.println("SHA256: " + sha256(text));
// 输出: SHA256: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

使用场景建议

何时使用 MD5

MD5 适合非安全相关的场景:

  • 文件完整性校验:下载文件后验证是否损坏
  • 缓存键生成:用作数据的唯一标识
  • 数据去重:快速判断两份数据是否相同
  • 校验和:非安全的数据一致性检查

何时使用 SHA256

SHA256 适合安全相关的场景:

  • 密码存储:加盐后存储密码哈希
  • 数字签名:验证数据的完整性和来源
  • 区块链:比特币等区块链使用 SHA256
  • 证书验证:SSL/TLS 证书的签名
  • API 签名:验证请求的合法性

密码存储最佳实践

// 不推荐:直接使用 MD5
String hash = md5(password);

// 不推荐:直接使用 SHA256
String hash = sha256(password);

// 推荐:使用加盐的 SHA256
String salt = generateRandomSalt();
String hash = sha256(salt + password);

// 最佳:使用专门的密码哈希算法
// bcrypt, scrypt, Argon2

其他常见哈希算法

算法 输出长度 特点
SHA-1 160 位 已被破解,不推荐
SHA-256 256 位 安全,通用推荐
SHA-512 512 位 更高安全性
SHA-3 可变 新一代标准
bcrypt 可变 专为密码设计
Argon2 可变 最新密码哈希标准

总结

  • MD5:速度快但已不安全,仅用于非安全场景
  • SHA256:安全可靠,是目前通用哈希的首选
  • 密码存储:不要使用 MD5 或 SHA256,应使用 bcrypt/Argon2

在开发中选择哈希算法时,安全永远是第一考量。可以使用 jsjson.com MD5 工具SHA256 工具 在线计算和对比两种算法的输出。


本文最后更新于 2026 年 5 月

📚 相关文章