使用密码哈希时生成的哈希的最大长度?

Posted

技术标签:

【中文标题】使用密码哈希时生成的哈希的最大长度?【英文标题】:Maximum length of generated hash when using password_hash? 【发布时间】:2014-02-24 02:57:28 【问题描述】:

我正在使用

password_hash($password, PASSWORD_BCRYPT);

加密密码以存储在数据库中。正如我所读到的,生成的散列没有长度限制,但我需要知道最大长度,以便我可以使用它来定义我的数据库中可以适合所有密码散列的字段(在最坏的情况下)。

如果我将纯文本密码限制为 20 个字符,password_hash() 结果将是多长时间?

【问题讨论】:

建议创建一个VARCHAR(255).... password_hash 当前创建的哈希值比您需要存储的 60 个字符多,但如果底层算法发生变化,将来可能会发生变化。哈希长度完全不受密码长度的影响,但为什么要将密码限制在 20 个字符以内呢? 另见 Openwall 的 php password hashing framework (PHPass)。它的便携性和强化了对用户密码的一些常见攻击。 PASSWORD_BCRYPT,或PASSWORD_DEFAULT => 60。PASSWORD_ARGON2I => 大约 96(取决于 time_costmemory_cost)。 PASSWORD_ARGON2ID => 大约 97(取决于 time_costmemory_cost)。 【参考方案1】:

来自password_hash documentation:

目前支持以下算法:

PASSWORD_DEFAULT - 使用 bcrypt 算法(PHP 5.5.0 的默认值)。 请注意,此常数旨在随着时间的推移而变化 PHP 中添加了更强大的算法。因此,长度 使用此标识符的结果可能会随着时间而改变。 因此, 建议将结果存储在一个数据库列中 超过 60 个字符(255 个字符是一个不错的选择)。

PASSWORD_BCRYPT - 使用CRYPT_BLOWFISH 算法创建哈希。 这将使用 "$2y$" 生成标准 crypt() 兼容哈希 标识符。 结果将始终是 60 个字符的字符串,或 FALSE 失败时。

因此,使用PASSWORD_BCRYPTpassword_hash 的结果将是一个 60 个字符的字符串。

【讨论】:

请注意,从 PHP 8.0.0 开始,password_hash() 不再返回 FALSE 失败(在官方文档中)。【参考方案2】:

BCrypt 的结果总是一个 60 个字符的字符串。 Limitless 只是函数的输入,这意味着您不(也不应该)对输入的密码设置限制。

实际上 BCrypt 内部只使用大约 72 个字符,但它接受任何长度的密码。

如果您想像这样以未来证明形式使用该函数(注意 PASSWORD_DEFAULT)...

password_hash($password, PASSWORD_DEFAULT);

...那么你应该让你的数据库字段更大。较新的 PHP 版本可能会用另一种默认哈希算法替换 BCrypt,这可能会生成更长的哈希。

【讨论】:

以上是关于使用密码哈希时生成的哈希的最大长度?的主要内容,如果未能解决你的问题,请参考以下文章

SSDEEP哈希算法的最大长度结果

URL片段的最大长度(哈希)

bcrypt,河豚的密码最大长度

想弄懂区块链?哈希算法先了解一下!

LeetCode 1239串联字符串的最大长度[递归 哈希压缩] HERODING的LeetCode之路

关于哈希表查找不成功时的平均查找长度