在PHP中,哪种/哪些密码哈希算法最安全?

4

哪些是PHP中最安全的密码哈希算法?

速度并不重要,因为我正在对哈希进行固定时间的迭代(而不是固定次数的迭代)。我感兴趣的是数学强度。

我的直觉告诉我是whirlpool,它是最大且最慢的。或者是SHA-512。专家推荐哪一个?

是否有其他算法可以提供超过512位的哈希值?


4
使用 password_hash()。这就是你需要知道的全部。不要重复造轮子。 - John Conde
2个回答

8
使用函数password_hash()来进行密码加密。如果你指定了PASSWORD_DEFAULT,它会选择推荐的算法,目前是BCrypt。如果算法发生变化,你不必更改代码。如果需要的话,你也可以明确选择该算法使用常量PASSWORD_BCRYPT,但这与自动更新到更好的算法的意图相抵触。
使用password_verify()来验证密码。
PHP将使用的算法和盐添加到哈希中,因此它将知道验证所需的一切。这样,当新的算法在PHP的未来版本中变得可用时,它们将自动使用,并且那些密码将具有更强的哈希。
使用password_needs_rehash()检查是否需要重新计算密码哈希值,以防默认值发生更改。
如果密码验证成功,则可以对其进行重新计算哈希并存储它。这样,在用户登录时,您将自动更新旧密码的较弱哈希。

2
为了跟进这个问题,你使用像BCrypt这样的算法的原因是它专门用于密码保护,而不是SHA算法。它被特别设计成计算速度缓慢。对于用户登录来说这不是问题,但它比暴力破解SHA要慢得多。 - haxim

4

scrypt是目前被认为最安全的哈希算法之一,因为它受限于RAM,因此难以并行化。然而,在许多现有系统中,如果有任何支持,也不是本地支持。

bcrypt是其次。它没有当前已知的加密弱点,被广泛支持,并且具有广泛可调的工作因子。它也是password_hash()的当前默认算法。

其他所有内容都不及格。

除非您拥有密码学学位,否则不要自己编写哈希或加密方案。


2023更新

值得注意的是,自PHP7.2 [发布于2017年11月]以来,Argon2哈希已经可以用于password_hash(),只要PHP使用了相关选项进行构建。特别是Argon2id允许指定时间和内存成本参数,使其可能比bcrypt和scrypt更好。


1
你可以通过PECL 安装scrypt - Scott Arciszewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接