2017-09-03 105 views
0

具體而言,使用PASSWORD_DEFAULT算法時,爲每php pagePHP的password_hash()向後兼容?

「請注意,此常數被設計隨時間的新的和更強的算法被添加到PHP改變。爲此原因,結果的長度從使用這個標識符會隨着時間的推移而改變,因此建議將結果存儲在一個可以擴展到60個字符以上的數據庫列中(255個字符是個不錯的選擇)。「

「注意:更新到支持的算法通過此功能(或更改默認的)必須遵循以下規則: 任何新的算法必須在覈心至少1日前PHP的充分釋放例如,如果在7.5.5中添加了新的算法,那麼直到7.7(因爲7.6將是第一個完整版本),它將不適合默認,但是如果在7.6中添加了不同的算法。 0,它也有資格在默認7.7.0處 默認值只能在完整版本(7.3.0,8.0.0等)中修改,而不能在修訂版本中修改。唯一的例外是在在當前默認情況下發現嚴重安全漏洞時應急。「

因此,當將PHP升級到對PASSWORD_DEFAULT使用不同算法的版本時,如果用戶使用舊算法對密碼進行哈希處理,是否會阻止用戶登錄?

+1

查看'password_verify'的文檔 – PeeHaa

+0

謝謝。 「請注意,password_hash()返回算法,成本和salt作爲返回哈希的一部分,因此,驗證哈希所需的所有信息都包含在其中,這允許驗證函數驗證哈希,而不需要單獨存儲鹽或算法信息「。 – GregCatalano

回答

1

簡短的回答是肯定的,它是向後兼容的,爲您的存儲允許更長的密碼哈希長度。

當您生成密碼時,您將以特定格式獲取密碼。

我已經使用bcrypt和更新的argon2i哈希生成了兩個密碼。 (在PHP 7.2中引入libsodium

僅供參考:我的代碼是基於libsodium擴展,因爲我沒有下載php 7.2,並且不打算爲別名安裝sodium_compat。 php 7.2語法將不包含任何名稱空間。

$bcrypt = password_hash('insecurepassword', PASSWORD_BCRYPT); 
$argon2i = \Sodium\crypto_pwhash_str('insecurepassword', \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE); 

var_dump($bcrypt, $argon2i); 

我,當我跑的輸出,這是此

string(60) "$2y$10$jiT0NF3u426kguHes8ZBputRE/n9OSdPi5HhHvEWW4mX1XDwKwy1e" 
string(96) "$argon2i$v=19$m=32768,t=4,p=1$Ho4Vzgp5nzQkLlp99P+ViA$bDqX8UUlSnfLRCfFBzBnFhWr/hzHzuuUCfZ0LSIns64" 

兩個密碼都相同的格式更多或更少。如果你爆炸$你最終會得到驗證密碼所需的每一個難題。

第一部分包含算法。 2y for bcrypt,argon2i for ... argon2i。 (驚喜!)

下一個位包含配置選項,所以在bcrypt的情況下的成本。在argon2i的情況下,有一些額外的配置。

最後一節包含要檢查的算法的實際密碼和salt。

對於更多的視覺崩潰結帳php docs

即使我已經使用了一些不同的功能演示一些輸出,有可能被接受,在7.2推出了針對argon2i哈希支持的password_hash功能的rfc

所以當那個時候到來的時候,password_verify會「正常工作」,無論你是否給它一個bcryptargon2i散列來驗證密碼。

+0

真棒回答,謝謝。我沒有意識到算法存儲在哈希中。 – GregCatalano

1

是單向散列算法,不能解密散列。

使用password_verify檢查,如果密碼存儲的哈希值匹配:

<?php 
    $hash = 'your-hash'; 

    if (password_verify('pass', $hash)) { 
    echo 'Password is valid'; 
    } else { 
    echo 'Password is not valid!'; 
    }