Ошибка шифрования md5

hammer_tm

Новичок
Здравствуйте! Подскажите пожалуйста, в чем может быть ошибка?

Есть скрипт восстановления пароля:

PHP:
$db = mysql_connect('localhost','max','g1df5d');
mysql_select_db("mydb" ,$db);

if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
//заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
 
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') {unset($email);} } //заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную
if (isset($login) and isset($email)) { //если существуют необходимые переменные  
 
include ("bd.php"); // файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
 
$result = mysql_query("SELECT id FROM sum_users WHERE login='$login' AND email='$email'",$db); //такой ли у пользователя е-мейл
 
$myrow = mysql_fetch_array($result);
 
if (empty($myrow['id']) or $myrow['id']=='') {
 
//если активированного пользователя с таким логином и е-mail адресом нет
 
exit ("Пользователя с таким e-mail адресом не обнаружено  <a href='index.php'>Главная страница</a>");
 
}
 
//если пользователь с таким логином и е-мейлом найден, то необходимо сгенерировать для него случайный пароль, обновить его в базе и отправить на е-мейл
 
$datenow = date('YmdHis'); //извлекаем дату
$new_password = md5($datenow); // шифруем дату
$new_password = substr($new_password, 2, 6); //извлекаем из шифра 6 символов начиная со второго. Это и будет наш случайный пароль. Далее запишем его в базу, зашифровав точно так же, как и обычно.
$new_password_sh = strrev(md5($new_password))."b3p6f"; //зашифровали
mysql_query("UPDATE sum_users SET password='$new_password_sh' WHERE login='$login'",$db); // обновили в базе
 
//формируем сообщение
 
$message = "Здравствуйте, ".$login."! Мы сгененриоровали для Вас пароль, теперь Вы сможете войти на сайт citename.ru, используя его. После входа желательно его сменить.    Пароль:\n".$new_password;//текст сообщения
mail($email, "Восстановление пароля", $message, "Content-type:text/plane; Charset=windows-1251\r\n"); //отправляем сообщение
 
echo "<html><head><meta http-equiv='Refresh' content='5; URL=index.php'></head><body>На Ваш e-mail отправлено письмо с паролем. Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='index.php'>нажмите сюда.</a></body></html>"; //перенаправляем пользователя
}
 
else {//если данные еще не введены
echo '
<html>
<head>
<title>Забыли пароль?</title>
</head>
<body>
<h2>Забыли пароль?</h2>
<form action="#" method="post">
Введите Ваш логин:<br><input type="text" name="login"><br><br>
Введите Ваш E-mail: <br><input type="text" name="email"><br><br>
<input type="submit" name="submit" value="Отправить">
</form>
</body>
</html>';
}
?>
Но новый сгенерированный пароль не подходит

где здесь может быть ошибка:

PHP:
$datenow = date('YmdHis'); //извлекаем дату
$new_password = md5($datenow); // шифруем дату
$new_password = substr($new_password, 2, 6); //извлекаем из шифра 6 символов начиная со второго. Это и будет наш случайный пароль. Далее запишем его в базу, зашифровав точно так же, как и обычно.
$new_password_sh = strrev(md5($new_password))."b3p6f"; //зашифровали
 

hammer_tm

Новичок
Код проверки авторизации:

PHP:
   // авторизация
    function action_authorization(){
        
        if(isset($_COOKIE['sum_session']) && !isset($_POST['login'], $_POST['password'])){
            if(isset($_POST['sum_exit'])){
                setcookie('sum_session','',0,'/');
                return false;
            }
            $hash = mysql_real_escape_string($_COOKIE['sum_session']);
            $query = 'select id_sum_users, remember from sum_sessions where hash = "'.$hash.'" limit 0,1';
            $result = mysql_query($query);
            if(mysql_num_rows($result) > 0){
                $sessions = mysql_fetch_array($result);
                $time = time();
                $this->session_update($sessions['id_sum_users'], $sessions['remember'], $time);
                $query = 'select * from sum_users where id = "'.$sessions['id_sum_users'].'" limit 0,1';
                $this->sum_user = mysql_fetch_array(mysql_query($query));
                $this->status = true;
                return true;
            }

        }
        elseif(isset($_POST['login'], $_POST['password'], $_POST['key']) && $_POST['key']=='authorization'){
            
            $login = mysql_real_escape_string($_POST['login']);
            $password = md5($_POST['password']);
            $query = 'select * from sum_users where login = "'.$login.'" and password = "'.$password.'" limit 0,1';
            $result = mysql_query($query);
            if(mysql_num_rows($result) > 0) {
                $this->sum_user = mysql_fetch_array($result);
                $time = time();
                if(isset($_POST['remember']))
                    $remember = 1;
                else
                    $remember = 0;
                $query = 'select id_sum_users from sum_sessions where id_sum_users = "'.$this->sum_user['id'].'" limit 0,1';
                $result = mysql_query($query);
                if(mysql_num_rows($result)>0){
                    $this->session_update($this->sum_user['id'], $remember, $time);
                }
                else {
                    $this->session_create($this->sum_user['id'], $remember, $time);
                }
                $this->status = true;
                return true;
            }
            else {
                $this->messages[] = 'Не верно введен логин или пароль.';
                $this->status = false;
                return false;
            }
        }
        return false;
    }
 

hammer_tm

Новичок
Дело в том, что пароль из переменной $new_password_sh при хешировании, не совпадает с хешом записанным в mysql
 

С.

Продвинутый новичок
Замечательно! Тогда зачем нам тут эти простыни кода?
Спрашивай что-нибудь конкретное, сопровождай только нужным кодом.
 

hammer_tm

Новичок
Новый пароль на емаил приходит как 7ba889 в Mysql записан как 6a077a26bc1b290f580c6c9c1fbaf94fb3p6f
на сайте md5list.ru Хэширую пароль в md5(128bit) 7ba889 результат = f49fabf1c9c6c085f092b1cb62a770a6

Следовательно: 6a077a26bc1b290f580c6c9c1fbaf94fb3p6f и f49fabf1c9c6c085f092b1cb62a770a6 не совпадают
 

Фанат

oncle terrible
Команда форума
ОМГ.
я первый пост не заметил.
где здесь может быть ошибка:

PHP:
$datenow = date('YmdHis'); //извлекаем дату
$new_password = md5($datenow); // шифруем дату
$new_password = substr($new_password, 2, 6); //извлекаем из шифра 6 символов начиная со второго. Это и будет наш случайный пароль. Далее запишем его в базу, зашифровав точно так же, как и обычно.
$new_password_sh = strrev(md5($new_password))."b3p6f"; //зашифровали
И ты, глядя на этот вот код, ещё спрашиваешь, где здесь "ошибка"?
 

Фанат

oncle terrible
Команда форума
Здесь не нужно знание РНР.
Здесь нужен простой здравый смысл, чтобы при проверке хэшировать пароль ТЕМ ЖЕ СПОСОБОМ, который использовался при его записи.
Очень сложно сообразить, правда?
 

Фанат

oncle terrible
Команда форума
Сам алгоритм при этом ужасен
Добавлять случайную строку надо не к хэшу, а к паролю. реверсить строку бессмысленно.
должно быть так
PHP:
$new_password_sh = md5($login.$new_password); //зашифровали
 

Beavis

Banned
И если генерировать пароль основываясь на текущей дате, то надо хотя бы микросекунды учитывать
 

Фанат

oncle terrible
Команда форума
кстати да. тоже хотел написать, но отвлекли
PHP:
$random_string = base_convert(md5(microtime(1)), 16, 36); // получаем строку случайных символов
$new_password = substr($random_string, 0, 6); //извлекаем из нее 8 символов. Это и будет наш случайный пароль. 
$new_password_sh = md5($login.$new_password); //шифруем как обычно
 

radioheaded

PHP нуб
Если уж уму-разуму собрались учить, то первым делом следовало бы указать на то, что настоятельно рекомендуется не использовать md5 для хеширования паролей.
 

Фанат

oncle terrible
Команда форума
Если уж уму-разуму собрались учить, то первым делом следовало бы указать на то, что настоятельно рекомендуется не использовать md5 для хеширования паролей.
Да ладно.
Вот что действительно настоятельно рекомендовать надо - это проверять пароли на вшивость.
Если это не делается, то никакое супермегасекретное хэширование не поможет
 

Вурдалак

Продвинутый новичок
Хеширование не является частным случаем шифрования, поэтому хватит уже это слово упоминать.
 

Beavis

Banned
Считается, что для тупого перебора даже не по словарю, всё что меньше 6, что ли, символов - раз плюнуть современной видимокарте.
да, это понятно, но если взять соль из 10 символов, то уже не будет так просто :)

Я этим не занимаюсь, но читал о методах, да. Соль сейчас может спасти только от совсем уж быстрого подбора по радужным таблицам.
Я бы тоже с удовольствием почитал.. Только не теоретические исследования учёных, а что-нибудь более применимое в реальной жизни.
 
Сверху