使用PHP考慮這行代碼:如果他們在PHP密碼庫中更改了PASSWORD_DEFAULT會發生什麼?
$password = password_hash($password, PASSWORD_DEFAULT);
,如果他們改變了默認的密碼散列算法會發生什麼?我的意思是我會在數據庫中加密密碼。然後,從我自己的理解中,將不可能檢查密碼,因爲哈希算法將完全改變。
使用PHP考慮這行代碼:如果他們在PHP密碼庫中更改了PASSWORD_DEFAULT會發生什麼?
$password = password_hash($password, PASSWORD_DEFAULT);
,如果他們改變了默認的密碼散列算法會發生什麼?我的意思是我會在數據庫中加密密碼。然後,從我自己的理解中,將不可能檢查密碼,因爲哈希算法將完全改變。
會發生什麼是新散列密碼將使用新算法 - 顯然。
但是,您不應該擔心這一點,因爲整件事情的設計都考慮到向前兼容性 - 只要您使用的是password_*()
(默認算法更改),您的代碼不會被破壞功能正常。
正確地說,我的意思是使用password_verify()
。
password_verify()
接受一個純文本密碼和一個散列,並且它可以通過查看您提供的散列容易地確定使用的算法是什麼。因此,它仍然能夠驗證使用舊算法進行哈希處理的密碼 - 不僅僅是前一個算法,還包括任何受支持的算法。
實際上,PASSWORD_DEFAULT
常數的唯一目的是您可以輕鬆地將較舊的哈希移植到新算法(一旦添加了一個新算法)。這發生在下列方式:
password_verify()
自己的密碼(具有PASSWORD_<name>
不斷將工作的任何哈希算法)。password_needs_rehash()
,如果您剛剛驗證的密碼使用的是較舊的算法(或較低的'費用'參數),它將返回布爾值TRUE。
綜上所述 - 這是一個真正的,實在精心設計的API,它解決了問題,你,你有沒有想過。不要擔心。
編輯(在評論中指出):
應當注意的是,新的算法將相當probly導致更長的散列長度,所以如果你在數據庫中存儲密碼 - 不限制字段的長度(即使用varchar(255)
字段)。
只是爲了澄清,我想補充一點,PHP使用以下結構。因此,password_needs_rehash()
和password_verify()
函數將檢查算法和成本,並且做他們的工作,以保持一切兼容和正確。
謝謝。這很有幫助。 – Ambitions
不客氣。::) – Narf
有一個實際上重要的區別,可能導致一些新的哈希無法驗證。由於我們不知道將來會使用什麼算法,這可能意味着哈希長度可能會改變。這就是爲什麼手冊建議使用'VARCHAR(255)'來存儲散列,儘管bcrypt哈希最大長度是〜55個字符。 – Mike