2016-12-25 46 views
0

我碰到其中password_hash使用如下面的PHP代碼來找不到有用的東西。我試圖在本地使用具有相同參數的函數,並且我注意到每次運行腳本時都會生成一個新的散列,這讓我認爲「1」並不意味着特定的散列算法。然而產生的所有散列有這樣的形式:password_hash()在PHP在設置算法爲「1」

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

我使用多個哈希標識符和預期無法達到哈希的類型。顯然我的問題是:「1」是否意味着隨機使用由PHP支持的哈希算法?如果是這樣,爲什麼所有生成的哈希都以「$ 2y $ 10 $」開始?

+2

PASSWORD_DEFAULT'的'值是'1'。 –

+1

該手冊非常清晰(http://php.net/manual/en/function.password-hash.php) - 1表示哈希算法的枚舉值。 –

回答

1

正如你可以閱讀from the docs,有算法的兩個常量,PASSWORD_DEFAULTPASSWORD_BCRYPT。 第一個引用默認/推薦的算法,並且可能會更改,而第二個明確引用BCrypt算法。

它們都具有值1,因爲BCrypt是目前唯一支持的password_hash加密算法。這也說明了你所提到的字符串前綴:

[PASSWORD_BCRYPT]會產生一個標準的crypt()使用 「$ 2Y $」 標識符兼容的哈希值。

所以,通過1具有與使用常數相同的效果,並且你的困惑準確地解釋了爲什麼你應該使用,而不是magic numbers常數。 )

檢查過程的恆定罐的簡單地通過使用echovar_dump顯示它來完成的值:

echo PASSWORD_BCRYPT 
2

參照official docs散列來生成用下面的代碼

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; 

第二parater「ALGO」:

密碼算法常數表示的算法散列密碼時使用。

這是相當簡單的檢查一下這個常量包含

var_dump(PASSWORD_DEFAULT); // int(1) 

因此您的代碼使用PASSWORD_DEFAULT,這在所有的PHP版本至今一直Bcrypt