Безопасно ли хранить хэши паролей с помощью MD5CryptoServiceProvider в C #? - PullRequest
17 голосов
/ 25 февраля 2010

Мы храним хешированные пароли в таблице базы данных.

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

Это безопасно? Я слышал, что MD5 был "сломан".

Если нет, можете ли вы порекомендовать использовать альтернативный метод хеширования (определенный класс платформы .NET)?

Ответы [ 5 ]

11 голосов
/ 25 февраля 2010

Безопасность хеш-функции в основном зависит от длины ее вывода (дайджест сообщения): более длинный дайджест дает большее сопротивление столкновению. Парадокс дня рождения говорит нам, что в среднем вы ожидаете найти столкновение из рабочей функции квадратного корня из размера дайджеста: другими словами, при 128-битном дайджесте злоумышленник будет ожидать попадания в paydirt после 2 ^ 64 испытания.

MD5 не одобряется криптографическим сообществом уже несколько лет, потому что он имеет только 128-битный дайджест, а также есть некоторые интересные криптоаналитические результаты, которые могут эффективно снизить его прочность. SHA1 (160-битный дайджест) был предпочтительной альтернативой, но даже тогда он начинает казаться, что он был недостаточно длинным для хорошо мотивированного противника, и в исследовательском сообществе также есть некоторые интересные результаты. Семейство SHA-2 (размеры выходных данных от 224 до 512 бит) являются текущими предпочтительными хеш-функциями, которые широко используются. NIST проводит активный исследовательский конкурс для поиска преемника SHA-2, но у нас не будет нового стандарта до 2012 года или около того.

Теперь, в конкретном случае хранения паролей, я отмечаю, что вы используете соль. Это настоятельно рекомендуемая практика; без соли вы были бы уязвимы для атаки радужного стола. Я полагаю, что это оставляет вас только на атаку грубой силой; Именно здесь приходит keylength.com . Он объединяет рекомендации по размерам ключей и дайджестов по всему криптографическому сообществу и дает ожидаемые временные рамки безопасности для различных алгоритмов, учитывая текущую вычислительную мощность и принимая во внимание закон Мура. Подумайте, какие активы вы защищаете и как долго вам нужен пароль, чтобы оставаться в безопасности (например, у вас есть политика принудительного изменения пароля?), И это должно в значительной степени ответить на вопрос о размере дайджеста, который вам нужен.

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

8 голосов
/ 25 февраля 2010

Я думаю, что SHA256, SHA512 в данный момент более безопасны:)

См. вики

7 голосов
/ 25 февраля 2010

Нет, вы не должны использовать MD5. Но вам не следует использовать один раунд любой хеш-функции общего назначения, независимо от того, насколько она криптографически безопасна! Не MD5, не SHA-1, не SHA-2, не SHA-3.

Почему? Потому что хэш-функции общего назначения предназначены для fast . А быстрый это именно то, что вы не хотите в хэше пароля. Быстрый означает, что, когда злоумышленники получат вашу базу данных, они смогут запустить обычную старую словарную атаку на нее за разумное время.

Что вам нужно, это медленно . Самый простой способ замедления - это тысячи раз повторять быструю хэш-функцию - это то, что используют схемы паролей на основе MD5 и SHA-1, используемые для хранения паролей в UNIX-подобных системах (это не просто один раунд MD5 или SHA-1 ). Другой способ - использовать криптографический примитив, который разработан так, чтобы быть медленным - это то, что делает схема паролей "bcrypt".

В этой статье Matasano, Что нужно знать о безопасных схемах паролей , есть хорошее прочтение именно на эту тему.

3 голосов
/ 25 февраля 2010

С соленым MD5 намного безопаснее, чем без него, но лучше использовать один из хэшей SHA, например SHA256Managed.

2 голосов
/ 25 февраля 2010

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

Кроме того, да, MD5 был сломан, но все еще используется по сей день. Если вас беспокоит MD5, лучше используйте SHA-1 (ссылка MSDN здесь ). Это алгоритм хеширования, такой же, как MD5, но более сильный. Вы можете иметь хеширование SHA-1 длиной до 512 бит.

Вот пример, сделанный на VB.NET (http://www.obviex.com/samples/hash.aspx).

Вот Министерство внутренней безопасности США, заявляющее, почему люди должны уходить от MD5 (http://www.kb.cert.org/vuls/id/836068). Резюме, это «криптографически сломано»

...