Использование GetHashCode для «защиты» паролей пользователей - PullRequest
3 голосов
/ 04 марта 2009

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

По существу:

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

Мой вопрос: насколько это безопасно или нет?

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

Ответы [ 6 ]

5 голосов
/ 04 марта 2009

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

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

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

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

5 голосов
/ 04 марта 2009

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

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

Радужное хэширование

Возможно, вы неправильно храните пароли

4 голосов
/ 04 марта 2009

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

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

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

2 голосов
/ 04 марта 2009

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

1 голос
/ 04 марта 2009

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

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

1 голос
/ 04 марта 2009

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

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

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