2016年10月7日 星期五

為什麼用bcypt比md5還要好?

        以前的儲存密碼方式,很多都是由使用者輸入的密碼直接轉換成md5加密進資料庫,看到資料庫的密碼欄位裡各種密密麻麻的英文加數字,看起來好踏實啊!不僅看起來安全,也完全符合了「 絕對不要知道使用者密碼」的原則。

        某天心血來潮想研究md5,去google了一下:


        咦?趕快再點進去看看.........



        哇咧,怎麼一堆網站提供線上解碼......點進去幾個還真能解.............

        點進去看之後,發現每一個解碼網站的原理都是在資料庫裡面儲存了大量的md5雜湊後的字元,及對應雜湊前的字元,所以當使用者進入類似的解碼網站,每使用他們的「md5雜湊」功能,再把md5過後的字元回傳給你之後,同時會儲存在他們的資料庫裡,使用的人數越多,獲得的對應組也越多,最後,能「破解」的md5加密也越來越多。

        網站根本不是針對md5加密去反譯回去,而是利用md5的演算法特點,也就是一組密碼,永遠都會被雜湊成一模一樣的字元

        要解決這個問題,我們只要每次加密都是不同字元就可以了,bcrypt登場!

        hash是單向的演算法,雜湊後的資料不能回到原本的形式,而目前被檢驗過最安全的雜湊演算法是bcrypt,雖然會消耗點時間,但是最後的雜湊碼將會非常安全。

        以下來示範bcrypt的實際運作方式:

$hash_password = password_hash('1234', PASSWORD_DEFAULT);

echo $hash_password;
echo "<br>";

if (password_verify("1234", $hash_password)) {
    echo "correct";
} else {
    echo "fail";
}

        password_hash的作用是讓字串雜湊成一個雜湊碼,而下方的password_verify則是判斷字串是不是跟之前相同字串的雜湊碼一樣,結果:


        多執行幾次會發現每一次雜湊的結果都不一樣,但一樣辨識成功





    
    這樣一來,就算知道了資料庫裡的雜湊值,要拼回去原密碼幾乎是不可能的事。


         結論:

        一個md5的演算法,產生出唯一加密碼,很容易decrypt。

        一個bcrypt的演算法,產生出各種不同的雜湊碼,幾乎不可能還原。

        bcrypt是目前基礎的開發人員,最容易實作的一項加強密碼安全性的方式。



        ps. 如果bcrypt的雜湊出的雜湊碼想直接貼在程式裡測試的時候,記得使用單引號,
ex.


$hash_password = '$2y$10$RfrGzWlCMfeFm3QcSrK7m.ju2IV3EMdWlYtsYFz9x8JPcCzXav.9q';
字串裡有$,雙引號會認為是變數。



參考資料:


http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php
http://php.net/manual/en/function.password-hash.php
http://php.net/manual/en/function.password-verify.php
https://www.tenlong.com.tw/items/9863477788?item_id=1007177



沒有留言:

張貼留言