password_hash()在PHP中将算法设置为'1'

时间:2016-12-25 12:56:39

标签: php algorithm hash

我遇到了密码_hash使用的PHP代码,如下所示:

password_hash($Password, 1, $Options);

我在网上搜索“1”对应的内容,但找不到任何有用的东西。我尝试在本地使用具有相同参数的函数,我注意到每次运行脚本时都会生成一个新的哈希,这使我认为“1”并不意味着特定的哈希算法。但是生成的所有哈希都具有以下形式:

$2y$10$8sYYAM4E9hQI6NvKEghsl.OE.5zdhVs5NN0OiUT6chEbhP9xKTPTe
$2y$10$qaj/qcnQU2XufH4Koy0zAeEV1oJRGu5Kov1z0ycKWCuH0pQtQAJdK

我使用了多个哈希标识符,并且正如预期的那样无法达到哈希的类型。显然我的问题是:“1”是否意味着随机使用php支持的散列算法?如果是这样,为什么生成的所有哈希值都以“$ 2y $ 10 $”开头?

2 个答案:

答案 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_DEFAULTPASSWORD_BCRYPT。 第一个引用默认/推荐算法,可能会发生变化,而第二个明确引用BCrypt算法。

它们都具有值1,因为BCrypt是目前password_hash唯一支持的加密算法。这也解释了你提到的字符串前缀:

  

[PASSWORD_BCRYPT]将使用" $ 2y $"生成标准的crypt()兼容哈希。   标识符

因此,传递1与使用常量具有相同的效果,并且您的困惑解释了为什么您应该使用常量而不是magic numbers。 ;)

检查常量的值当然可以通过使用echovar_dump显示来完成:

echo PASSWORD_BCRYPT