2012-07-14 232 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來檢查在你的生成值中插入到數據庫中的值。