2016-06-05 3 views
0

У меня есть регистрационную форму, чей фрагмент является следующим образом-Почему хешированный пароль не соответствует значению в базе данных?

$email=$_GET['email']; 
$pass=$_GET['pass']; 
$salt = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); 
     $password = hash('sha256', $pass.$salt); 
     for($round = 0; $round < 65536; $round++) 
     { 
      $password = hash('sha256', $password.$salt); 
     } 
     mysql_query("INSERT INTO user_tbl(email, password, salt) VALUES ('$email','$password','$salt')"); 

Для определенного пароля следующей строки получения хранится в db-

df22e53c7fb2d599d64597a04fd28ca47bc79675ac50a2381c9a17fd4e07b263 

Теперь я также регистрационную форму. Код Чей фрагмент является следующим образом-

$email=$_GET['email']; 
$pass=$_GET['password']; 
$result=mysql_query("SELECT * from user_tbl where email='$email'"); 
$row=mysql_fetch_array($result); 
$salt = $row['salt']; 
$password = hash('sha256', $pass.$salt); 
for($round = 0; $round < 65536; $round++) 
    { 
     $password = hash('sha256', $password.$salt); 
    } 
if(strcmp($row['password'],$password)!=0) 
{ 
    echo "wrongpassword"; 
    exit(); 
} 
else 
{ 
    echo "Success"; 
} 

Теперь я мог видеть, что хэшируются пароль, форма Войти оценивает в тоже df22e53c7fb2d599d64597a04fd28ca47bc79675ac50a2381c9a17fd4e07b263. Это то же самое, что и форма регистрации в базе данных. Они должны совпадать. Но это не так. Тест сравнения строк всегда терпит неудачу. Длина обоих полей, то есть пароль и соль - 200 каждый и имеют тип VARCHAR, достаточный, я думаю, потому что выше algo будет генерировать только строку длиной 64 символа. Все еще В чем проблема? Пожалуйста, помогите мне здесь.

+1

Почему бы вам просто не использовать Bcrypt (через 'password_hash()')? – Pointy

+7

Лучшая помощь, я думаю, мы можем дать, чтобы сказать вам прекратить то, что вы делаете. Во-первых, используйте PHP [пароль API] (http://php.net/password) вместо того, чтобы пытаться свернуть свой собственный. Во-вторых, прекратите использовать 'mysql_ *' функции, они устарели много лет назад и удалены в PHP 7, получить время и начать использовать PDO. В-третьих, вы открыты для инъекций SQL-инъекций, поэтому при использовании PDO также поддерживайте наши подготовленные статуты. В-четвертых, не пропускайте текстовые пароли в URL. –

+1

Не разрабатывайте свои собственные алгоритмы защиты паролей, если вы не хотите, чтобы реклама была получена Эшли Мэдисоном, и несколько лет назад, связавшись с ней и помогли. Не изобретайте повторно плоскую шину. Используйте алгоритм паролей PHP. Он призван быть несколько будущим доказательством, когда будущее предлагает более дешевую и более дешевую вычислительную мощность в руках киберкруков. Шутки в сторону. –

ответ

0

Вам просто нужно простое исправление в вашем состоянии, если:

if(strcmp($row['password'],$password)!==0) // change here :) 
{ 
    echo "wrongpassword"; 
    exit(); 
} 
else 
{ 
    echo "Success"; 
} 

Пожалуйста, обратитесь к документации: http://php.net/manual/en/function.strcmp.php

Смежные вопросы