2016-06-11 170 views
-4

我的代碼PHP password_hash每次都改變

echo password_hash('i=badatphp', PASSWORD_BCRYPT, [ 'cost' => 10 ]); 

我每次運行腳本的密碼更改

我使用PHP 7,和PHP 5我曾經是能夠設置鹽,但現在我不能

我怎麼克服不知道鹽是什麼?

+1

它不是密碼的變化,它是散列。另外,我相信版本7已經放棄了鹹味選項。 –

+2

http://php.net/manual/en/function.password-hash.php ***警告** salt選項已從PHP 7.0.0開始棄用。現在,我們首選簡單地使用默認生成的鹽。*將此稱爲對您問題的回答,如果發生一些破解並將其用作下面的實際答案,我不會感到驚訝。 *嘆息* –

+0

您應該使用提供的隨機鹽,並使用能夠處理隨機鹽的password_verify()驗證密碼。 –

回答

1

原因你可能每次跑步password_hash這種方式是看到一個新的哈希值,因爲它會自動生成一個新的隨機鹽,這將導致不同的散列即使輸入的密碼是一樣的

雖然從PHP 7開始,salt選項是已棄用,但它絕對不會從password_hash中刪除。雖然,你應該注意,棄用的原因是是因爲它計劃刪除(可能在PHP的下一個次要版本中)。它計劃搬遷的原因是因爲它阻止人們使用低劣的生成鹽的手段。由於該功能可以自動爲您生成良好的隨機鹽,因此實際上很少有理由想要提供自己的。

在任何情況下,password_hash只是一個超過crypt的小封裝,它揭示了更多底層API的原語。所以如果你想通過crypt提供你自己的鹽,你仍然可以。雖然我非常不喜歡它,但PHP可以用password_hash這樣做,並且不會導致錯誤。

+0

我完全不理解這個問題,對不起。我不確定cookie如何與這個問題相關,但是如果您將密碼或密碼的散列存儲在cookie中,您肯定會做一些非常錯誤的事情。 – Sherif

+0

@LeeJeffries - 密碼不應存儲在cookie中。可以使用會話並將會話ID存儲在cookie中,也可以使用身份驗證服務並存儲令牌,但不能直接存儲密碼。 – martinstoeckli

0

使用的算法,成本和鹽作爲散​​列的一部分返回。因此,所有需要驗證散列的信息都包含在其中。這允許password_verify()函數驗證散列,而不需要單獨存儲salt或算法信息。 http://php.net/manual/en/function.password-hash.php

作爲文檔狀態,則生成的鹽和存儲在返回哈希所以沒有必要爲鹽傳遞到功能或單獨存放。

請參閱this解答如何使用password_hash的簡單示例。

+2

您不應該在cookie中存儲密碼,因爲它們可以被客戶端查看和編輯。你能詳細說明你想要做什麼嗎? (可能作爲一個新問題,我不太熟悉stackoverflow的規則) – user3389196