2013-05-11 181 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用于生成密码哈希)。