我知道 MD5 是最易受攻击的哈希算法
从技术上讲(我们在这里是技术性的)有比 MD5 更糟糕的算法。
并且特别容易受到碰撞
是的,人们可以使用不同的明文创建所需的散列。这不太可能随机发生,但可能是恶意发生的。
但是碰撞漏洞并不是很危险,有人可能会利用它作为优势,但这完全是运气。
不是纯粹的运气。有一些技术可以找到产生所需 MD5 的明文。对于不同的问题,这是一个很好的主题。
好的,假设我使用 MD5 存储密码。
哎哟。您不应该使用 MD5 的主要原因是因为它是通用(快速)哈希。
您应该使用(慢)密码哈希,例如
- 通常推荐使用 BCrypt,但请务必对输入数据运行快速 SHA-2 哈希,这样超长密码不会被 BCrypt 截断
- PBKDF2,但它对 GPU 的抵抗力较低,因为它的内存要求较低。
- 如果你有足够高的工作系数,SCrypt 比 BCrypt 更好。否则对 GPU 来说会更糟。(同样,由于更高或更低的内存要求)
- 密码哈希比赛的获胜者可能比前面提到的还要好,但还没有经受住时间的考验,所以暂时不要使用它。它被称为 Argon2,并且有单独的 CPU 时间和内存负载的工作因子设置。(好的!)
- 可以使用重复的 SHA-2 代替 PBKDF2(仍然不是 GPU 抗性),但是要有效地实现重复(即抗蛮力)更加棘手,因为 SHA-2 实际上是通用(快速)哈希。
这些选项中的大多数默认生成随机 Salt,但您应该验证是否是这种情况!
最好在散列之前在密码之前包含一些 Pepper(约 72 位熵)。Pepper 对于您的所有用户可以是相同的,但应该存储在数据库外部的文件中,以便无法通过 SQL 注入找到组件。
确保您的工作因素在您的目标硬件上需要大约 100 毫秒(具有适当的 DoS 保护)(知道攻击者将使用更快的硬件进行暴力破解)
当然,没有多少散列可以保护弱passwords,所以包括密码强度要求。
碰撞漏洞......攻击者有什么办法可以利用它作为优势?
在密码哈希存储的上下文中,这可能对攻击者没有帮助。