PHP: Как отправить оригинальный пароль пользователю, когда он нажимает на забытый пароль, который зашифрован с помощью md5? - PullRequest
9 голосов
/ 06 мая 2010

Я использую md5 для шифрования паролей в моем проекте.

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

Но пароль зашифрован с использованием md5. Генерация нового пароля делать не стоит. Ведь в этом проекте администратор может видеть все детали пользователя. Поэтому я должен показать оригинальный пароль для администратора. Поэтому начальный пароль очень важен. Так как я могу расшифровать пароль или каким-либо другим способом отправить ему оригинальный пароль?

Заранее спасибо ...

Ответы [ 5 ]

39 голосов
/ 06 мая 2010

Хеши не предназначены для расшифровки, поэтому их часто называют «односторонними хешами», а не просто хешами.

Вместо этого либо ...

  1. Создайте новый пароль, хэшируйте его, сохраняйте хэш нового пароля вместо старого и отправляйте пользователю новый пароль по электронной почте.

  2. Создайте новый пароль, хэшируйте его, сохраняйте в поле для временных паролей, а затем, когда пользователь входит в систему с этим паролем, предлагают ему ввести постоянный новый пароль.

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

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

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

Edit:

«Поэтому я должен показать оригинальный пароль администратору.»

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

MD5 - это не алгоритм шифрования, это алгоритм хеширования. Они не одинаковы; шифрование разработано так, чтобы быть обратимым (отсюда и дополнительный термин «дешифрование»), тогда как хеширование предназначено только для односторонней передачи.

5 голосов
/ 06 мая 2010

Вы не можете. Причина, по которой криптографические хеши [1] называются «необратимыми», заключается в том, что они не могут быть обращены. В этом весь смысл их использования для хранения паролей - это означает, что, если Плохой Парень попадет в базу паролей, он не сможет просто перевернуть хеш, чтобы узнать, какие все пароли есть.

Я вижу из ваших правок, что ваша цель состоит в том, чтобы отобразить пароль пользователя для пользователя (ов) администратора, а не для восстановления пароля самим пользователем. Это Очень плохая идея . Многие пользователи пытаются облегчить бремя запоминания паролей, используя один и тот же пароль для нескольких систем, что означает, что отображение их пароля в вашей системе с высокой вероятностью может поставить под угрозу их учетные записи в других системы.

Правдивая история. В 2000 году я устроился на работу в стартап, который выпускал системы голосовой почты. Чтобы познакомить меня с продуктом в мой первый день, ИТ-директор попросил меня создать учетную запись голосовой почты, что я и сделал, а затем вызвал ее в интерфейсе администратора. Я чуть не умер, когда увидел на экране свой PIN-код голосовой почты, чтобы все могли его увидеть. Отчасти потому, что это была ужасно плохая практика безопасности, но в основном потому, что, хотя он и не знал этого, теперь он знал ПИН-код моей карты банкомата . Это просто плохо, плохо, плохо вокруг. Не делай этого.


[1] MD5 - это алгоритм хеширования, а не алгоритм шифрования. Основное различие между ними заключается в том, что для любого данного алгоритма хеширования существует бесконечное количество входов, которые будут давать одинаковый выход (поэтому он необратим), в то время как шифрование имеет взаимно однозначное соответствие ввода выход.

1 голос
/ 06 мая 2010

Просто добавив это в качестве sidenote:

Хотя вы не можете «разархивировать» хеш MD5, вы можете посмотреть его в таблице Rainbow. То, что может , позволяет вам отправлять исходный текстовый пароль пользователю. Я не предлагаю делать это , потому что это просто пустая трата ресурсов по сравнению с просто созданием нового пароля и отправкой его пользователю.

С http://en.wikipedia.org/wiki/Rainbow_table:

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

Также см. Комментарии ниже для дополнительных примечаний.

1 голос
/ 06 мая 2010

Одной из конкретных целей (среди прочих) хеш-значения является то, что оно необратимо, если оно работает идеально.

Наиболее распространенный способ использования функции «забытого пароля» - это сгенерировать новый пароль и попросить пользователя изменить его как можно скорее.

1 голос
/ 06 мая 2010

Если пароль был хеширован, вам, вероятно, придется создать случайный пароль и отправить его пользователю.Затем, как только они войдут в систему, перейдите на экран Изменить пароль , чтобы они могли сменить свой пароль на более запоминающийся.

...