我遇到了密码_hash使用的PHP代码,如下所示:
password_hash($Password, 1, $Options);
我在网上搜索“1”对应的内容,但找不到任何有用的东西。我尝试在本地使用具有相同参数的函数,我注意到每次运行脚本时都会生成一个新的哈希,这使我认为“1”并不意味着特定的哈希算法。但是生成的所有哈希都具有以下形式:
$2y$10$8sYYAM4E9hQI6NvKEghsl.OE.5zdhVs5NN0OiUT6chEbhP9xKTPTe
$2y$10$qaj/qcnQU2XufH4Koy0zAeEV1oJRGu5Kov1z0ycKWCuH0pQtQAJdK
我使用了多个哈希标识符,并且正如预期的那样无法达到哈希的类型。显然我的问题是:“1”是否意味着随机使用php支持的散列算法?如果是这样,为什么生成的所有哈希值都以“$ 2y $ 10 $”开头?
答案 0 :(得分:2)
参考official docs使用以下代码生成哈希
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
第二个副手“algo”:
密码算法常量,表示在对密码进行散列时使用的算法。
检查此常量包含的内容非常简单
var_dump(PASSWORD_DEFAULT); // int(1)
因此你的代码使用PASSWORD_DEFAULT,到目前为止所有的PHP版本都是Bcrypt
答案 1 :(得分:1)
正如您可以阅读from the docs,算法有两个常量,PASSWORD_DEFAULT
和PASSWORD_BCRYPT
。
第一个引用默认/推荐算法,可能会发生变化,而第二个明确引用BCrypt算法。
它们都具有值1
,因为BCrypt是目前password_hash
唯一支持的加密算法。这也解释了你提到的字符串前缀:
[PASSWORD_BCRYPT]将使用" $ 2y $"生成标准的crypt()兼容哈希。 标识符
因此,传递1
与使用常量具有相同的效果,并且您的困惑解释了为什么您应该使用常量而不是magic numbers。 ;)
检查常量的值当然可以通过使用echo
或var_dump
显示来完成:
echo PASSWORD_BCRYPT