MD5 действует по-разному в базе данных SQL и в скрипте PHP

Недавно я создал скрипт, который обрабатывает вход и регистрацию для моей игры, которая использует метод http_get для обновления статистики. Мне удалось создать все успешно, но есть проблема. Когда пользователь регистрируется, он вставляет другую строку md5, сгенерированную PHP-скриптами, и из-за этого я не могу сравнивать пароли.

Вот как я вставляю строку md5 в базу данных:

$pw = md5($password);
    $insert = mysqli_query($connect, "INSERT INTO Accounts (username, password, email,reg_ip, wins, looses, experience) VALUES ('$username', '$pw', '$email',  '$reg_ip', '0','0', '0')");
    if($insert) {
            echo "account successfully created"; 

        } 
        else {
            echo "error";
        }

И вот как я проверяю пароли:

if($p['password'] == md5($password)) {
                echo "login was successful!";
            }
            else {
                echo "incorrect password";
            }

Это строка md5, которая находится в базе данных при регистрации пользователя: (незашифрованная строка: pocakaj123)

54e8850ba5eca655854ddf1b503943

и это сгенерированная строка, когда я echo md5($password).

54e8850ba5eca655854ddf1b50394348

person BorutMatjasic    schedule 23.04.2016    source источник
comment
Почему в одном из них всего 30 символов? Шестнадцатеричный для MD5 составляет 32 символа.   -  person Rick James    schedule 23.04.2016
comment
Вы все равно не должны использовать md5 для хранения своих паролей, так что эта проблема не имеет значения.   -  person Luke Joshua Park    schedule 23.04.2016
comment
С PHP используйте password_hash и password_verify пара безопасна и проста в использовании. При сохранении средства проверки пароля простого использования хеш-функции недостаточно, а простое добавление соли мало что дает для повышения безопасности. Вместо этого используйте такие функции, как PBKDF2, Rfc2898DeriveBytes, Argon2, password_hash, Bcrypt или аналогичные функции с длительностью около 100 мс. Суть в том, чтобы заставить злоумышленника потратить значительное время на поиск паролей методом грубой силы.   -  person zaph    schedule 07.03.2018


Ответы (1)


Это связано с длиной вашего поля в вашей базе данных. Вам нужно увеличить длину, чтобы вся строка могла поместиться.

В настоящее время он принимает только 30 символов, поэтому остальные усекаются:

54e8850ba5eca655854ddf1b503943

Вам нужно увеличить длину как минимум до 32, чтобы уместить всю строку:

54e8850ba5eca655854ddf1b50394348

Примечание.

md5() не является безопасным способом хеширования паролей, лучше использовать bcrypt() или вместо этого использовать функции хеширования паролей PHP, password_hash().

Причина, по которой md5() небезопасна:

Алгоритмы хеширования, такие как MD5, SHA1 и SHA256, разработаны так, чтобы быть очень быстрыми и эффективными. Благодаря современным технологиям и компьютерному оборудованию стало тривиальным «грубая сила» выходных данных этих алгоритмов, чтобы определить исходные входные данные.

Ссылка на http://php.net/manual/en/faq.passwords.php.

person Panda    schedule 23.04.2016
comment
Это правильный ответ. Однако также важно отметить, что это не безопасный способ хранения паролей. MD5 сломан. OP должен использовать bcrypt, а не использовать собственное решение для хеширования. - person elixenide; 23.04.2016
comment
@EdCottrell Правда, я обновлю пост, чтобы добавить этот совет, спасибо, что указали! - person Panda; 23.04.2016
comment
@BorutMatjasic Может быть, примите этот ответ, если он вам помог? Спасибо! - person Panda; 26.04.2016