2009-03-04 5 views
3

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

По существу:

string pwd = "some pasword"; 
string securePwd = pwd.GetHashCode(); 

Мой вопрос, как безопасный или иначе это?

Мне это не удобно, но я не знаю, как работает GetHashCode. Я бы предпочел использовать что-то вроде хэша MD5, но если я трачу свое время, я не буду беспокоиться.

ответ

4

GetHashCode возвращает 32-битное целое число как значение хэша. Учитывая birthday paradox, это не слишком длинное значение хэша из-за относительно высокой вероятности столкновений, даже если оно явно сконструировано так, чтобы оно было устойчивым к столкновению, а это не так.

Вы должны пойти на SHA256 или другую криптографически защищенную функцию хэша, предназначенную для обработки такой задачи.

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

+0

Не нарушены ли SHA1 и MD5? –

+0

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

+0

О, я сказал, что я никоим образом не рекомендую использовать MD5 или SHA1. Как сказал Митч, пойдите с алгоритмами SHA256 или выше. Весь смысл моего комментария состоял в «сломанной» вещи. В алгоритмах шифрования break = dead. Но в хэш-алгоритмах есть немного более серая область. –

5

Вы должны использовать засоленный криптографически сильный хеш, такой как SHA256Managed.

Джефф Этвуд имеет несколько хороших постов на эту тему:

Rainbow Hash Cracking

You're Probably Storing Passwords Incorrectly

+0

downvoter: оставьте комментарий. –

5

Это не только небезопасно, но и могут быть изменены:

http://netrsc.blogspot.com/2008/08/gethashcode-differs-on-systems.html

значение, возвращенное GetHashValue для данного ввода, изменилось в прошлом.

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

+0

+1 связанный пример показывает, что вычисление значения хэша может измениться даже после простого Центра обновления Windows, который исправляет платформу .NET. Это означало бы, что никто больше не может войти в систему. –

1

GetHashCode определенно не предназначен для использования таким образом, поскольку реализация не гарантирует разные хэш-результаты для разных объектов. Это означает, что потенциально несколько паролей могут создавать один и тот же хеш. Также не гарантируется возврат одного и того же значения хэша в разные версии платформы .NET, что означает, что обновление потенциально может привести к другому хэшу для одной и той же строки, что сделает ваши пароли непригодными для вас.

Рекомендуется использовать соленый хеш или даже MD5 при нажатии. Вы можете легко переключить его на что-то в пространстве имен Security.Cryptography.

1

Как уже говорилось, GetHashCode не предназначен для того, что вы пытаетесь сделать. Есть действительно excellent article on how to handle user passwords securely.

Чтобы подвести итог статьи, вам необходимо использовать либо относительно медленную адаптивную схему хэширования, такую ​​как bcrypt, или, альтернативно, Stanford Secure Remote Password Protocol. Я бы предложил первый.И, конечно же, вы также должны использовать соль.

+0

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

+0

Ссылка на ваш ответ, чтобы безопасно обрабатывать пароли пользователей, находится на домашней странице некоторого веб-сайта ncctrust. Пожалуйста, вы можете это исправить? – saurabh64

+0

@ saurabh64, спасибо, я исправил эту ссылку. – RoadWarrior

2

Вместо этого я рекомендую использовать BCrypt. Как уже говорили другие, использование GetHashCode для паролей - не очень хорошая идея.

Смежные вопросы