Является ли MD5 менее безопасным, чем SHA et. и др. в практическом смысле? - PullRequest
9 голосов
/ 21 апреля 2009

Я видел a несколько вопросов и ответов на SO, предполагающих, что MD5 менее безопасен, чем что-то вроде SHA.

Мой вопрос: Стоит ли беспокоиться в моей ситуации?

Вот пример того, как я его использую:

  1. На стороне клиента я предоставляю «безопасную» контрольную сумму для сообщения, добавляя текущее время и пароль, а затем хешируя его с помощью MD5. Итак: MD5(message+time+password).
  2. На стороне сервера я проверяю этот хеш против отправленного сообщения, используя мои данные о времени, когда оно было отправлено, и пароль клиента.

В этом примере мне действительно лучше использовать SHA вместо MD5?

При каких обстоятельствах выбор хэш-функции действительно будет иметь практическое значение?

Edit:

Просто чтобы уточнить - в моем примере , есть ли какая-то выгода от перехода на алгоритм SHA?

Другими словами, возможно ли в этом примере кому-либо отправить сообщение и правильный хеш , не зная общего пароля ?

Больше правок:

Извиняюсь за повторное редактирование - я не совсем понял, о чем спрашиваю.

Ответы [ 11 ]

29 голосов
/ 21 апреля 2009

Да, на практике стоит побеспокоиться. MD5 настолько сильно сломан, что исследователи смогли подделать поддельные сертификаты, соответствующие реальному сертификату, подписанному центром сертификации. Это означало, что они могли создавать свои собственные поддельные центры сертификации и, таким образом, могли выдавать себя за любой банк или бизнес, который им казалось, с браузерами, полностью доверяющими им.

Теперь, это заняло у них много времени и усилий, используя кластер PlayStation 3, и несколько недель, чтобы найти подходящее столкновение. Но после взлома алгоритм хеширования становится только хуже, а не лучше. Если вы вообще заботитесь о безопасности, было бы лучше выбрать непрерывный алгоритм хеширования, такой как один из семейства SHA-2 (SHA-1 также был ослаблен, хотя и не сломан так же плохо, как MD5 есть).

edit : Техника, использованная в предоставленной мной ссылке, включала возможность выбора двух произвольных префиксов сообщений и общего суффикса, из которого он мог бы генерировать для каждого префикса блок данных, который мог бы быть вставляется между этим префиксом и общим суффиксом, чтобы создать сообщение с той же суммой MD5, что и сообщение, составленное из другого префикса. Я не могу придумать, каким образом эту конкретную уязвимость можно использовать в описываемой вами ситуации, и в целом использование защищенного ключа для аутентификации сообщений более устойчиво к атакам, чем использование его для цифровых подписей, но Я могу вспомнить несколько уязвимостей, на которые нужно обратить внимание, и которые в основном не зависят от выбранного вами хеша.

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

    Вы можете смягчить эту атаку, сохранив пароль на вашем сервере, хэшированный случайным образом; Вы сохраняете пару <salt,hash(password+salt)> на сервере и отправляете соль клиенту, чтобы он мог вычислить hash(password+salt) для использования вместо пароля в протоколе, который вы упомянули. Однако это не защитит вас от следующей атаки.

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

  3. Метод, который вы предлагаете, не аутентифицирует сервер. Я не знаю, является ли это веб-приложением, о котором вы говорите, но если это так, то тот, кто может выполнить атаку DNS-перехвата, или перехват DHCP в незащищенной беспроводной сети, или что-то в этом роде, может просто сделать атака «человек посередине», при которой они собирают пароли в виде открытого текста от ваших клиентов.

  4. Хотя текущая атака на MD5 может не работать против описанного вами протокола, MD5 серьезно скомпрометирован, и хеш будет только слабее, а не сильнее. Готов поспорить, что вы узнаете о новых атаках, которые могут быть использованы против вас, и у вас будет время обновить алгоритмы хэширования, прежде чем ваши злоумышленники смогут использовать его? Вероятно, было бы легче начать с чего-то, что в настоящее время сильнее, чем MD5, чтобы уменьшить ваши шансы справиться с MD5, сломанным дальше.

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

Если это используется для чего-то, что действительно важно для безопасности, не изобретайте свою собственную систему аутентификации. Просто используйте TLS / SSL . Одним из основных правил криптографии является не выдумывать свои собственные . И потом, даже в случае форума, где это, вероятно, не так уж важно, разве не будет проще просто использовать что-то проверенное с полки, чем раскручивать свое собственное?

12 голосов
/ 21 апреля 2009

В данном конкретном случае я не думаю, что самым слабым звеном вашего приложения является использование md5, а не sha. Способ, которым md5 «ломается», заключается в том, что, учитывая, что md5 (K) = V, можно генерировать K 'таким образом, что md5 (K') = V, потому что выходное пространство ограничено (не потому, что есть какие-либо трюки, чтобы уменьшить пространство поиска). Тем не менее, K 'не обязательно K. Это означает, что если вы знаете, md5 (M + T + P) = V, вы можете сгенерировать P' так, что md5 (M + T + P ') = V, что дает действительную запись , Однако в этом случае сообщение остается прежним, и P не был скомпрометирован. Если злоумышленник попытается подделать сообщение M 'с отметкой времени T', то весьма маловероятно, что md5 (M '+ T' + P ') = md5 (M' + T '+ P), если P' = P. В этом случае они бы взломали пароль. Если они взломали пароль, то это означает, что не имеет значения, использовали ли вы sha или md5, поскольку проверка того, что md5 (M + T + P) = V эквивалентна проверке, является ли sha (M + T + P). ) = V. (за исключением того, что ша может вычислить постоянное время дольше, что не влияет на сложность грубой силы на P).

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

Во-вторых, вам, вероятно, не следует хранить пароль пользователя в вашей базе данных в виде обычного текста. То, что вы должны сохранить, это хеш пароля, а затем использовать его. В вашем примере хэш будет иметь вид: md5 (сообщение + время + md5 (пароль)), и вы можете безопасно хранить md5 (пароль) в своей базе данных. Однако злоумышленник, крадущий вашу базу данных (с помощью SQL-инъекции), все равно сможет подделать сообщения. Я не вижу никакого способа обойти это.

8 голосов
/ 04 мая 2009

Ответ Брайана охватывает вопросы, но я думаю, что его нужно объяснить немного менее многословно

Вы используете неправильный алгоритм шифрования здесь

MD5 здесь не так, Sha1 неправильно использовать здесь Sha2xx неправильно использовать, а Skein - неправильно.

То, что вы должны использовать, это что-то как RSA .

Позвольте мне объяснить:

Ваш безопасный хеш эффективно отправляет пароль на всеобщее обозрение.

Вы упоминаете, что ваш хэш - "время + полезная нагрузка + пароль", если третье лицо получает копию вашей полезной нагрузки и знает время. Он может найти пароль (используя грубую силу или словарную атаку). Таким образом, это почти как если бы вы отправляете пароль в виде открытого текста.

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

Никто в середине не сможет сказать, что в сообщениях, и никто не сможет подделать сообщения.

С другой стороны, MD5 достаточно сильный большую часть времени.

5 голосов
/ 21 апреля 2009

Зависит от того, насколько ценным является содержание сообщений. Семейство SHA явно более безопасно, чем MD5 (где «более безопасный» означает «сложнее подделать»), но если ваши сообщения являются обновлениями в Твиттере, вам, вероятно, все равно.

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

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

Обновление 2: это гораздо более подробный ответ: http://www.schneier.com/essay-074.html

2 голосов
/ 21 апреля 2009

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

Насколько это распространено? В 2007 году группа из Нидерландов объявила, что предсказала победителя президентских выборов 2008 года в США в файле со значением хеш-функции MD5 3D515DEAD7AA16560ABA3E9DF05CBC80 . Затем они создали двенадцать файлов, все идентичные, за исключением имени кандидата и произвольного числа пробелов, которые хэшируются до этого значения. Значение хеша MD5 бесполезно в качестве контрольной суммы, потому что слишком много разных файлов дают одинаковый результат.

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

1 голос
/ 08 мая 2009

Да, стоит позаботиться о том, какой хеш использовать в этом случае. Давайте сначала посмотрим на модель атаки. Злоумышленник может не только попытаться сгенерировать значения md5 (M + T + P), но также может попытаться найти пароль P. В частности, если злоумышленник может собрать наборы значений M i , T i и соответствующий md5 (M i , T i , P), то он / она может попытаться найти P. Эта проблема не была изучена как широко для хэш-функций, таких как поиск столкновений. Мой подход к этой проблеме заключается в том, чтобы попробовать те же типы атак, которые используются против блочных шифров: например, дифференциальные атаки. И поскольку MD5 уже очень чувствительны к дифференциальным атакам, я, конечно, могу себе представить, что такая атака могла бы быть здесь успешной.

Поэтому я рекомендую вам использовать более сильную хеш-функцию, чем MD5. Я также рекомендую вам использовать HMAC вместо md5 (M + T + P), поскольку HMAC был разработан для описываемой вами ситуации и был соответственно проанализирован.

1 голос
/ 21 апреля 2009

если вы собираетесь сгенерировать хэш-макинтош, не придумывайте свою схему. используйте HMAC . Есть проблемы с выполнением HASH (секретный ключ || message) и HASH (сообщение || секретный ключ). если вы используете пароль в качестве ключа, вы также должны использовать функцию получения ключа. взгляните на pbkdf2 .

0 голосов
/ 08 мая 2009

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

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

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

0 голосов
/ 05 мая 2009

Оба MD5 и SHA-1 имеют криптографические недостатки. MD4 и SHA-0 также скомпрометированы.

Возможно, вы можете безопасно использовать MD6, Whirlpool и RIPEMD-160.

См. Следующий powerpoint из Принстонского университета, прокрутите вниз до последней страницы.

http://gcu.googlecode.com/files/11Hashing.pdf

0 голосов
/ 21 апреля 2009

MD5 обеспечивает больше коллизий, чем SHA, что означает, что кто-то может получить тот же хеш из другого слова (но это редко).

Семейство SHA известно своей надежностью, SHA1 было стандартом для ежедневного использования, а SHA256 / SHA512 - стандартом для государственных и банковских приборов.

Для вашего личного веб-сайта или форума я предлагаю вам рассмотреть вопрос о SHA1, а если вы создаете более серьезный тип торговли, я предлагаю вам использовать SHA256 / SHA512 (семейство SHA2)

Вы можете проверить статью в Википедии о MD5 & SHA

...