Bcrypt 是否需要任何东西来使其安全
Does Bcrypt require anything to make it secure
我研究加密方法有一段时间了,到目前为止我发现 Bcrypt 是目前最好的加密方法之一。我还不明白 Bcrypt 的精确工作方式。我知道解决问题需要更长的时间,这就是为什么暴力破解如此困难的原因。
但我不明白是否需要其他措施,例如随机盐来确保安全。特别是在阅读了 md5 以及如何在哈希变得安全之前几乎强制使用随机盐之后。
我在php.com上找到的示例代码是这样的:
$options = [ 'cost' => 12, ];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>
我猜成本只是让它运行了 12 次函数来加密单词 "rasmuslerdorf"。 "PASSWORD_BCRYPT" 选择 Blowfish 算法。
PASSWORD_DEFAULT和PASSWORD_BCRYPT有什么大的区别吗?
我在注册时使用默认功能加密密码就够了吗?而不是将用户登录时输入的密码加密后与数据库中的加密密码进行比较?
Bcrypt 算法是默认算法。所以,PASSWORD_DEFAULT
和 PASSWORD_BCRYPT
是一样的。默认算法可以在您的 php.ini
文件中配置,但如果您不知道,那么它很可能仍然是默认算法。
cost
这个数不是散列了多少次。使用公式 2^cost
计算散列次数。因此,如果成本是 12,那么它将被散列 2^12
次 (4096
)。
您在使用该函数时不必考虑盐。它自己创建盐并将其附加到输出哈希:
$[algorithm]$[cost]$[salt 22 chars][rest is the hash]
使用密码散列函数时,切勿触摸散列。要根据 has 验证密码,您应该使用 password_verify()
.
您使用的功能是为了让人们可以在不知道后台发生了什么的情况下散列密码。这是一件好事,因为在散列密码时很容易弄错,即使您认为自己知道自己在做什么。
I'm guessing the cost simply makes it so it runs through the function 12 times to encrypt the word "rasmuslerdorf"
不,成本参数会影响要完成的工作量。
But I don't understand whether it requires other measures such as a random salt to make it secure.
password_hash()
函数会在您 运行 时自动生成随机盐;或者,可以通过选项传递自定义盐:
password_hash('bla', PASSWORD_BCRYPT, ['salt' => ...]);
通过传递自定义盐,您被假定知道自己在做什么。出于所有实际目的,您应该安全地坚持使用自动生成的盐。
Are there any big differences between PASSWORD_DEFAULT and PASSWORD_BCRYPT?
PASSWORD_DEFAULT
算法始终使用当时可用的最强算法(前提是您更新 PHP),以确保您的代码永不过时。显着的区别在于存储要求。而 Bcrypt 始终使用 60 个字符,您需要为将来使用的任何内容提供更大的存储空间(例如 255 个字符)。
And than compare the password after encrypting it that the user enters on login to the encrypted password in the database?
有关如何验证用户输入的密码的示例,请查看 password_verify()
。
我研究加密方法有一段时间了,到目前为止我发现 Bcrypt 是目前最好的加密方法之一。我还不明白 Bcrypt 的精确工作方式。我知道解决问题需要更长的时间,这就是为什么暴力破解如此困难的原因。
但我不明白是否需要其他措施,例如随机盐来确保安全。特别是在阅读了 md5 以及如何在哈希变得安全之前几乎强制使用随机盐之后。
我在php.com上找到的示例代码是这样的:
$options = [ 'cost' => 12, ];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>
我猜成本只是让它运行了 12 次函数来加密单词 "rasmuslerdorf"。 "PASSWORD_BCRYPT" 选择 Blowfish 算法。
PASSWORD_DEFAULT和PASSWORD_BCRYPT有什么大的区别吗? 我在注册时使用默认功能加密密码就够了吗?而不是将用户登录时输入的密码加密后与数据库中的加密密码进行比较?
Bcrypt 算法是默认算法。所以,PASSWORD_DEFAULT
和 PASSWORD_BCRYPT
是一样的。默认算法可以在您的 php.ini
文件中配置,但如果您不知道,那么它很可能仍然是默认算法。
cost
这个数不是散列了多少次。使用公式 2^cost
计算散列次数。因此,如果成本是 12,那么它将被散列 2^12
次 (4096
)。
您在使用该函数时不必考虑盐。它自己创建盐并将其附加到输出哈希:
$[algorithm]$[cost]$[salt 22 chars][rest is the hash]
使用密码散列函数时,切勿触摸散列。要根据 has 验证密码,您应该使用 password_verify()
.
您使用的功能是为了让人们可以在不知道后台发生了什么的情况下散列密码。这是一件好事,因为在散列密码时很容易弄错,即使您认为自己知道自己在做什么。
I'm guessing the cost simply makes it so it runs through the function 12 times to encrypt the word "rasmuslerdorf"
不,成本参数会影响要完成的工作量。
But I don't understand whether it requires other measures such as a random salt to make it secure.
password_hash()
函数会在您 运行 时自动生成随机盐;或者,可以通过选项传递自定义盐:
password_hash('bla', PASSWORD_BCRYPT, ['salt' => ...]);
通过传递自定义盐,您被假定知道自己在做什么。出于所有实际目的,您应该安全地坚持使用自动生成的盐。
Are there any big differences between PASSWORD_DEFAULT and PASSWORD_BCRYPT?
PASSWORD_DEFAULT
算法始终使用当时可用的最强算法(前提是您更新 PHP),以确保您的代码永不过时。显着的区别在于存储要求。而 Bcrypt 始终使用 60 个字符,您需要为将来使用的任何内容提供更大的存储空间(例如 255 个字符)。
And than compare the password after encrypting it that the user enters on login to the encrypted password in the database?
有关如何验证用户输入的密码的示例,请查看 password_verify()
。