“用 MD5 还是 SHA-256?“——先看你要防的是“传输出错”,还是“有人故意伪造”。哈希最常见的两类用途是:做摘要 / 完整性比对,以及参与安全校验。前者有时还会看到 MD5;后者通常应从 SHA-256 起步。
5 个常见算法的定位
| 算法 | 输出长度 | 速度(相对) | 状态 |
|---|---|---|---|
| MD5 | 128 位 / 32 hex | 最快 | 2004 年起被证明可碰撞,不再用于安全场景 |
| SHA-1 | 160 位 / 40 hex | 快 | 2017 年 Google 实际制造碰撞,已废弃 |
| SHA-256 | 256 位 / 64 hex | 中等 | 当前主流安全哈希 |
| SHA-512 | 512 位 / 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 摘要比对。