哈希解释:MD5、SHA,以及何时使用每一个
哈希函数把任意数据变成固定长度的指纹。对比MD5、SHA-1和SHA-256的区别与适用场景,了解文件校验、密码存储和数据完整性验证的实用方法。
你下载一个文件。网站显示MD5校验和。你应该以某种方式验证它。但为什么?MD5和SHA-256之间有什么区别?
哈希函数在软件中无处不在。理解它们能帮你正确使用它们。
哈希做什么
哈希函数接受任何输入并产生固定大小的输出。相同输入总是产生相同输出。改变输入的一位,输出完全改变。
"hello" → 5d41402abc4b2a76b9719d911017c592 (MD5)
"Hello" → 8b1a9953c4611296a827abf8c47804d7 (MD5)
一个大写字母改变整个哈希。这就是重点。
哈希 vs 加密
哈希是单向的。你不能逆向哈希来获得原始数据。
加密是双向的。用正确的密钥,你可以解密并恢复原始内容。
如果有人说他们能"解密"MD5哈希,他们要么在破解它(尝试输入直到一个匹配),要么他们对哈希如何工作感到困惑。
常见算法
MD5 - 128位输出。快但密码学上已破解。校验和可以,安全不行。
SHA-1 - 160位。密码学用途也已破解。遗留系统仍在使用。
SHA-256 - 256位。当前标准。安全很重要时使用这个。
SHA-512 - 512位。稍微更安全,在64位系统上有时更快。
BLAKE2/BLAKE3 - 现代替代品。比SHA-256更快,安全性相似。
何时MD5可以
MD5因为"已破解"而名声不好。但密码学上破解不意味着无用。
文件完整性检查。 验证下载没有损坏。攻击者需要创建具有相同哈希的恶意文件,这对大多数非安全环境的攻击来说需要的努力超过价值。
缓存键。 哈希内容以生成唯一标识符。没有安全影响。
去重。 通过比较哈希找到重复文件。
何时使用SHA-256或更好的
密码存储。 实际上,改用bcrypt或Argon2。它们是为密码设计的。
数字签名。 对手可能尝试伪造的文档完整性。
任何安全关键的东西。 当攻击者有动机寻找碰撞时。
碰撞问题
碰撞是当两个不同的输入产生相同的哈希。生日数学说碰撞变得可能比你预期的更早。
对于MD5,研究人员已经找到创建故意碰撞的方法。两个不同的文件,相同的哈希。这就是为什么它"破解了"。
对于SHA-256,不存在实用的碰撞攻击。还没有。
实际示例
验证下载:
sha256sum ubuntu.iso
# 将输出与下载页面上的哈希比较
存储API密钥: 存储哈希,而不是实际密钥。当用户提交密钥时,哈希它并比较。
Git提交:
Git使用SHA-1识别提交。这就是为什么提交哈希看起来像a1b2c3d4e5f6...
别自己发明
永远不要发明自己的哈希方案。"MD5两次"或"SHA-256加盐附加"比使用既定模式更糟。
对于密码:bcrypt、scrypt或Argon2。 对于完整性:SHA-256。 对于速度:BLAKE3。
专家已经弄清楚这个了。
哈希函数概念简单但应用微妙。为工作选择正确的算法,不要在简单校验和就够的地方使用密码学哈希。