密码散列 - 但安全!

Master the art of fan database management together.
Post Reply
suchona.kani.z
Posts: 263
Joined: Sat Dec 21, 2024 5:45 am

密码散列 - 但安全!

Post by suchona.kani.z »

密码可能不会以纯文本形式存储在数据库中。每个开发人员都知道这一点。数据库内容和密码(也可能在其他地方使用)被访问的风险太大了。然而,在实际实施过程中,经常会出现错误,导致密码泄露屡屡被公开,这可以追溯到各个密码存储不当的情况。为了不成为密码泄露系列的一个入口,这篇博文旨在帮助您选择安全的哈希方法并提供正确参数化的提示。这些示例在 Java 和 Spring Security 中提供。

哈希函数
为了将密码安全地存储在数据库中,我们需要一种解决方案,该解决方案可以生成一个值,该值仍然可以验证密码的正确性,但无法从中恢复明文密码。安全哈希函数恰好提供了以下属性:

单向函数:无法再从函数的结果推断出输入。
抗碰撞性:如果两个哈希值相等,则输入 平面设计电子邮件列表 值也必须相等。安全哈希函数针对不同的输入计算不同的结果。
效率:应快速检查密码结果是否与存储的哈希值相同。然而,这个属性会给我们带来以下问题。
必须不断检查有关哪些哈希函数被认为是安全的信息,因为潜在的攻击者和安全研究人员会定期调查对已知方法的攻击。在这种情况下,攻击主要意味着可以有效地计算碰撞,或者可以根据输出计算相关的输入。例如,MD5 和 SHA-1 不再被认为是安全的,而 SHA-256 和 SHA-512 将在 2020 年被认为是安全的。

然而,单独使用这些被认为是安全的哈希函数并不是持久密码的安全技术。针对这些哈希值的两种相关攻击给我们带来了问题。第一种攻击是字典攻击,也称为彩虹表攻击。所有可以想到的输入都经过预先计算,以便攻击哈希函数,并将其存储在字典中,或者更有效地存储在彩虹表中。如果密码哈希值泄露,攻击者可以在该字典中查找使用了哪个密码。互联网上已经有已知方法的字典,因此我们甚至不必创建字典。第二种攻击是简单的暴力攻击,其中尝试所有输入而不首先创建数据库。这是通过已经提到的经典哈希函数的效率和用户生成的密码的低熵(即分布)来实现的。例如,由于 GPU 可以并行执行大量计算,因此可以使用 hashcat 实现每秒尝试多达 230 亿次 SHA-256 哈希(!)。因此,您可以想象,如果您暴力破解最常用的密码,在大多数情况下,只需几秒钟即可获得适当的纯文本密码。
Post Reply