我目前正在用 PHP 开发一个小项目,因为它涉及用户身份验证,所以我一直在研究我有哪些关于散列的选项。我选择 PBKDF2 主要是因为它的迭代特性、哈希算法的灵活性和可扩展性。
我一直在阅读的是 8 毫秒(或 0.008 秒)是生成哈希的目标。为什么这个特定值是目标?我理解使生成哈希需要更多时间的原因,但为什么要专门用 8ms 呢?它只是花费时间和安全性之间的一个很好的平衡值,还是有更具体的原因?
理论
假设我有一台服务器可以使用 SHA256 进行 6400 次迭代,密钥长度为 6 个字符,盐长度为 X 个字符,密码长度为 Y 个字符,时间不到 9 毫秒。我不确定这是否是对我的“恐惧”,但我认为这还不够,主要是因为迭代次数低且密钥长度极短,尽管它已被盐渍化并与所有意图和散列目的是一种安全的算法。在专门用于“破解”哈希的系统上,我的系统上的 9 毫秒将大大减少。同样,这些值只是理论上的——不要过多地研究它们。
所以,假设我进行了 64000 次迭代,密钥长度为 60。这需要将近 90 毫秒的时间来计算,而且我认为这对于所有意图和目的都是安全的,因为它的迭代次数很高,它是输出密钥长度和生成所需的时间。
更重要的是,计算后一个哈希(与第一个相比)需要 10 倍的时间,尽管它在原始环境中运行时比“8ms 规则”要长约 91%,但无论它是在哪个系统上计算的。
那么,这个 8ms 的值最初是从哪里来的,究竟是基于什么推荐的呢?8ms 是基于您环境的计算时间,还是通过其他方式计算(例如通过在 GPU 上运行的专用哈希应用程序)?