Проблема с дополнительным символом в MD5 Hash? - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть сценарий входа, который я только начинаю.Когда вводится новый пароль, он сначала шифруется с использованием MD5, а затем сохраняется в базе данных.

Когда я ввожу имя пользователя и пароль в форму входа и отправляю их, я пытаюсь проверить сохраненный пароль попеременная $ _POST, подобная этой:

$username = $_POST['username'];
$password = md5($_POST['password']);
//database stuff here
$q = mysql_query("SELECT * FROM Users WHERE username='$username'");
while ($row = mysql_fetch_array($q))
{
    if ($row['password'] == $password)
    {
        echo "Passwords match.";
    }
    else
    {
        echo "Password is incorrect.";
        echo "<br />Entered password: " . $password;
        echo "<br />Stored password: " . $row['password'];
    }
}

Это только на стадии тестирования, поэтому пароль, который я пытаюсь проверить, это «пароль», для простоты.Если я выведу $ _POST ['password'], я получу пароль - однако, если я выведу хеш MD5, сохраненный в базе данных, и md5 ($ _ POST ['password']), они не совпадут.Последний имеет дополнительные символы.Кто-нибудь знает, почему это происходит?

Ответы [ 4 ]

3 голосов
/ 07 февраля 2012

Ваш тип столбца может усекать данные при их сохранении.

Убедитесь, что это не менее 32 символов (размер хеша MD5).

Кроме того, этот скриптуязвимы для SQL-инъекций.

2 голосов
/ 07 февраля 2012

Ваше поле слишком короткое. Хеши MD5 имеют 32 шестнадцатеричные цифры.

1 голос
/ 01 ноября 2014

Можно обмануть.Проверьте это:

$str=md5('password');
print(strlen($str));

и вывод равен 32. (строка "5f4dcc3b5aa765d61d8327deb882cf99")

Теперь попробуйте вставить это в HTML-код:

<?=print(md5('password'));?>

Ивывод «5f4dcc3b5aa765d61d8327deb882cf991» (33 символа)

Проблема становится яснее при вставке:

<?=print(strlen(md5('password')));?>

Вывод «321»

Это работает:

<?php print(strlen(md5('password')));?>
0 голосов
/ 09 февраля 2012

Несмотря на другие ответы, MD5 как алгоритм вообще не выдает шестнадцатеричные символы. MD5 - это операция, выполняемая с двоичными данными. В качестве вывода он возвращает 16 байт двоичных данных.

Это функция PHP, которая возвращает шестнадцатеричную строку. Это зависит от того, как вы хотите обработать вывод хэша, если это то, что вы хотите. Если вы храните хеш как двоичные данные, вы можете использовать «сырой» вывод:

string md5 ( string $str [, bool $raw_output = false ] )

...