Есть ли смысл шифровать пароли с более чем md5? - PullRequest
2 голосов
/ 17 ноября 2009

Я не эксперт по безопасности ... поэтому я могу ошибаться.

Прав ли я в том, что единственным преимуществом использования более мощного алгоритма является замедление взлома пароля?

В каком случае они должны иметь хеш-пароль и, таким образом, они уже скомпрометировали мою базу данных, верно?

Поскольку я не храню ничего ценного в реальном мире, какой смысл использовать алгоритм надежного пароля? Если они уже есть в моей базе данных, они могут изменить все, что захотят, так зачем им пароли?

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

Я реализовал SHA256 ... но мне интересно, стоило ли оно того

Ответы [ 8 ]

13 голосов
/ 17 ноября 2009

MD5 - это не шифрование, это односторонний хеш.

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

В этом случае они должны иметь хэш пароля и так уже будет Скомпрометировал мою базу данных верно?

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

SHA-256 должно быть более чем достаточно, но убедитесь, что вы также солите пароль. Ваши функции должны выглядеть следующим образом (псевдокод):

fun store_password(plaintext):
    salt = random_alphanumeric(40) # maybe put 40 in a config, or #define somewhere
    hashed = sha256_digest(salt + plaintext)
    return "sha256!" + salt + "!" + hashed

fun check_password(plaintext, stored):
    algo, salt, hashed = stored.split("!")
    if algo == "sha256"
        return (sha256_digest(salt + plaintext) == hashed)
    else if ... # other supported password schemes here

Комментатор ниже указал, что при достаточно мощном злоумышленнике (или слабых паролях) хранение полной соли может привести к грубому взлому открытого текста. Если вы обеспокоены этим, используйте соль из двух частей. Каждый раз генерируйте его часть (saltA), а другую сохраняйте в файле конфигурации (saltB). Затем объедините их для генерации / проверки паролей:

import my_config

fun store_password(plaintext):
    saltA = random_alphanumeric(40)
    hashed = sha256_digest(saltA + my_config.saltB + plaintext)
    return "sha256!" + saltA + "!" + hashed

fun check_password(plaintext, stored):
    algo, saltA, hashed = stored.split("!")
    if algo == "sha256"
        return (sha256_digest(saltA + my_config.saltB + plaintext) == hashed)
    # ...

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

4 голосов
/ 17 ноября 2009

У Джеффа есть отличный пост под названием Возможно, вы неправильно храните пароли , в котором рассматриваются проблемы, связанные с этим типом хранения паролей. Настоятельно рекомендуется к прочтению.

2 голосов
/ 17 ноября 2009

Использование более сильного алгоритма, вероятно, того стоит.

Прежде всего, большинство пользователей MD5, вероятно, используют библиотеку, которая была протестирована и проверена. Многие из этих библиотек бесплатны и имеют открытый исходный код. И большинство из них также предоставят алгоритмы SHA-1 и, возможно, даже алгоритмы SHA-2.

Таким образом, «стоимость» использования SHA-1 или SHA-256, вероятно, будет очень мала.

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

Я думаю, что стоит перейти на лучший алгоритм хеширования.

Кроме того, мотивация отказа от MD5 в пользу SHA-1 или SHA-256 заключается в том, что MD5 "сломан". Существуют горячие клавиши для нахождения коллизий хешей, поэтому грубая сила не требуется. Чтобы замедлить атаку грубой силой, вам также нужно использовать технику усиления ключа. Обычно это означает повторение операции хеширования несколько тысяч раз. Вам также понадобится использовать случайную соль, чтобы помешать предварительно вычисленным поисковым таблицам, таким как радужные таблицы.

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

2 голосов
/ 17 ноября 2009

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

Кстати: криптографические хеш-функции построены так, что вы не можете декодировать исходный текст. Шифрование всегда вам восстановить исходный текст, только если вы знаете пароль.

2 голосов
/ 17 ноября 2009

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

По сути, вы должны прочитать все, что имеет отношение к тому, что вы пытаетесь сделать, по адресу http://www.owasp.org и следовать его Т, если только вы не считаете себя исследователем безопасности.

1 голос
/ 17 ноября 2009

Да, SHA-256 рекомендуется для паролей. Фактически для защищенного программного обеспечения правительства США это обязательный NIST, начиная с 2010 года.

См. http://www.openssl.org/ для бесплатной криптографической библиотеки с открытым исходным кодом, которая утверждена FIPS. Он реализует алгоритмы дайджеста сообщений, включая семейство SHA-2.

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

0 голосов
/ 17 ноября 2009

Если вы введете более надежные пароли, он будет работать без изменения алгоритма. MD5 не должен быть обратимым, по крайней мере, для начинающего "хакера". использование хороших паролей (длиннее 12 символов и использование как цифр, так и заглавных и строчных букв) будет работать лучше, чем изменение алгоритма.

@ Джон Милликин имел хорошие намерения насчет пароля - это даже лучше, чем просто применение хорошего пароля.

0 голосов
/ 17 ноября 2009

Если пароль пересекает провод любым незашифрованным способом (например, это пароль для веб-приложения, работающего на сервере без SSL), то они не обязательно будут иметь доступ к вашей БД, только к трафику трафика , Так что в этом случае вам нужно убедиться, что пароль защищен настолько, насколько вы можете получить его в разумных пределах, следовательно, используйте что-то более надежное, чем MD5.

...