MD5、SHA-256 与 bcrypt:您应该使用哪种哈希?
散列接受任何输入并产生固定长度的“指纹”,而该“指纹”实际上是不可能逆转的。它无处不在——文件完整性检查、数字签名、区块链和密码存储。但 MD5、SHA-256 和 bcrypt 是为非常不同的工作而构建的,使用错误的(尤其是密码)是一种严重的、常见的安全错误。下面介绍如何正确选择。
首先,一个好的哈希函数能保证什么
加密哈希应该是确定性的(相同的输入,相同的输出),快速计算以供合法使用,并且能够抵抗两种攻击:从哈希中查找原始输入(原像抵抗),并找到具有相同哈希的两个输入(碰撞抵抗)。当哈希函数“崩溃”时,通常意味着研究人员找到了一种创建冲突的实用方法。
MD5:仅限快速指纹
MD5 生成 32 字符(128 位)散列并且速度非常快。问题是:自 2000 年代中期以来,它的密码学已被破解 - 实际的冲突攻击已有详细记录,这就是为什么它绝不能用于密码、证书或签名。对于非安全目的(例如缓存密钥、重复数据删除和快速校验和)来说,它仍然没问题,因为攻击者没有动机伪造匹配。使用我们的 MD5 生成器生成一个。
SHA-256:安全完整性
SHA-256 是由 NIST 标准化的 SHA-2 系列的一部分,生成 256 位哈希值,并且在没有实际攻击的情况下保持防碰撞。它是 TLS 证书、软件签名和比特币背后的主力。每当您需要验证数据是否未更改时,请使用它 - 文件下载、文档完整性、API 请求签名。尝试使用 SHA-256 生成器来查看它的实际效果。
bcrypt:密码
以下是困扰许多开发人员的关键见解:密码永远不应该使用 MD5 或 SHA-256 进行哈希处理,正是因为它们速度很快。速度对于校验和来说非常快,但对于密码来说却是灾难性的,因为它让攻击者每秒可以针对被盗数据库进行数十亿次猜测。 bcrypt故意变慢并且包含内置的随机盐,因此相同的密码会产生不同的哈希值,并且暴力破解变得不切实际。它的“成本因素”让您可以随着硬件变得更快而增加工作量。查看它与我们的 bcrypt 哈希生成器 的配合。正是出于这个原因,OWASP 密码存储备忘单推荐 bcrypt(或 Argon2/scrypt)。
快速参考
- MD5 → 非安全指纹、缓存密钥、重复数据删除。绝不是为了安全。
- SHA-256 → 文件完整性、签名、证书、区块链。
- bcrypt(或 Argon2/scrypt)→ 密码存储,总是加盐且缓慢。
识别未知哈希
继承了一个充满神秘哈希值的数据库?长度和格式是重要线索 - 32 个十六进制字符通常表示 MD5,64 表示 SHA-256,以 $2y$ 开头的字符串是 bcrypt。我们的哈希标识符可以为您缩小范围。有关更深入的“为什么快速哈希对密码失败”的故事,请参阅我们关于创建强密码的配套指南。
底线
将工具与工作相匹配:MD5 用于简单指纹,SHA-256 用于完整性,以及慢速加盐算法(例如用于密码的 bcrypt)。选择错误并不是一种风格偏好,而是数据库泄露得到控制和造成灾难性后果的区别。