歡迎來到小豬圈!

2008-10-07

關於密碼儲存

  • 使用者傳來的密碼絕不可以直接(以明文)儲存!避免有心人士取得密碼表後直接利用。
  • 一個常見的做法是利用雜湊(Hash)函數,將密碼編碼後儲存。
  • 例: mypassword 這段字用 md5() 編碼的結果是 34819d7beeabb9260a5c854bc85b3e44 。
    
    <?php
    
    // Outputs: 34819d7beeabb9260a5c854bc85b3e44 
    echo md5('mypassword');
    ?>
  • 但是,這樣我就知道 34819d7beeabb9260a5c854bc85b3e44 就是 mypassword 用 md5() 計算的雜湊值啦!
  • 所以有心人士可以事先將所有可能用來當密碼的字串,用 md5() 或其它雜湊函數先行編碼、記錄下來(就是所謂的 Rainbow Tables),取得密碼表後,只要一比對就可以知道密碼。
  • 一個應對的方法就是加鹽(salt, see:Rainbow table - Wikipedia, the free encyclopedia),意思是將密碼加上一段字串後,再計算雜湊值。
  • 例:
    
    <?php
    
    // Outputs: f5c8bdfe11ef33040331747636877629 
    echo md5('salt' 'mypassword');
    ?>
  • 加了 salt 後,即使有心人士比對出原文,也不能直接拿來使用,還得找出 salt 才行。可針對使用 Rainbow Tables 的情況,加長 salt 的長度或使用特殊字元(鍵盤上無法直接打出來的),增加被找到的難度與所需時間。
  • 在擁有大量密碼情況下,常有重覆的雜湊值出現的情況,除了碰撞外,有可能是不同的使用者使用了相同的密碼,或是像 123456 之類的隨意輸入的密碼,有心人士可能會刻意針對這些值(使用者)。
  • 這時可以利用隨機函數產生 salt ,這樣即使用同樣的密碼,每次計算出來的雜湊值都不一樣。
    
    <?php
    
      $salt 
    md5(mt_rand());
      echo 
    $salt md5($salt 'password');
    ?>
  • 以下為簡單的範例:
  • 
    <?php
    
    function hash_pwd($pwd$salt false){
      if (!
    $salt) {
        
    $salt md5(mt_rand());
      }
      return 
    $salt md5($salt $pwd);
    }

    function 
    compare_pwd($pwd$pwd_hashed){
      
    $salt substr$pwd_hashed032 );
      return 
    $pwd_hashed === hash_pwd($pwd$salt);
    }

    $user_pwd 'password';
    $user_pwd_hashed hash_pwd($user_pwd);

    var_dump$user_pwd_hashed );
    var_dump(compare_pwd($user_pwd$user_pwd_hashed));
    ?>
  • 若使用 PHP 5.1.2 以上版本,建議改用內建的 hash() 函數,並換成其它較複雜的雜湊演算法,如 WHIRLPOOL。
  • 對一般使用網站服務的使用者,要知道網站有沒有用雜湊函數之類的方法儲存你的密碼,只要使用網站提供的“忘記密碼”的服務,一般來說,網站會自動重設一組隨機密碼讓你使用,但若是網站會傳回你原本的密碼的話…。
  • 在每個網站服務最好都使用不同的帳號、密碼,避免在某個網站被破,其它服務也遭殃。例如在某網站註冊時填的帳號、密碼和 E-mail,“剛好”都跟該 E-mail 用的一樣…。
  1. Rainbow Hash Table 與密碼破解 | 資安之眼
  2. Blog.XDite.net » 淺談 BBS 資料的安全性

No comments:

Post a Comment

Comment Form Message

標籤分類

Blog Archive

Labels

Google Analytics Tracking Code

About Me

My photo
Keelung, R.O.C, Taiwan
一個不學無術、混吃等死的傢伙…