php
  • bcrypt
  • crypt
  • 2016-07-21 43 views 1 likes 
    1

    在我們開始之前:是的我知道我應該使用PHP的password_hash函數,當實際上存儲密碼。這是一個關於PHP哈希系統內部的問題。PHP bcrypt不一致的鹽

    所以我在前幾天搞亂了PHP的crypt函數,我注意到bcrypt有一些奇怪的行爲。

    $password = "totallyagoodpassword"; 
    $salt = "hereisa22charactersalt"; 
    
    $parameter = '$2y$10$' . $salt; 
    
    echo $parameter . PHP_EOL; 
    echo crypt($password, $parameter); 
    

    根據PHP's manual,此代碼應哈希 「totallyagoodpassword」 使用bcrypt,鹽析爲 「hereisa22charactersalt」。該散列的輸出應該是方案(「$2y$10$」),接着是鹽的22個字符,然後是31個字符的散列。因此,我應該預期「$2y$10$hereisa22charactersalt」,然後是31個隨機的base64字符。

    於是我運行代碼:

    $2y$10$hereisa22charactersalt 
    $2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG 
    

    我不禁注意到我傳入crypt鹽和說出來的鹽是如何不一樣的;具體而言,最後一個角色神奇地變成了「e」。在用不同的salt運行這個之後,我仍然會得到同樣的怪癖,即輸出哈希的最後一個字符是唯一不同的。

    我不是PHP的開發人員,所以我確信這種行爲背後有一些邏輯。但我很好奇。

    回答

    0

    該文檔沒有聲明輸出將包含整個22字節的鹽。此外,crypt documentation上的示例顯示鹽的最終「$」。

    crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')

    生產:

    $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

    +0

    大部分的研究,我上完成bcrypt似乎表明鹽是128位,其中以base64(忽略填充)編碼時,使最多22個字符。對我來說,PHP並不需要22個字符,然後不會全部使用它們。 另外我嘗試了和沒有最後的「'''」,它似乎沒有任何區別。 – Kilo

    相關問題