Использование GetHashCode для “защиты” паролей пользователей

StackOverflow https://stackoverflow.com/questions/610080

Вопрос

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

По существу:

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Вам следует использовать соленый, криптостойкий хэш, например SHA256Managed.

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

Взлом радужного хеша

Вероятно, вы неправильно храните пароли

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

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

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

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

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

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

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

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

Чтобы подвести итог статье, вам необходимо использовать либо относительно медленную адаптивную схему хеширования, такую как bcrypt - шифрование, или , в качестве альтернативы , Защищенный Протокол удаленного ввода пароля в Стэнфорде.Я бы предложил первое.И, конечно, вы также должны использовать соль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top