2012-07-14 194 views
1

我正在使用下面的函数。当我注册一个用户时,哈希似乎工作正常。当我尝试登录哈希不匹配。它有正确的散列,加上额外的散列。哈希密码不匹配

这是什么问题?

function salt($pass){ 
$salt = 'hello'; 
return hash('sha512', $pass.$salt); 
} 

function valid_credentials($user,$pass) { 
$user = mysql_real_escape_string($user); 
$pass = salt($pass); 
$total = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `user_name` = '".$user."' AND `password` = '{$pass}' "); 
return (mysql_result($total, 0) == '1') ? true : false; 
} 

function add_user($user, $pass) { 
$user = mysql_real_escape_string(htmlentities($user)); 
$pass = salt($pass); 
$time = now(); 
mysql_query("INSERT INTO `users` (user_name, password, date_created) VALUES ('{$user}', '{$pass}', '{$time}')"); 
} 
+0

只是一个侧面说明...你的盐不是很好。在你的salt表中有一个像hello这样的词,你的一些用户密码仍然会在彩虹表中结束,如果他们获得多个密码,他们将会知道该计划并且更容易解决它。我会使它成为一个非字母数字字符的长随机字符串。 – David 2012-07-14 06:10:04

+0

是的,我只是以此为例。 – jonthoughtit 2012-07-14 06:17:30

+0

已解决。我是个笨蛋。我的专栏时间不够长。 – jonthoughtit 2012-07-14 06:28:35

回答

1

我想在您的验证码这一行:

$total = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `user_name` = '".$user."' AND `password` = '{$pass}' "); 

需要改变的东西,像这样:

$total = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `user_name` = '".$user."' AND `password` = '".$pass."' "); 

现在,它似乎是检查密码列等于“{$ pass}”。

+0

它没有区别。 – jonthoughtit 2012-07-14 06:17:17

1

只需再次检查将值插入到数据库表之前和之后返回的值。用微调功能回应它。或者使用strcmp来检查在你的生成值中插入到数据库中的值。