安全 · 阅读约 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。

打开哈希生成器

LinkedInXFacebook