cv.cm

知识库 · 文本、数据与安全

MD5 和 SHA-256 有什么区别?

阅读约 6 分钟

简短回答

MD5 和 SHA-256 都是哈希函数,能把任意输入变成固定长度的「指纹」:MD5 是 128 位,SHA-256 是 256 位。MD5 在安全上已被攻破,因为攻击者可以制造出哈希值相同的两个不同文件。SHA-256 目前没有已知的实际攻击,是数字签名和完整性校验的默认选择。MD5 仍可用于检测意外损坏,但两者都不应直接用来存储密码。

打开哈希生成

哈希函数的作用

密码学哈希函数接受任意长度的输入,返回固定长度的摘要。相同的输入总是得到相同的摘要,改动一个字符就会得到完全不同的摘要,而且无法从摘要反推出输入。

输入MD5SHA-256
abc900150983cd24fb0d6963f7d28e17f72ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
空字符串d41d8cd98f00b204e9800998ecf8427ee3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

安全的哈希必须抵御三种攻击:根据给定摘要找出输入(原像攻击);找出与给定输入摘要相同的另一个输入(第二原像攻击);找出任意两个摘要相同的输入(碰撞攻击)。碰撞最容易,由于生日悖论,理想的 n 位哈希大约需要尝试 2^(n/2) 次。

MD5、SHA-1、SHA-256 和 SHA-3 对比

算法摘要长度十六进制长度现状
MD5(1992)128 位32自 2004 年起可实际构造碰撞;在安全上已被攻破
SHA-1(1995)160 位402017 年出现首个公开碰撞;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。

全部知识文章