现在有两项措施应该会使这些攻击变得更加困难。为了使创建字典对攻击者来说不切实际,密码与公共随机值(盐)相结合。例如,通常将此值附加到密码字符串中。为了进行字典攻击,必须为每种可能的盐创建包含所有可能密码的字典。使用 n 位长盐将需要比不使用盐多 2 的 n 次方的字典。这使得攻击变得不切实际。暴力问题是通过使用人为减慢速度的技术来解决的。这意味着尝试需要更长的时间,因此无法再有效地进行。作为该过程应该和可能花费多长时间的指示,登录后端服务器可能需要 0.5 - 1 秒。
在下面的部分中,我现在将介绍三种不同的方法来提供这些对策,并使用基于 Bouncy Castle 的 Spring Security 的 Java 代码片段来说明它们。
PBKDF2
基于密码的密钥派生函数 2 由 RSA 实验室于 2000 年发布,作为 PKCS#5 规范的一部分。例如,此函数可以从用户生成的密码生成可用于对称加密的密钥。
但它还提供了我们进行密码散列所需的属性。为了阻止上 平面设计电子邮件列表 述攻击,首先生成随机盐。该盐与计数器连接,然后多次将密钥哈希消息身份验证代码 (HMAC) 应用于该字符串。 HMAC 生成一个使用密钥进行身份验证的哈希值,这意味着只有知道密码才能计算出相同的哈希值。 SHA-1 曾经被用作内部哈希函数,但现在至少 SHA-256 很常见。该函数还有一个迭代计数器。这决定了重复该过程的频率。这个值越大,执行就越耗费资源,因此暴力攻击就越困难,但登录时的验证也需要更长的时间。通过参数化,随着可用计算能力的发展,可以根据应用程序调整该值。 2000 年的原始 RFC 2898 建议迭代次数至少为 1,000,而根据美国国家标准与技术研究院 (NIST) 2016 年的指南,目前的最小值为 10,000。 Spring Security 中的默认值甚至是 185,000 次迭代。
在 Spring Security 中,PBKDF2 从 4.1 版本开始就存在,使用方式如下
其中包含每次自动生成的 64 位盐,以及实际的哈希值。这意味着我们不再需要担心储存盐,因为它是直接保存的。
在一台配备 Intel i9 的开发笔记本电脑上,一次性执行时间约为 700 毫秒,这非常符合我们 0.5 - 1 秒执行时间的先决条件。针对 PBKDF2 的暴力攻击尤其可能使用 GPU 和 FPGA 等专用硬件,因为所使用的哈希函数不需要大量内存。当使用高迭代次数时,NIST 仍然推荐 PBKDF2。