Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > вытаскивание пароля из БД


Автор: Sufius 30.7.2004, 10:27
как можно вытащить пароль из БД, если он там в зашифрованном виде.

Код
$query = "select * from accounts where login='valid_login'";
$result = mysql_query($query, $conn);

while($row = mysql_fetch_array($result))
{
echo $row[password];

}

в этом случае вытаскивается шифрованный пароль... а как его дешифровать?

Автор: Secandr 30.7.2004, 10:30
его не нужно дешифровать, проще зашифровать пароль пришедший от пользователя и сравнить.

Автор: Ignat 30.7.2004, 10:30
Sufius, пароль из мд5 не дешифруется - это одностороннее шифрование.
На практике используется сравнение зашифрованного сохраненного и зашифрованного введенного.
if(md5($input_pass)==$pass_from_db).......

Добавлено @ 10:31
Secandr, эх раньше успел smile.gif

Автор: Sufius 30.7.2004, 11:53
=))) принцип авторизации я понимаю...
А как сделать восстановление пароля?
Когда человек забыл свой пароль...
Или легче сделать автозамену и выслать новый?

Автор: Secandr 30.7.2004, 11:56
генерируй новый и высылай, всё равно он его забыл.

Автор: Sufius 30.7.2004, 12:00
=)))
Добавлено @ 12:02
с генерацией буду париться долго... =(((
usr/dict/words на сервере отсутствует... а поддержка только в понедельник заработает =(((

Может кто подскажет, как можно сделать генерацию слова без ispell?

Автор: Ignat 30.7.2004, 12:36
Сгенери рандомизом число - отправь ему на мыло, попроси войти по ссылке. Пусть юзер введет его на странице восстановления, а затем попроси ввести новый пароль.

Автор: skalex 30.7.2004, 12:43
Не понял, а в чем проблема с генерацией пароля? Не обязательно же ему быть словом...

Автор: Ignat 30.7.2004, 12:48
В целях секюрности. Рекомендуется что-то типа
34ZiGmun34D00FReud

Автор: IZ@TOP 30.7.2004, 13:31
Генерация нового пароля:
Цитата
$PassLen = 8; // Длинна генерируемого пароля.
$Words = "qQwWeErRtTyYuUiIoOpPaAsSdDfFgGhHjJkKlLzZxXcCvVbBnNmM_1234567890";
while($PassLen > 0) {
    $TmpPass[] = $Words[rand(0, strlen($Words) -1];
    $PassLen--;
}
$Password = implode('', $TmpPass);

Добавлено @ 13:35
При такой генерации получаются пароли типа W4cqO_4y.

Автор: IZ@TOP 30.7.2004, 14:02
Решил от нечего делать написать по быстренькому восстановлялку. Запрсоы к БД замените если что. Кое что я могу не помнить, так что советую посмотреть внимательно код. У меня нет возможности сейчас его проверить wink.gif

Цитата
<?php
/* -------------------------------------------------- */
//    Скрипт восстановления забытого пароля.
//    Автор:    IZ@TOP.
//    Дата:    30.07.04
/* -------------------------------------------------- */

switch($_GET['RecoveryWizzard']) {
    case 'confirm': {
        $Res = mysql_query("select email from temp where key = '".$_GET['confirm']);
        if(!mysql_num_rows($Res)) { die('Такого ключа подтверждения не существует'); }
        list(, $mail) = mysql_fetch_array($Res, MYSQL_NUM);
        $PassLen = 8; // Длинна генерируемого пароля.
        $Words = "qQwWeErRtTyYuUiIoOpPaAsSdDfFgGhHjJkKlLzZxXcCvVbBnNmM_1234567890";
        while($PassLen > 0) {
            $TmpPass[] = $Words[rand(0, strlen($Words) -1];
            $PassLen--;
        }
        $Password = implode('', $TmpPass);
        mysql_query("update users set password = '".md5($Password)."' where email = '".$mail);
mail('[email protected]', $mail, 'Recovery Password', $Password);
echo "Ваш новый паролль отправлен Вам на email";
        break;
    } case 'prepare' {
        $Res = mysql_query("select email from users where name = ".addslashes($_POST['name'])." and email = ".addslashes($_POST['email']));
        if(!mysql_num_rows($Res)) { die('Ошибка. Такого пользователя или email'a не существует.'); }
        $RandKey = md5(microtime());
        mysql_query("insert into temp values('".$_POST['email']."', '".$RandKey."'");
        @mail('[email protected]', $_POST['email'], 'Recovery Password', 'http://example.com/recover.php?confirm='.$RandKey);
        echo "Вам на емайл отправлено письмо с ключем для подтверждения смены пароля.";
        break;
    } default : {
?>
<form action="?RecoveryWizzard=prepare" method="POST">
    <input type="text" value="Your name"><br />
    <input type="text" value="Your email"><br />
    <input type="submit" value="send">
</form>
<?php
    }
}

?>

Автор: Ignat 30.7.2004, 14:07
[offtop]
Цитата
Решил от нечего делать

Завидую. Счастливый человек.
[/offtop]

Автор: IZ@TOP 30.7.2004, 14:59
Ignat
Это же десятиминутное дело biggrin.gif

Автор: Akina 30.7.2004, 15:55
Вообще сгенеренный и высылаемый пароль должен быть одноразовым - только для того чтобы по нему можно было сменить пароль конкретного пользователя. А то есть любители эти письма от напоминателей хранить аки напоминалку - оно конечно это дело юзера, а не админа, но для солидности хотя бы...

Автор: IZ@TOP 30.7.2004, 16:29
Akina
Есть желание дополнить мой код? Нет? Тогда в чем вопрос? Вообще конечно ты прав. Непомешало бы высылатьь пароль по каторому он должен будет войти в систему с временными правами и сменить свой пароль. Но я допустим с одной такой напоминалки пароли храню. И ни чего, пока не хакнул ни кто. правлда... как говорят - не зарекаются...

Автор: Guest 30.7.2004, 18:41
=))) ух ты, скока всего =)))
спасибо =)))
сейчас буду изучать написанное...

Автор: Sufius 1.8.2004, 12:16
А я нашел вот такую вещицу - вроде ничего =)))
Код

<?php
  $pass = md5(uniqid(rand(),true));
echo $pass;
?>

Автор: IZ@TOP 1.8.2004, 20:14
Нет. Лучше тогда уж md5(microtime().uniqid(rand(), true));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)