Использование GetHashCode для “защиты” паролей пользователей
-
03-07-2019 - |
Вопрос
Компания, в которой я работаю, заключила контракт на поддержку системы обработки крупных заказов.В рамках первоначального системного аудита я заметил, что пароли, хранящиеся в базе данных, на самом деле были хэш-кодом пароля.
По существу:
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 - шифрование, или , в качестве альтернативы , Защищенный Протокол удаленного ввода пароля в Стэнфорде.Я бы предложил первое.И, конечно, вы также должны использовать соль.