сравнивая хешированные строки - PullRequest
1 голос
/ 31 декабря 2010

Я вытаскиваю свои волосы с этим.Я храню хешированный соленый пароль и соответствующую соль в базе данных MySQL.Это для сценария входа.Хранение данных работает нормально, данные хранятся в формате CHAR (128) на БД.

Однако, когда я не могу успешно сопоставить строку пароля с хешированным паролем для входа из формы входа в систему.Я сократил все до базового, и он все еще не совпадает, даже если выходные данные (echo или var_dump) выглядят одинаково.

Вот фрагмент кода:

$_POST['dk_username'] = mysql_real_escape_string($_POST['dk_username']);
$_POST['dk_password'] = mysql_real_escape_string($_POST['dk_password']);
$username = stripslashes($_POST['dk_username']);
$password = stripslashes($_POST['dk_password']);

$salt = uniqid(mt_rand());
$newhash= $salt . $password;
$hashPass= hash('sha512', $newhash);

$email=$_POST['email'];

$sql="INSERT INTO users (uName,uPass2,uEmail,uSalt,uID)
VALUES ('$username','$hashPass','$email', '$salt', 'time()')";

mysql_query($sql) or die('Error, insert query failed');

Здесьэто фрагмент логина:

$_POST['dk_username'] = mysql_real_escape_string($_POST['dk_username']);
$_POST['dk_password'] = mysql_real_escape_string($_POST['dk_password']);
$username = stripslashes($_POST['dk_username']);
$password = stripslashes($_POST['dk_password']);


$query = "SELECT uID, uPass2, uSalt, uName FROM users WHERE uName = '$username';"; 
$result = mysql_query($query); 
if(mysql_num_rows($result) < 1) //no such user exists 
{     echo 'Wrong username and/or password!'; 
} 
$userData = mysql_fetch_array($result, MYSQL_ASSOC); 
$salt=$userData['uSalt'];
$newhash= $salt . $password;
$hashPass= hash('sha512', $newhash);
$tempData=strcmp($hashpass, $userData['uPass2']);
if(hashPass != $userData['uPass2']){
echo "password not correct:<br/>";
echo "db: " . var_dump($userData['uPass2']) . "<br />";
echo "in: " . var_dump($hashPass) . "<br />; 
echo $tempData . "<BR />";

}else{
echo "logged in";
}

Результат для логина:

password not correct:
string(128) "98f713244f3d97e8629222f8d37e3cad38c5c1e2fbf011c135723f36b7841ef29785b1866ac6dbab9cd044b12db8e4d16a4c68df1e3d7b8f4a27a8c3d4c9bca5" db: 
string(128) "98f713244f3d97e8629222f8d37e3cad38c5c1e2fbf011c135723f36b7841ef29785b1866ac6dbab9cd044b12db8e4d16a4c68df1e3d7b8f4a27a8c3d4c9bca5" in: 
-128

1 Ответ

3 голосов
/ 31 декабря 2010

Ваш $ отсутствует здесь для $hashPass:

if(hashPass != $userData['uPass2']){

В настоящее время это приводит к тому, что PHP сравнивает $userData['uPass2'] с константой hashPass (которую PHP обрабатывает как строку 'hashPass', если константа не определена).

Установка error_reporting для включения E_NOTICE заставила бы PHP выплевывать уведомление о «константе».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...