Php 存储bcrypt散列

Php 存储bcrypt散列,php,hash,crypt,bcrypt,password-storage,Php,Hash,Crypt,Bcrypt,Password Storage,根据PHP的文件,bcrypt盐是由 $2a$,一个两位数的成本参数,“$”,以及字母表中的22位数“/0-9A-Za-z” 因此,如果我使用crypt()函数散列我的密码,结果输出将包括前7个字符($2a$10$,如果10是成本参数),作为salt的一部分-并且,根据我在互联网上找到的所有示例,这个完整的输出将写入db 我想知道将这些第一个字符与其余的salt和加密数据一起存储有什么意义。它们的意思对我来说是完全清楚的,但我真的不明白为什么这些信息应该和散列的其余部分一起写。它们不是“仅仅”关

根据PHP的文件,bcrypt盐是由

$2a$,一个两位数的成本参数,“$”,以及字母表中的22位数“/0-9A-Za-z”

因此,如果我使用crypt()函数散列我的密码,结果输出将包括前7个字符($2a$10$,如果10是成本参数),作为salt的一部分-并且,根据我在互联网上找到的所有示例,这个完整的输出将写入db


我想知道将这些第一个字符与其余的salt和加密数据一起存储有什么意义。它们的意思对我来说是完全清楚的,但我真的不明白为什么这些信息应该和散列的其余部分一起写。它们不是“仅仅”关于算法和计算的自适应成本的信息吗?那么,存储这些与应用程序相关的信息有什么好处呢?还有(即使听起来很幼稚)为什么要将它们透露给攻击者,最终可能会窃取我的数据库?

原因在于crypt的工作方式。它的设计目的是让您可以执行以下操作

if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
    //Verified
}
因此,通过存储所有内容,您无需每次都重新创建盐串

盐的作用不是为了保密。事实上,这并不是秘密。这是为了衬托彩虹的桌子。记住,如果他们能抓到你的数据库,他们也很有可能得到其他东西,所以把盐放在其他地方不会给你带来太多

再说,盐也帮不了什么忙。BCrypt被设计为CPU硬,这意味着暴力强迫(即使知道盐)是不切实际的。这就是为什么你有一个成本参数。所以不要担心“隐藏”盐。只要把它放在密码旁边,你就没事了


更不用说如果将来你想调整你的算法会发生什么?例如,假设您希望由于安装了更好的硬件而增加成本参数。如果您没有将此信息与密码一起存储,则所有存储的密码都将无效。这样,存储的每个密码都具有验证密码所需的所有信息。这样,如果哈希值是当前默认值,则可以检查有效登录,如果不是,则可以使用新的哈希值重新刷新和更新数据库。它可以防止与更新和改进哈希方法相关的问题…

谢谢,ircmaxell!事实上,我已经很清楚为什么盐必须与密码一起存储。我只是想知道为什么我还要存储关于算法(crypt()输出的前7个字符)和成本的信息。你回答的第二部分消除了我所有的疑虑。