Подтвердить что ты не робот

PHP Забыли пароль

У меня есть небольшой веб-сайт сообщества, и мне нужно реализовать какую-то забытую функцию пароля. В настоящее время я храню пароли в БД, зашифрованные с помощью MD5.

Можно ли сортировать "дешифровать" и отправлять его им по электронной почте или мне нужно иметь пароль reset page?

4b9b3361

Ответ 1

Хешированный пароль MD5 не является обратимым. (MD5 - хеширование, а не шифрование, поэтому есть тонкая разница). И да, вы обязательно захотите предоставить пароль "reset" (а не просто по электронной почте пароль).

Чтобы предоставить вам рабочий процесс высокого уровня для безопасного сброса пароля...

  • Когда пользователь запрашивает reset свой пароль, введите им свой адрес электронной почты
  • Не указывайте, был ли этот адрес электронной почты действительным или нет (просто сообщите им, что отправлено электронное письмо). Это открыто для обсуждения, поскольку оно снижает удобство использования (т.е. Я понятия не имею, с какой электронной почтой я зарегистрировался), но он предлагает меньше информации людям, пытающимся собрать информацию о том, какие электронные письма действительно зарегистрированы на вашем сайте.
  • Создайте токен (возможно, хеш-метку с солью) и сохраните его в базе данных в записи пользователя.
  • Отправьте электронное письмо пользователю вместе со ссылкой на страницу http s reset (токен и адрес электронной почты в URL-адресе).
  • Используйте токен и адрес электронной почты для проверки пользователя.
  • Пусть они выбирают новый пароль, заменяя старый.
  • Кроме того, рекомендуется пропустить те жетоны после определенного периода времени, обычно 24 часа.
  • Возможно, запишите, сколько "забытых" попыток произошло, и, возможно, внедрить более сложные функции, если люди запрашивают тонну писем.
  • При желании, запишите (в отдельной таблице) IP-адрес лица, запрашивающего reset. Увеличьте количество от этого IP. Если он когда-либо достигнет большего, чем, скажем, 10... Игнорируйте их будущие запросы.

Чтобы подробнее рассказать о хэшировании...

Когда вы используете значение, подобное паролю с использованием функции md5() в PHP, конечное значение будет одинаковым для этого пароля независимо от того, на каком сервере вы его запускаете. (Итак, есть одно отличие, которое мы можем видеть сразу между хэшированием и шифрованием... Там нет частного/открытого ключа).

Итак, здесь вы увидите, что люди упоминают об уязвимости радужных таблиц. Очень основное объяснение таблицы радуги - это... you md5() hash куча слов словаря (слабые пароли), чтобы получить их значения хеширования md5(). Поместите их в таблицу базы данных (радужный стол).

Теперь, если вы нарушаете базу данных веб-сайта, вы можете запускать хэшированные пароли пользователей против вашей таблицы радуги (по сути) "перевернуть" хэш обратно на пароль. (Вы на самом деле не "реверсируете" хэш... Но вы поняли идею).

То, что "солить" ваши пароли - лучшая практика. Это означает (опять же, очень основную идею здесь), что вы добавляете случайное значение к паролям пользователей до, которые вы используете. Теперь, когда таблица радуги запускается против вашей базы данных, она не так легко "перевернута", потому что хеш md5() "password" отличается от "password384746".

Здесь хороший SO Q/A, который должен помочь. Защищенный хэш и соль для паролей PHP

Ответ 2

В соответствии с этим сообщением окончательное руководство по проверке подлинности веб-сайтов на основе форм, для шага 3. и 4. я не уверен, что вы должны отправить тот же токен вам хранятся.

Я думаю, вы должны отправить токен, затем записать его и сохранить хеш-маркер в БД. В противном случае, если ваша база данных скомпрометирована, вы можете получить доступ к странице пароля reset.

Подводя итог:

$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);

где хэш является алгоритмом хеширования.

Ответ 3

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

Тем не менее, MD5 (в частности, несогласованный MD5) можно атаковать, используя таблицу rainbow. Для обеспечения безопасности вам лучше использовать bcrypt.

Ответ 4

Вы не можете расшифровать пароль, и вы даже не должны рассматривать отправку пароля пользователю через открытый текст. (Это способ №1, чтобы я никогда больше не использовал сайт, это дыра безопасности GIGANTIC.) Укажите страницу пароля reset, которая запускается из ссылки, содержащей связанный с временем ключ, который отправляется на пароль пользователя восстановление электронной почты; что текущее состояние техники восстановления пароля.

Ответ 5

Лучшее, что вам нужно сделать, это запросить, чтобы люди отправляли свой адрес электронной почты при регистрации. Затем, если они забудут, у вас есть ссылка на забытый пароль, которая сбрасывает свой пароль со случайным значением, которое отправляется по электронной почте, чтобы они могли получить доступ, а затем сменить пароль на что-то более запоминающееся. Таким образом, вам не нужно компрометировать безопасность. У вас может быть ссылка, в которой им просто нужно указать свое имя пользователя, но для обеспечения лучшей безопасности у вас должен быть вопрос и ответ или запоминающееся слово.

Ответ 6

Как заявил Маркус Рид, в 2015/2016 году, если у вас есть версия PHP >= 5.5, не используйте MD5, password_hash() и password_verify(), чтобы обеспечить легкий и безопасный хэширование для вашего пароля с возможностью предоставления затрат и автоматически солевая хэш.

У меня нет возможности голосовать или комментировать в настоящее время, поэтому я даю окончательное выражение, чтобы избежать путаницы.

Ответ 7

MD5 предназначен для одностороннего хэша. Вам потребуется их reset их пароль.

Ответ 8

Напишите страницу, которая принимает md5 и адрес электронной почты как get paramaeter и смотрит в db для пароля электронной почты и md5'd. После заметок Джареда Кобба это должно привести вас к правильному пути. Я просто добавил несколько примеров

eg url для отправки http://yourdomain.com/resetpassword.php?code=md5codesentviaemail

 $code = isset($_GET['code']) ? $_GET['code'] : '';
    $email = isset($_GET['email']) ? $_GET['email'] : '';
$checkPw = '';

    if(empty($code) || empty($email))
    {
     die();
    }
    $sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'";
//remember to check for sql injections
    //then get the results as an array, i use a database class eg $user

    if(!empty($user['password']))
    {
     $checkPw = md5($user['password']);
    }else
    {
     die();
    }

    if($checkPw !== $code)
    {
     die();
    }else
    {
    //display form for user to change password
    }

этого достаточно, чтобы вы знали, что пользователь является допустимым пользователем и сменил пароль.

Ответ 9

Используйте php, встроенный в password_verify и password_hash.

Ответ 10

Нет, вы не можете его расшифровать. вот и вся идея.

Вам нужно будет отправить им временный пароль, а для них - reset.

Ответ 11

Вам понадобится страница с паролем reset. В PHP нет возможности расшифровывать MD5.

Ответ 12

MD5 - односторонняя функция. Вы не можете расшифровать его. Итак, вам нужно иметь пароль reset.