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

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

Можно ли сортировать «дешифровать» и отправлять его им по электронной почте или мне нужна страница сброса пароля?

    Пароль хеширования MD5 не является обратимым. (MD5 – хеширование, а не шифрование, поэтому есть тонкая разница). И да, вы обязательно захотите предоставить пароль «перезагрузить» процесс (а не просто отправить пароль по электронной почте).

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

    1. Когда пользователь попросит сбросить пароль, введите их адрес электронной почты
    2. Не указывайте, был ли этот адрес электронной почты действительным или нет (просто сообщите им, что отправлено электронное письмо). Это открыто для обсуждения, поскольку оно снижает удобство использования (т. Е. Я понятия не имею, с какой электронной почтой я зарегистрировался), но он предлагает меньше информации людям, пытающимся собрать информацию о том, какие электронные письма действительно зарегистрированы на вашем сайте.
    3. Создайте токен (возможно, хеш-метку с солью) и сохраните его в базе данных в записи пользователя.
    4. Отправьте электронное письмо пользователю вместе со ссылкой на страницу сброса http (токен и адрес электронной почты в URL-адресе).
    5. Используйте токен и адрес электронной почты для проверки пользователя.
    6. Пусть они выбирают новый пароль, заменяя старый.
    7. Кроме того, это хорошая идея, чтобы истечь те жетоны после определенного периода времени, обычно 24 часа.
    8. При желании запишите, сколько «забытых» попыток произошло, и, возможно, реализовать более сложные функции, если люди запрашивают тонну писем.
    9. При желании, запишите (в отдельной таблице) IP-адрес человека, запрашивающего сброс. Увеличьте количество от этого IP. Если он когда-либо достигнет большего, чем, скажем, 10 … Игнорируйте их будущие запросы.

    Чтобы дать вам немного больше информации о хэшировании …

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

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

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

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

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

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

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

    Обобщить :

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

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

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

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

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

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

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

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

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

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

    например, 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 } 

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

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

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

    Вам необходимо будет отправить им временный пароль и перезагрузить его.

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

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