知识库 · 文本、数据与安全
MD5 和 SHA-256 有什么区别?
简短回答
MD5 和 SHA-256 都是哈希函数,能把任意输入变成固定长度的「指纹」:MD5 是 128 位,SHA-256 是 256 位。MD5 在安全上已被攻破,因为攻击者可以制造出哈希值相同的两个不同文件。SHA-256 目前没有已知的实际攻击,是数字签名和完整性校验的默认选择。MD5 仍可用于检测意外损坏,但两者都不应直接用来存储密码。
打开哈希生成哈希函数的作用
密码学哈希函数接受任意长度的输入,返回固定长度的摘要。相同的输入总是得到相同的摘要,改动一个字符就会得到完全不同的摘要,而且无法从摘要反推出输入。
| 输入 | MD5 | SHA-256 |
|---|---|---|
abc | 900150983cd24fb0d6963f7d28e17f72 | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
| 空字符串 | d41d8cd98f00b204e9800998ecf8427e | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
安全的哈希必须抵御三种攻击:根据给定摘要找出输入(原像攻击);找出与给定输入摘要相同的另一个输入(第二原像攻击);找出任意两个摘要相同的输入(碰撞攻击)。碰撞最容易,由于生日悖论,理想的 n 位哈希大约需要尝试 2^(n/2) 次。
MD5、SHA-1、SHA-256 和 SHA-3 对比
| 算法 | 摘要长度 | 十六进制长度 | 现状 |
|---|---|---|---|
| MD5(1992) | 128 位 | 32 | 自 2004 年起可实际构造碰撞;在安全上已被攻破 |
| SHA-1(1995) | 160 位 | 40 | 2017 年出现首个公开碰撞;NIST 计划在 2030 年前将其淘汰 |
| SHA-256(SHA-2,2001) | 256 位 | 64 | 安全;标准为 FIPS 180-4 |
| SHA-512(SHA-2) | 512 位 | 128 | 安全;在 64 位 CPU 上往往比 SHA-256 更快 |
| SHA3-256(2015) | 256 位 | 64 | 安全;内部设计不同,标准为 FIPS 202 |
SHA-256 是 SHA-2 家族的一员。「SHA-2」和「SHA-256」经常混用,但 SHA-224、SHA-384 和 SHA-512 同样属于 SHA-2。
MD5 和 SHA-1 是怎样被攻破的
2004 年,王小云等人公布了数小时内即可找到的 MD5 碰撞。后续研究又实现了选择前缀碰撞:攻击者从两个不同的、有意义的文件出发,不断追加数据直到哈希值相同。2008 年,研究人员利用这一方法伪造了一张恶意 CA 证书;2012 年发现的 Flame 恶意软件则利用 MD5 碰撞伪造了微软的代码签名证书。RFC 6151 规定,在数字签名等需要抗碰撞性的场合不得使用 MD5。
SHA-1 紧随其后。2017 年,谷歌与阿姆斯特丹 CWI 的 SHAttered 项目公布了两个 SHA-1 哈希相同的不同 PDF 文件,2020 年又演示了 SHA-1 选择前缀碰撞。此后,Git、TLS 证书和代码签名已经或正在迁移到 SHA-256。
针对 MD5 的原像攻击仍不可行。这里说的「攻破」,是指攻击者能构造出一对碰撞文件,而不是说任意已有的 MD5 都能被反推。
MD5 什么时候还能用,什么时候不能
| 用途 | 能用 MD5 吗? | 原因 |
|---|---|---|
| 检测下载或复制过程中的意外损坏 | 能 | 随机的比特错误不会产生碰撞 |
| 在自己系统内做去重或缓存键 | 一般可以 | 只要攻击者无法控制输入就没问题 |
| 防范恶意镜像站,校验下载文件 | 不能 | 攻击者可以预先准备碰撞文件;请用 SHA-256 |
| 数字签名和证书 | 不能 | 碰撞攻击可以伪造签名 |
| 存储密码 | 不能 | 计算太快;SHA-256 也一样 |
如果可以自己选,就选 SHA-256。它到处都支持,现代 CPU 还有硬件加速,也省得去争论某个用途到底对碰撞是否敏感。
密码需要慢速、加盐的哈希
通用哈希函数的设计目标就是快。一块现代 GPU 每秒能计算数十亿次 MD5 或 SHA-256,因此泄露的未加盐 SHA-256 密码哈希表可以被海量字典攻击,而且相同的密码会显示为相同的哈希。
密码哈希函数同时解决了这两个问题。它们为每个用户加上唯一的随机盐,让相同的密码得到不同的哈希;同时故意设计得很慢,较新的算法还是内存困难型的,让 GPU 难以发挥优势:
- Argon2id:2015 年密码哈希竞赛的冠军,新系统的首选。
- scrypt:内存困难型,支持广泛。
- bcrypt:已使用数十年;注意它只读取密码的前 72 个字节。
- 高迭代次数的 PBKDF2:在要求使用 FIPS 认证算法的场合可以接受。
常见问题
MD5 哈希可以解密吗?
不能。哈希不是加密,没有可以逆向的密钥。网上的「MD5 解密」工具只是在预先算好的常见字符串哈希表中查找,所以短的或常见的输入很快就能查到。
2026 年 SHA-256 还安全吗?
安全。目前没有已知的针对 SHA-256 的实际碰撞或原像攻击,NIST 也继续批准使用。它 2^128 的抗碰撞强度远超当前的计算能力。
为什么网站还在公布 MD5 校验值?
它可以发现下载不完整或文件损坏,这才是最常见的问题。至于防范被篡改的文件,只有校验值来自可信来源、且使用 SHA-256 或更强的算法时才有用。
SHA-256 适合用来哈希密码吗?
单独使用不适合。它速度很快,默认不加盐,泄露的哈希每秒可被猜测数十亿次。请改用 Argon2id、scrypt 或 bcrypt。