星期五, 3月 02, 2012

MD5 + Salt

問題: 特殊方法取得用戶資料表後,在沒有加鹽的情況下,很容易遭受密碼破解[md5('密碼');]。

 以下展示MD5演算法+ salt的加密方式。

1. identifier.php 行 23
 
private $letters = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
 
 * 產生字典字串 

2. identifier.php 行 72-73
 
public function getString($length = 12) {
 $str = str_repeat($this->letters, 10);
$hash = substr(str_shuffle($str), 0, $length);
return $hash;}
 
* 重複字典字串10次後亂數打亂,再擷取前$length字元作為雜湊。

 3. install.php 行 256
 
$salt = ( defined('MANUAL_PASSWORD_SALT') ) ? MANUAL_PASSWORD_SALT : $vh->getString(64);
 
* MANUAL_PASSWORD_SALT定義為$vh->getString(64)

 4. install.php 行 315
 
define('PASSWORD_SALT', $salt);
 
* 定義PASSWORD_SALT=$salt

 5. user.php 行 208-210
 
public function encryptPassword($uPassword, $salt = PASSWORD_SALT) {
return md5($uPassword . ':' . $salt);
}
 
* MD5 $uPassword . ':' . $salt結合後的結果即為資料庫存入密碼欄位的資料 這樣的話即使取得MD5字串也沒有用,因為已經加入亂數雜湊的鹽了 

破解上述方式:
1. 取得SQL資料
2. 取得鹽字串
3. 取得鹽與密碼的排列方式
4. 取得加密方式md5、sha1、crypt等
5. ......................上述四個都拿到不太簡單ㄚ....................