2015-06-02 26 views

回答

7

會發生什麼是新散列密碼將使用新算法 - 顯然。

但是,您不應該擔心這一點,因爲整件事情的設計都考慮到向前兼容性 - 只要您使用的是password_*()(默認算法更改),您的代碼不會被破壞功能正常。
正確地說,我的意思是使用password_verify()

password_verify()接受一個純文本密碼和一個散列,並且它可以通過查看您提供的散列容易地確定使用的算法是什麼。因此,它仍然能夠驗證使用舊算法進行哈希處理的密碼 - 不僅僅是前一個算法,還包括任何受支持的算法。

實際上,PASSWORD_DEFAULT常數的唯一目的是您可以輕鬆地將較舊的哈希移植到新算法(一旦添加了一個新算法)。這發生在下列方式:

  • 當用戶登錄時,您驗證通過password_verify()自己的密碼(具有PASSWORD_<name>不斷將工作的任何哈希算法)。
  • 您可以撥打password_needs_rehash(),如果您剛剛驗證的密碼使用的是較舊的算法(或較低的'費用'參數),它將返回布爾值TRUE。
    • 如果確實返回了布爾TRUE,現在可以用舊算法替換舊算法;你可以在登錄時這樣做,因爲用戶剛剛給你的密碼你證實它是正確的。

綜上所述 - 這是一個真正的,實在精心設計的API,它解決了問題,你,你有沒有想過。不要擔心。

編輯(在評論中指出):

應當注意的是,新的算法將相當probly導致更長的散列長度,所以如果你在數據庫中存儲密碼 - 不限制字段​​的長度(即使用varchar(255)字段)。

+0

謝謝。這很有幫助。 – Ambitions

+0

不客氣。::) – Narf

+0

有一個實際上重要的區別,可能導致一些新的哈希無法驗證。由於我們不知道將來會使用什麼算法,這可能意味着哈希長度可能會改變。這就是爲什麼手冊建議使用'VARCHAR(255)'來存儲散列,儘管bcrypt哈希最大長度是〜55個字符。 – Mike

1

只是爲了澄清,我想補充一點,PHP使用以下結構。因此,password_needs_rehash()password_verify()函數將檢查算法和成本,並且做他們的工作,以保持一切兼容和正確。

來源:http://php.net/manual/en/faq.passwords.php

PHP Hashed Password Structure

相關問題