我一直在研究加密方法已有一段时间了,到目前为止我发现的是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之间有什么大的区别吗? 我是否足以使用默认功能在注册时加密密码。并且比较用户在登录时加密的密码到数据库中的加密密码?
答案 0 :(得分:5)
我猜测成本只是让它通过功能12次来加密“rasmuslerdorf”这个词
不,成本参数会影响指数量的工作。
但我不明白它是否需要其他措施,例如随机盐才能使其安全。
password_hash()
函数会在您运行时自动生成随机盐;或者,可以通过选项传递自定义盐:
password_hash('bla', PASSWORD_BCRYPT, ['salt' => ...]);
通过传递定制盐,你会被认为知道自己在做什么。出于所有实际目的,您应该安全地坚持使用自动生成的盐。
PASSWORD_DEFAULT和PASSWORD_BCRYPT之间有什么重大差异吗?
通过始终使用当时可用的最强算法(假设您更新PHP),提供PASSWORD_DEFAULT
算法以使您的代码能够面向未来。显着的差异在于存储要求;而Bcrypt总是使用60个字符,你需要为将来使用的任何东西提供更大的存储空间(例如255个字符)。
然后比较用户在登录时加密的密码到数据库中的加密密码?
有关如何验证用户输入的密码的示例,请查看password_verify()
。
答案 1 :(得分:2)
Bcrypt算法是默认算法。因此,PASSWORD_DEFAULT
和PASSWORD_BCRYPT
是相同的。可以在php.ini
文件中配置默认算法,但如果您不知道,则很可能仍然是默认算法。
cost
数字不是哈希值的多少次。通过使用公式2^cost
计算散列的次数。因此,如果费用为12,则会进行2^12
次4096
次的散列。
使用此功能时,您不必考虑盐。它创建salt本身并将其附加到输出哈希:
$[algorithm]$[cost]$[salt 22 chars][rest is the hash]
使用密码散列函数时,切勿触摸散列。要根据密码验证密码,您应该使用password_verify()
。
您正在使用的功能是为了让人们可以在不知道后台发生了什么的情况下散列密码。这是一件好事,因为当涉及到散列密码时,即使你认为你知道自己在做什么,也很容易弄错。