安全 · 阅读约 4 分钟 ·
MD5、SHA-1 还是 SHA-256:该用哪种哈希?
校验和、文件完整性、密码和签名各有不同的需求。一篇短文教你选对哈希算法,并避开那个最常见的错误。

哈希函数能把任何输入变成一段固定长度的简短“指纹”。相同的输入总是得到相同的哈希,改动一个字节结果就会完全不同。各算法的区别在于它们有多难被欺骗。
"hello" MD5 5d41402abc4b2a76b9719d911017c592
"hello" SHA-256 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
MD5 和 SHA-1:在安全上已被攻破
几秒钟就能构造出两个 MD5 哈希相同的不同输入,而实用的 SHA-1 碰撞早在 2017 年就已公开。不要把它们用于签名、证书或任何攻击者可能篡改的东西。用作快速校验和仍然可以,比如查找重复文件或生成缓存键。
SHA-256:安全的默认选择
在完整性检查、下载校验、数字签名和按内容寻址等场景中,SHA-2 家族的 SHA-256 是标准选择。SHA-3 和 BLAKE2 是安全级别相近的现代替代方案。
CRC32:防意外,不防攻击
CRC32 和 Adler-32 是快速的校验和,用于发现传输和压缩包中的意外损坏。任何人都能故意构造出相同的值,所以它们无法防止篡改。
绝不要用快速哈希存储密码
这是最常见的错误。对密码来说,速度恰恰是你不想要的:一块显卡每秒能尝试数十亿次 SHA-256。请通过你所用框架的密码库,使用专为密码设计、加盐且缓慢的算法,例如 Argon2、bcrypt 或 scrypt。
哈希、加密和编码是三回事
编码 Base64、hex、URL 任何人都能还原,无需密钥
加密 AES、RSA 只有持有密钥才能还原
哈希 SHA-256、MD5 单向,无法还原
哈希无法“解密”。声称能反查 MD5 的网站,只是在已知输入的巨大表格里查找这个哈希。对常见单词和短密码有效,对任何又长又随机的内容都无效。
校验下载的文件
很多项目会在下载文件旁公布 SHA-256 校验值。计算你收到的文件的哈希并比较两个值;只要有一个字符不同,文件就已损坏,或者不是发布者发布的那一个。每个操作系统都有内置命令:
Linux sha256sum file.iso
macOS shasum -a 256 file.iso
Windows certutil -hashfile file.iso SHA256
PowerShell Get-FileHash file.iso -Algorithm SHA256
哈希的长度
MD5 产生 128 位(32 个十六进制字符),SHA-1 为 160 位(40 个),SHA-256 为 256 位(64 个),SHA-512 为 512 位(128 个)。如果你需要证明消息是谁创建的,而不仅仅是证明它没被改过,请使用 HMAC 或数字签名:任何修改了内容的人都能重新算出普通哈希。
该用哪个,一句话说清
- 校验下载文件或备份:SHA-256。
- 签名、证书以及一切与安全相关的场景:SHA-256 或更强,绝不用 MD5 或 SHA-1。
- 查找重复文件或生成缓存键:MD5 或 SHA-1 就够了,而且很快。
- 检测协议或压缩包中的传输错误:CRC32。
- 存储密码:以上都不要;请使用 Argon2、bcrypt 或 scrypt。
为什么你的哈希对不上
如果两个工具对“同一段”文本给出不同的哈希,输入几乎肯定并不相同:末尾多一个换行、Windows 换行符或不同的文本编码都会改变整个结果。4Dev 的哈希生成器把文本按 UTF-8 字节计算哈希,与 md5sum、sha256sum 和 Python 的 hashlib 一致,支持 17 种算法,包括 MD5、SHA-1、SHA-2、SHA-3、BLAKE2 和 CRC32。