PHP: Как отправить оригинальный пароль пользователю, когда он нажимает на забытый пароль, который зашифрован с помощью md5?
Я использую md5 для шифрования паролей в моем проекте.
Когда пользователь нажимает на забытый пароль и отправляет свою электронную почту, я должен отправить ему пароль.
Но пароль зашифрован с использованием md5. Генерация нового пароля делать не стоит. Потому что в этом проекте администратор может видеть все детали пользователя. Так что я должен показать оригинальный пароль для администратора. Поэтому начальный пароль очень важен. Так как я могу расшифровать пароль или каким-либо другим способом отправить ему оригинальный пароль?
Заранее спасибо...
5 ответов
Хэши не предназначены для дешифрования, поэтому их часто называют "односторонними хэшами", а не просто хэшами.
Вместо этого либо...
Создайте новый пароль, хэшируйте его, сохраняйте хэш нового пароля вместо старого и отправляйте пользователю новый пароль по электронной почте.
Создайте новый пароль, хэшируйте его, сохраняйте в поле для временных паролей, а затем, когда пользователь входит в систему с этим паролем, предлагают ему ввести постоянный новый пароль.
Создайте одноразовый номер, сохраните его в поле для одноразового номера и отправьте пользователю по электронной почте ссылку с этим одноразовым номером, которая предоставит им доступ к странице для ввода нового пароля.
Третий вариант, вероятно, является лучшим из всех, так как он не оставляет действительный пароль (временный или нет) в открытом виде для тех, кто читает электронную почту пользователя, и, поскольку он использует одноразовый номер, после его использования он не может снова использоваться злоумышленником.
Причина, по которой хеширование используется для паролей, заключается именно в том, чтобы предотвратить их сохранение в форме, где злоумышленник может определить пароль, просто взглянув на базу данных.
Редактировать:
"Так что я должен показать оригинальный пароль для администратора".
Если вы хэшируете пароль, это невозможно. В общем, на самом деле плохая идея разрешать администраторам видеть пароли пользователей, потому что большой процент пользователей, как правило, используют один и тот же пароль для нескольких вещей, а администратор одной вещи (скажем, сети компании), вероятно, не администратор многих других вещей (скажем, система онлайн-банкинга пользователя).
MD5 - это не алгоритм шифрования, это алгоритм хеширования. Два не одинаковы; шифрование разработано так, чтобы быть обратимым (отсюда и дополнительный термин "дешифрование"), тогда как хеширование предназначено только для односторонней передачи.
Ты не можешь Причина, по которой криптографические хеши [1] называются "необратимыми", заключается в том, что они не могут быть обращены. В этом и заключается весь смысл их использования для хранения паролей - это означает, что, если Плохой Парень попадет в базу паролей, он не сможет просто перевернуть хеш, чтобы выяснить, что это за пароли.
Из ваших изменений я вижу, что ваша цель состоит в том, чтобы отобразить пароль пользователя для пользователя (ов) администратора, а не для восстановления пароля самим пользователем. Это очень плохая идея. Многие пользователи пытаются облегчить бремя запоминания паролей, используя один и тот же пароль для нескольких систем, что означает, что отображение их пароля в вашей системе с высокой вероятностью может поставить под угрозу их учетные записи в других системах.
Правдивая история: в 2000 году я устроился на работу в стартап, который выпускал системы голосовой почты. Чтобы познакомить меня с продуктом в мой первый день, ИТ-директор попросил меня создать учетную запись голосовой почты, что я и сделал, а затем открыл его в интерфейсе администратора. Я чуть не умер, когда увидел на экране свой PIN-код голосовой почты, чтобы все могли его увидеть. Отчасти потому, что это была ужасно плохая практика безопасности, но в основном потому, что, хотя он и не знал этого, теперь он знал ПИН-код моей карты банкомата. Это просто плохо, плохо, плохо вокруг. Не делай этого.
[1] MD5 - это алгоритм хеширования, а не алгоритм шифрования. Основное различие между ними заключается в том, что для любого данного алгоритма хеширования существует бесконечное число входов, которые будут давать одинаковый выход (поэтому он необратим), в то время как шифрование имеет взаимно однозначное соответствие ввода выход.
Одной из конкретных целей (среди прочих) хеш-значения является то, что оно необратимо, если оно работает идеально.
Наиболее распространенный способ использования функции "забытого пароля" состоит в том, чтобы сгенерировать новый пароль и попросить пользователя изменить его как можно скорее.
Если пароль был хеширован, вам, вероятно, придется создать случайный пароль и отправить его пользователю. Затем, как только они войдут в систему, откройте их на экране " Смена пароля", чтобы они могли изменить свой пароль на что-то более запоминающееся.
Просто добавив это в качестве sidenote:
Хотя вы не можете "разархивировать" хеш MD5, вы можете посмотреть его в таблице Rainbow. Это может позволить вам отправить оригинальный текстовый пароль пользователю. Я не предлагаю этого делать, потому что это просто пустая трата ресурсов по сравнению с простым созданием нового пароля и его отправкой пользователю.
С http://en.wikipedia.org/wiki/Rainbow_table:
Радужная таблица - это таблица поиска, предлагающая компромисс между временем и памятью, используемый для восстановления открытого текста из хеша пароля, сгенерированного хеш-функцией, часто криптографической хеш-функцией. Обычное применение - сделать выполнимые атаки на хешированные пароли. Соль часто используется с хешированными паролями, чтобы сделать эту атаку более трудной, часто неосуществимой.
Также см. Комментарии ниже для дополнительных заметок.