password_hash: 与手动生成盐相比,自动生成盐有什么优势?

password_hash: any advantages of automatically generated salt over manual?

如果我理解正确,任何 PHP 升级,或移动到不同的服务器都会使以前散列的密码(存储在数据库中)变得无用?因为盐在新系统上会有所不同。

这让我对自动生成盐的用例感到好奇。

盐是为每个密码生成的,并存储为您从 password_hash 函数返回的字符串的一部分。因此每次哈希密码时都会有所不同。我们在密码中使用 salt 的原因是每次创建密码时都会获得一个新的哈希值,因此如果两个用户使用密码 "hunter2",他们将作为完全不同的值存储在数据库中,从而使彩虹表变得无用。

所以移动到新服务器不会使以前散列的密码变得无用。

password_hash() 现在(从 PHP 7.1.* 开始)仅使用 bcrypt 来散列密码。 Salt 与哈希一起保存,因此升级或移动到另一台服务器不会使哈希变得无用。

正如 @Jay Blanchard 所说 ,汽车盐是一个优势,因为您不必关心。一切都方便自动处理。

你甚至 不应该 自己创建盐,因为它也非常 easy to make a mistake 自己生成盐(非随机盐,盐的随机来源不正确等)。

此外,salt 选项在 password_hash bcrypt 算法中从 PHP 7.0.0 开始被弃用,因此 PHP 将始终使用自动生成的盐.

如果你想使用手动盐,你可以使用它。就算你换了新服务器,之前的密码也不会没用。

诀窍是您可以在通常存储站点常量的地方存储手动盐字符串,例如 Db 用户名、DB 密码....

因此,即使您移至新服务器,您仍然会使用手动加盐字符串和之前加盐的数据。