MD5、SHA-1、SHA-256 怎么选?

· 更新于 2026-05-02 · 约 2 分钟 #️⃣ Hash

“用 MD5 还是 SHA-256?“——先看你要防的是“传输出错”,还是“有人故意伪造”。哈希最常见的两类用途是:做摘要 / 完整性比对,以及参与安全校验。前者有时还会看到 MD5;后者通常应从 SHA-256 起步。

5 个常见算法的定位

算法输出长度速度(相对)状态
MD5128 位 / 32 hex最快2004 年起被证明可碰撞,不再用于安全场景
SHA-1160 位 / 40 hex2017 年 Google 实际制造碰撞,已废弃
SHA-256256 位 / 64 hex中等当前主流安全哈希
SHA-512512 位 / 128 hex中等到较快在部分 64 位环境表现不错,适合需要更长摘要的场景

什么叫”碰撞”

两个不同的输入得到相同的哈希值,叫碰撞。对于完美哈希,找一个碰撞需要尝试 2^(n/2) 次(生日悖论):

  • MD5:理论生日界限是 2⁶⁴,但算法设计已被实用碰撞攻击击穿
  • SHA-1:理论生日界限是 2⁸⁰,但也已被公开实用碰撞证明击穿
  • SHA-256:2¹²⁸ 次,目前全人类算力 100 万年也不够

用途和选型

完整性校验(非安全场景) 比如下载大文件后确认“有没有损坏”,你主要防的是比特翻转而不是恶意构造。这种场景下 MD5 仍可能被继续使用,但如果发布方同时提供 SHA-256,优先比对 SHA-256 更稳。

密码存储 绝对不要用 MD5/SHA-256 直接哈希密码。密码存储应使用 bcrypt / scrypt / argon2 这类专门的慢哈希,它们的目标就是显著抬高离线暴力破解成本。

HMAC 签名、证书、软件分发校验 通常从 SHA-256 起步。是否升级到 SHA-512,更多取决于协议要求、兼容性和实现约束,而不是“越长就一定越安全”。

文件去重、缓存 key 常见选择是 MD5 或 SHA-256:前者更短更快,后者口径更统一。是否继续保留 SHA-1,要看旧系统兼容性,而不是把它当作新的默认答案。

一个常见误区:加盐 MD5

“MD5 加盐就安全了”——不够。加盐能防止彩虹表,但不能把一个快哈希变成适合存密码的慢哈希。更稳妥的组合一直是:每条记录单独加盐 + bcrypt / scrypt / argon2

文件校验:大文件别全读两次

工具层面,好的实现应该尽量用流式读取(边读边喂给哈希算法),而不是先把整个文件一次性读进内存。浏览器工具最终仍受本机内存和运行环境影响,但思路上应尽量避免“整文件全量载入再计算”。

实际算一下

贴入文本或选择文件,工具会同时算出 MD5 / SHA-1 / SHA-256 / SHA-384 / SHA-512。做 HMAC 时再多填一把 key;做文件校验时,优先和发布方提供的 SHA-256 摘要比对。

❓ 常见问题

MD5 还能用吗?

分场景。非对抗性完整性校验仍可能看到 MD5;但只要场景里存在“有人故意构造碰撞”的可能,就不要再把 MD5 当安全校验。新系统若没有强兼容性约束,直接上 SHA-256 通常更稳。

哈希能反推出原文吗?

数学上不能——哈希是单向函数,从 256 位哈希反推任意长度原文在理论上不可逆。但如果原文有限(比如 8 位纯数字密码),可以穷举所有可能性再一一哈希比对,这就是"彩虹表"攻击。所以密码哈希必须加盐 + 用慢算法(bcrypt/argon2)。

同一个文件不同电脑上算的哈希会一样吗?

会。哈希算法是确定性的,输入完全相同则输出完全相同,与机器、操作系统、时间无关。如果两台机器算出来的 MD5 不同,必然是文件本身在传输中发生了变化——这正是哈希校验完整性的基础。

HMAC 和普通哈希有什么区别?

HMAC = Hash-based Message Authentication Code,是“带共享密钥的哈希”。普通哈希只能说明摘要一致;HMAC 还能证明“生成这条摘要的人知道同一把密钥”。API 签名、Webhook 校验、HS256 这类 JWT 都属于这一类。

#️⃣ 打开 Hash MD5/SHA · HMAC · 文件校验

📖 同一工具的其他教程