2011-02-09 4 views
4

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

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

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

+0

Можете ли вы прояснить «способность их сбросить, если они были хэшированы»? –

+1

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

+0

Пароль не должен быть сброшен в базе данных до тех пор, пока пользователь не нажмет на ссылку. Сброс пароля немедленно - это боль для пользователя, если кто-то, кроме них, вызвал эту функцию. –

ответ

15

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

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

Считать пароли является собственностью владельца счетов. Это не ваше, чтобы просматривать, расшифровывать или делать другие вещи. Если пользователь забывает свой пароль, предлагайте сброс, а не извлечение.

+0

Также с зашифрованным паролем ключ должен куда-то идти. Любой, кто найдет ключ, может нанести большой урон. – seand

+0

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

6

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

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

Редактировать
Как вы помечено вопрос ASP.Net, я бы рекомендовал использовать BCrypt.Net library для генерации хэшей

+0

Это последнее действительное значение. –

+0

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

+0

@metalideath: Ну, исходные пароли служат для удобства пользователей, которые их забыли. И сложный пользователь с доступом к базе данных мог бы, по сути, потенциально войти в учетные записи на моем сайте. Однако, как указывает davidsleeps, он не предоставит им пароли, которые пользователи могут использовать на других сайтах. –

1

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

Хеши обычно не могут быть отменены.

Reversing an MD5 Hash

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

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

В то время как с хешем, взломщик никогда не получает пароль обычного текста.

+0

Я обратился к этому в своем вопросе. Кто может иметь возможность расшифровывать данные в моей базе данных, но не имеет возможности сбросить хэшированные пароли? –

+0

@Jonathan 'resetting' Я предполагаю, что кто-то, у кого есть доступ к базе данных, может ввести пароль Джо в «foobar»? Это было бы возможно. Однако хакеру не удалось найти Joe * original * password, который Джо, возможно, использует для других учетных записей. – seand

+0

[Gawker] (http: //www.lightbluetouchpaper.org/2010/12/15/the-gawker-hack-how-a-million-passwords-lost /) использовали хэшированные/соленые пароли, и они были расшифрованы. Не все алгоритмы хэша созданы равными. – Greg

1

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

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