2013-05-11 218 views
1

我想在數據庫中使用MD5散列註冊密碼,登錄時也是這樣,但問題是在註冊過程中密碼被散列,但在登錄時系統工作,因爲這是不正確的密碼使用md5散列密碼

register.php

//ADD MD5 hash to the password 
     $db_pass=md5($pass1); 
//************Insert all the user's input to the database**************************// 
$query = mysql_query("INSERT INTO user(user_name, first_name, last_name, governorate, 
district, village, birth_date, email_address, specialization, password, 
registered_date)VALUES('$username', '$firstname', '$lastname', '$governorate', 
'$district', '$village', '$bdate', '$email', '$specialization', '$db_pass', 
now())") or die("could not insert data"); 

的login.php

$pass = md5($pass); 

$sql=mysql_query("SELECT user_id, email_address, first_name, user_name FROM user 
WHERE email_address='$email' 
AND password='$pass'LIMIT 1") or die("error in user table"); 
+0

你能更清楚地陳述你的問題是什麼嗎?我不知道... – 2013-05-11 09:28:59

+1

哈希是好的,但無鹽MD5仍然很不安全(所有無鹽哈希都容易受到彩虹表攻擊,特別是MD5已被證明是不安全的)。考慮使用鹽漬SHA2變體。每個密碼應該有自己的鹽 - 全球鹽仍然允許使用彩虹桌。 – cdhowie 2013-05-11 09:30:28

+3

如果你只是實現這個,現在停下來並使用像https://github.com/ircmaxell/password_compat這樣的適當的密碼哈希方案。無鹽MD5現在已經不夠用了。 – deceze 2013-05-11 09:30:35

回答

1

你不應該使用MD5。它是不安全的,它太快,你用它來進行密碼散列(如果你不明白爲什麼使用快速密碼散列算法是一個壞主意,請查看Wiki頁面Brute-force attacks)。你應該看看使用像Bcrypt

您可以通過crypt function使用Bcrypt。

$userPassword = 'testpassword'; 
$hashed = crypt($userPassword, '$2a$15$usesomesillystringforsalt$'); 
echo $hashed; 

如某人如上所述,ircmaxell具有在github可用pretty good library。該庫與password_hash函數向前兼容,該函數將在PHP 5.5中提供(目前在BETA中)。

+0

我不明白「這是waaaaay齋戒你用它來密碼散列的目的」爲什麼? – user2372265 2013-05-11 09:37:25

+0

由於MD5比Blowfish快很多,有些硬件功能有限的人可以很快產生大量的密碼哈希值。這意味着如果您的數據庫暴露出來,攻擊者就可以更輕鬆地散列一堆密碼嘗試,然後將它們與用戶表中的散列進行比較。請參閱http://en.wikipedia.org/wiki/Brute_force_attack – 2013-05-11 09:42:48

0

你確定$ pass1和$ pass是一樣的!只要檢查一下,在哈希之前兩者是相同的。

由於MD5不安全使用sha256/sha512與salt或使用phpass生成強哈希(phpass被WordPress用於生成密碼哈希)。