当使用password_hash时,生成哈希值的最大长度是多少?

17

我正在使用

password_hash($password, PASSWORD_BCRYPT);

为了将密码加密并存储在数据库中,我阅读了一些资料。据我所知,生成的哈希值没有长度限制,但我需要知道最大长度,以便在数据库中定义一个字段,该字段可以容纳所有密码哈希值(在最坏的情况下)。

如果我将明文密码的限制设置为20个字符,那么password_hash()函数的结果会有多长?


4
建议创建一个 VARCHAR(255) 类型的字段用于存储密码。password_hash 当前生成了一个长度为 60 的哈希值,需要存储该值,但如果底层算法发生变化,哈希值的长度也可能会发生改变。哈希值的长度不会受密码长度的影响,但为什么要将密码限制在 20 个字符以内呢? - Mark Baker
另外,还可以查看Openwall的PHP密码哈希框架(PHPass)。它是可移植的,并且针对用户密码的许多常见攻击进行了加固。 - jww
1
PASSWORD_BCRYPTPASSWORD_DEFAULT => 60。 PASSWORD_ARGON2I => 约为96(取决于time_costmemory_cost)。 PASSWORD_ARGON2ID => 约为97(取决于time_costmemory_cost)。 - vee
2个回答

26
password_hash文档中得知:
以下算法目前受到支持: PASSWORD_DEFAULT - 使用bcrypt算法 (自PHP 5.5.0起默认)。请注意,此常量旨在随着时间的推移而更改,以添加新的更强大的算法到 PHP 中。因此,使用此标识符导致的结果的长度随时间可能会发生变化。因此,建议将结果存储在可以扩展到超过60个字符(255个字符是一个不错的选择)的数据库列中。 PASSWORD_BCRYPT - 使用CRYPT_BLOWFISH算法创建散列值。这将生成一个标准的crypt()兼容哈希,使用"$2y$"标识符。结果将始终是一个60个字符的字符串,或失败时为FALSE。
因此,使用PASSWORD_BCRYPTpassword_hash的结果将为60个字符的字符串。

请注意,自 PHP 8.0.0 起,password_hash() 在发生错误时不再返回 FALSE(这已经在官方文档中说明)。 - webcoder.co.uk

3
BCrypt的结果始终是一个60个字符的字符串。Limitless只是函数的输入,这意味着您不应该限制输入密码的长度。
实际上,BCrypt内部仅使用约72个字符,但它接受任意长度的密码。
如果您想以这种方式使用函数来保证其未来兼容性(请注意PASSWORD_DEFAULT)...
password_hash($password, PASSWORD_DEFAULT);

如果您的数据库字段太小,那么您应该将其扩大。新版本的PHP可能会用另一种默认哈希算法替换BCrypt,这可能会生成更长的哈希值。

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