哈希算法详解:MD5、SHA-1、SHA-256、SHA-512
快速解答
MD5 和 SHA-1 已损坏,不得用于安全敏感目的。 SHA-256 是完整性检查、签名和区块链的当前默认值。 SHA-512 在 64 位 CPU 上速度更快,并且在需要较长摘要的情况下使用。使用我们的哈希生成器在您的浏览器中计算其中的任何一个;使用文件哈希来验证文件完整性。
介绍
加密哈希函数接受任意大小的输入,并生成固定大小的摘要,该摘要是确定性的、计算速度快、不可反转、抗冲突且对雪崩敏感(一位变化会改变大约一半的输出位)。 MD5(128 位)、SHA-1(160 位)、SHA-256(256 位)和 SHA-512(512 位)是四种最常见的哈希函数,但它们的安全属性差异很大。
步步
-
了解哈希函数的属性
好的加密哈希是确定性的(相同的输入总是产生相同的输出)、固定大小的输出、计算速度快、无法反转(抗原像)、无法找到具有相同输出的两个输入(抗冲突)和雪崩(微小的输入变化翻转约 50% 的输出位)。
-
了解摘要大小
MD5 生成 128 位(32 个十六进制字符)。 SHA-1 产生 160 位(40 个十六进制字符)。 SHA-256 生成 256 位(64 个十六进制字符)。 SHA-512 产生 512 位(128 个十六进制字符)。较长的摘要会降低冲突概率,但会增加存储大小。
-
了解为什么 MD5 和 SHA-1 被破坏
研究人员发现了针对 MD5(2004)和 SHA-1(2017,SHAttered 攻击)的实际碰撞攻击。冲突使攻击者可以使用相同的哈希值制作两个不同的输入,从而破坏数字签名和证书颁发机构。出于安全考虑,两者都不应该被使用。
-
选择正确的算法
对于速度比安全性更重要的文件完整性检查,MD5 或 SHA-1 仍然很常见。对于任何安全敏感用途(密码、签名、证书、区块链),请使用 SHA-256 或 SHA-512。对于密码存储,请使用 bcrypt、scrypt 或 Argon2 等慢速 KDF — 切勿使用原始 SHA-256。
-
计算并验证哈希值
使用哈希生成器使用任何算法对文本进行哈希处理,或使用文件哈希来计算本地文件的哈希值。将生成的摘要与已知良好的值进行比较以验证完整性 - 一点差异就意味着文件已损坏或篡改。
示例
'hello' 的 MD5 (128 位,32 个十六进制字符)
输入: hello
输出: 5d41402abc4b2a76b9719d911017c592
'hello' 的 SHA-256 (256 位,64 个十六进制字符)
输入: hello
输出: 2cf24dba5fb0d30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
雪崩效应——一个角色改变
输入: 你好 vs 你好
输出: SHA-256('hello') 开始 2cf24dba... 而 SHA-256('Hello') 开始 185f8db3... — 尽管一位输入发生变化,但完全不同
常见问题
- 使用 MD5 或 SHA-1 进行密码散列:两者都快速且易损坏,使得暴力破解和彩虹表攻击变得微不足道。请改用 bcrypt、scrypt 或 Argon2。
- 混淆散列与加密:散列是单向且不可逆的;加密是双向的。您无法“解密”哈希值 - 您只能比较哈希值。
- 忽略长度扩展攻击:MD5、SHA-1、SHA-256 和 SHA-512 在用作 MAC 时都容易受到长度扩展攻击。使用HMAC-SHA256进行消息认证。
- 使用 == 比较哈希值,而不是恒定时间比较:定时泄漏让攻击者可以逐字节恢复哈希值。在安全代码中使用恒定时间比较。
提示
- 新系统默认为 SHA-256 — 它速度快、受到广泛支持,并且截至 2026 年没有实际的碰撞攻击。
- 对于密码存储,请使用工作因子为 12+ 的 bcrypt(或具有 64MB 内存的 Argon2id)——切勿使用原始 SHA-256,这对 GPU 来说太快了。
- 验证文件下载时,请比较算法名称和摘要 - 如果发布者只想 SHA-256,则 SHA-1 哈希毫无意义。
- 使用我们的文件哈希工具在本地计算大文件的 SHA-256 而无需上传 - 它通过 Web 加密 API 流式传输文件。