Вспомним про хеш

Хеш-функция — функция, осуществляющая преобразование массива входных данных произвольной длины в выходную битовую строку установленной длины, выполняемое определенным алгоритмом. Преобразование, производимое хеш-функцией, называется хешированием. Результат преобразования называется хешем.

Хеш-функции применяются в следующих случаях:

  • При построении ассоциативных массивов.

  • При поиске дубликатов в последовательностях наборов данных.

  • При построении уникальных идентификаторов для наборов данных.

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

  • При сохранении паролей в системах защиты в виде хеш-кода (для восстановления пароля по хеш-коду требуется функция, являющаяся обратной по отношению к использованной хеш-функции).

  • При выработке электронной подписи (на практике часто подписывается не само сообщение, а его хеш-образ).

Контрольная сумма

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

MD5 —  алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году. Предназначен для создания контрольных сумм или «отпечатков» сообщения произвольной длины и последующей проверки их подлинности. Алгоритм MD5 основан на алгоритме MD4.

Как работает протокол?

Утилита md5sum, предназначенная для хеширования данных заданного файла по алгоритму MD5, возвращает строку. Она состоит из 32 цифр в шестнадцатеричной системе счисления (016f8e458c8f89ef75fa7a78265a0025).

То есть хеш, полученный от функции, работа которой основана на этом алгоритме, выдает строку в 16 байт (128) бит. И эта строка включает в себя 16 шестнадцатеричных чисел. При этом изменение хотя бы одного ее символа приведет к последующему бесповоротному изменению значений всех остальных битов строки.

 В данном алгоритме предполагается наличие 5 шагов, а именно:

  1. Выравнивание потока

  2. Добавление длины сообщения

  3. Инициализация буфера

  4. Вычисление в цикле

  5. Результат вычислений

На первом шаге “Выравнивание потока” сначала дописывают единичный бит в конец потока, затем необходимое число нулевых бит. Входные данные выравниваются так, чтобы их новый размер был сравним с 448 по модулю 512. Выравнивание происходит, даже если длина уже сравнима с 448.

На втором шаге в оставшиеся 64 бита дописывают 64-битное представление длины данных до выравнивания. Сначала записывают младшие 4 байта. Если длина превосходит 2^{64}-1, то дописывают только младшие биты. После этого длина потока станет кратной 512. Вычисления будут основываться на представлении этого потока данных в виде массива слов по 512 бит.

На третьем для вычислений используются четыре переменные размером 32 бита и задаются начальные значения в 16-ричном виде. В этих переменных будут храниться результаты промежуточных вычислений.

Во время 4-го шага “Вычисление в цикле” происходит 4 раунда, в которых сохраняются значения, оставшиеся после операций над предыдущими блоками. После всех операций суммируются результаты двух последних циклов. Раундов в MD5 стало 4 вместо 3 в MD4. Добавилась новая константа для того, чтобы свести к минимуму влияние входного сообщения. В каждом раунде на каждом шаге и каждый раз константа разная. Она суммируется с результатом и блоком данных. Результат каждого шага складывается с результатом предыдущего шага. Из-за этого происходит более быстрое изменение результата. Изменился порядок работы с входными словами в раундах 2 и 3.

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

Уязвимости MD5

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

На данный момент существуют несколько видов взлома хешей MD5 — подбора сообщения с заданным хешем:

  • Перебор по словарю

  • Brute-force

  • RainbowCrack

  • Коллизия хеш-функции

При этом методы перебора по словарю и brute-force могут использоваться для взлома хеша других хеш-функций (с небольшими изменениями алгоритма). RainbowCrack требует предварительной подготовки радужных таблиц, которые создаются для заранее определённой хеш-функции. Поиск коллизий специфичен для каждого алгоритма. Рассмотрим каждый вид «взлома» по отдельности.

Атаки переборного типа

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

Перебор по словарю — атака на систему защиты, применяющая метод полного перебора предполагаемых паролей, используемых для аутентификации, осуществляемого путём последовательного пересмотра всех слов (паролей в чистом виде) определённого вида и длины из словаря с целью последующего взлома системы и получения доступа к секретной информации.

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

Для полного перебора или перебора по словарю можно использовать программы PasswordsPro, MD5BFCPF, John the Ripper. Для перебора по словарю существуют готовые словари.

RainbowCrack

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

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

Цепочки хешей — метод для уменьшения требования к объёму памяти. Главная идея — определение функции редукции R, которая сопоставляет значениям хеша значения из таблицы. Стоит отметить, что R не является обращением хеш-функции.

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

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

Существует множество систем взлома паролей и веб-сайтов, которые используют подобные таблицы. Основная идея данного метода — достижение компромисса между временем поиска по таблице и занимаемой памятью. Конечно, использование радужных таблиц не гарантирует 100% успеха взлома систем паролей. Но чем больше набор символов, используемый для создания радужной таблицы, и чем продолжительнее хеш-цепочки, тем больше будет шансов получить доступ к базе данных исходных паролей.

Коллизии MD5

Коллизия хеш-функции — это получение одинакового значения функции для разных сообщений и идентичного начального буфера. В отличие от коллизий, псевдоколлизии определяются как равные значения хеша для разных значений начального буфера, причём сами сообщения могут совпадать или отличаться. В 1996 году Ганс Доббертин нашёл псевдоколлизии в MD5, используя определённые инициализирующие векторы, отличные от стандартных. Оказалось, что можно для известного сообщения построить второе такое, что оно будет иметь такой же хеш, как и исходное. С точки зрения математики, это означает следующее:

MD5(I_V, L_1) = MD5(I_V, L_2),

где I_V— начальное значение буфера, а L_1и L_2— различные сообщения.

MD5 был тщательно изучен криптографическим сообществом с момента его первоначального выпуска и до 2004 года демонстрировал лишь незначительные недостатки. Однако летом 2004 года криптографы Ван Сяоюнь и Фэн Дэнго продемонстрировали алгоритм способный генерировать MD5-коллизии с использованием стандартного вектора инициализации.

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

Безопасное использование MD5

MD5 – до сих пор является одним из самых распространенных способов защитить информацию в сфере прикладных исследований, а также в области разработки веб-приложений. Хеш необходимо обезопасить от всевозможных хакерских атак.

Информационная энтропия

Энтропия
Энтропия

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

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

Добавление “соли” к паролю

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

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

Декодирование кода MD5

Иногда при работе с компьютером или поврежденными базами данных требуется декодировать зашифрованное с помощью MD5 значение хеша.

Удобнее всего использовать специализированные ресурсы, предоставляющие возможность сделать это online:

  • md5.web-max.ca -данный сервис обладает простым и понятным интерфейсом. Для получения декодированного значения нужно ввести хеш и заполнить поле проверочной капчи;

  • md5decrypter.com -аналогичный сервис;

  • msurf.ru -данный ресурс имеет простой русскоязычный интерфейс. Его функционал позволяет не только расшифровывать значения хеш-кодов, но и создавать их.

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

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

Создание хеша MD5 является односторонним процессом. Поэтому не подразумевает обратного декодирования первоначального значения. 

Заключение

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

К сожалению, выяснилось, что алгоритм MD5 не способен отвечать данным требованиям.  IETF (Internet Engineering Task Force) рекомендовала новым проектам протоколов не использовать MD5, так как исследовательские атаки предоставили достаточные основания для исключения использования алгоритма в приложениях, которым требуется устойчивость к различного рода коллизиям.

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

Спасибо за внимание!

Комментарии (25)


  1. bolk
    12.12.2021 17:09
    +26

    Так он лет 10, наверное, уже считается небезопасным.


    1. trokhymchuk
      12.12.2021 17:28
      +15

      Лет 10 устаревшим (а.к.а. "криптографически уязвимым и непригодным для использования"), а небезопасным все 15-20.


    1. GarretThief
      12.12.2021 19:30
      +3

      В 1996 году Ганс Доббертин (Hans Dobbertin) объявил о коллизии в алгоритме[4], и уже в то время было предложено использовать другие алгоритмы хеширования.


    1. vkni
      12.12.2021 20:58
      +4

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


  1. makkarpov
    12.12.2021 17:11
    +23

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

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

    Причина очень простая - например, RTX 3090 дает 9.5 GH/s на SHA-256 (и 95 GH/s на MD5, для сравнения). Для парольной аутентификации существуют PBKDF, scrypt, bcrypt, argon2 и прочие функции, созданные специально для этих целей.


    1. gonol Автор
      13.12.2021 10:35

      Спасибо за внимание к нашей статье!

      Действительно, хорошее пояснение.


    1. identw
      13.12.2021 18:53
      +1

      Причина очень простая - например, RTX 3090 дает 9.5 GH/s на SHA-256 (и 95 GH/s на MD5, для сравнения)

      Простите за глупый вопрос, но мне все же не очень понятно.
      Если пароль нормальный, допустим 16 символов в нижнем и верхнем регистре + цифры.
      Условный YmLUa8BBZDp9SvPS

      Это по идее (2*26 + 10)^16 = 47672401706823533450263330816 комбинаций
      95GH/s это как я понимаю 95 * 10^9 хешей в секунду = 95000000000

      47672401706823533450263330816 / 95000000000 ~= 47672401706823533450 секунд ~= 1511681941489 годов подбора на указанной вами скорости. Звучит не очень впечатляюще если честно.

      Я скорее всего ошибаюсь, но как я понимаю, если у вас нормальный пароль, то вполне безопасно хранить его и в md5. Возможно стоит упоминать это. Просто когда говорят "md5 небезопасный", то как будто имеется в виду, какой бы у вас пароль не был захеширован этим алгоритм, злоумышленник его узнает легко и просто.

      Как я понимаю у алгоритма md5 есть уязвимости и проблемы с коллизиями. Но он разве вот прям легко взламывается? И это легко мне докажут, я полагаю? Предлагаю написать варианты паролей, md5 от которых будет равен 0a592abfeb0bd49c4179c999b7f00043 (я спрашиваю потому что не один из сервисов, предложенные в статье, не подобрали пароль на этот хеш)


      1. makkarpov
        13.12.2021 19:00
        +1

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

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


        1. identw
          14.12.2021 11:57
          +1

          Угу, я понял. То есть корректней все таки утверждать, что хеши md5 небезопасно использовать в случае слабых и легко подбираемых паролей. Конечно, если вы не контролируете то, каким будет пароль, то лучше md5 не использовать. Это логично. В общем случае конечно лучше использовать PBKDF, scrypt, bcrypt, argon2.


  1. zorn-v
    12.12.2021 17:23

    RTX 3090 дает

    А расплодившиеся ASIC'и и того больше )

    argon2 против асиков и придумана. Ну а так да, странно читать про "закат МД5", который уже давно закатился )

    Хотя s3 использует его для хешей файлов.


    1. pohjalainen
      12.12.2021 17:51
      +10

      Это же реферат, он здесь потому, что какому-то преподавателю лень читать самому, а не для того, чтобы что-то новое донести.

      И у меня бомбит от этого.


  1. Scratch
    12.12.2021 20:04
    +1

    Создание хеша MD5 является односторонним процессом. Поэтому не подразумевает обратного декодирования первоначального значения. 

    Иногда при работе с компьютером или поврежденными базами данных требуется декодировать зашифрованное с помощью MD5 значение хеша.

    Вы или крестик снимите или трусы наденьте


    1. unsignedchar
      12.12.2021 23:30
      +1

      s/требуется/хочется/

      хочется != всегда получается


  1. vvzvlad
    12.12.2021 20:04
    +11

    Почему у меня ощущение, что автор не понимает о чем пишет, а просто компилирует найденную информацию?


    1. cepera_ang
      12.12.2021 20:08
      +7

      Потому что это так и есть.


  1. hello_my_name_is_dany
    12.12.2021 20:34

    Я думал, нашли что-то быстрее и надёжнее, чем MD5, чтобы проверять хеш-суммы тех же файлов, а тут вот оно как...


    1. zorn-v
      12.12.2021 21:28
      -1

      Так sha1 же. Весь гит на нем живет )

      Насколько помню по своим замерам - он быстрее md5

      md5 специально медленный. Типа против перебора (сейчас не актуально).

      Ну а насчет "надежности" - argon2 сейчас.

      Ну тут вопрос еще что вы подразумеваете под "надежностью" ?


      1. Scratch
        12.12.2021 21:40
        +2

        В вашем ответе мимо примерно всё.
        Для SHA-1 уже давно есть коллизии, он такой же небезопасный как и MD5.
        MD5 никакой специально не медленный.
        Если нужно быстрее и надёжнее чем MD5 - blake2 (3) в помощь


        1. Wesha
          12.12.2021 21:57

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


          1. zorn-v
            12.12.2021 22:28

            Давайте определимся, что мы обсуждаем

            Да, вот тоже "надежность" по этому в кавычки взял )


        1. zorn-v
          12.12.2021 22:00

          Для SHA-1 уже давно есть коллизии, он такой же небезопасный как и MD5.

          Я не утверждал что нет коллизий. Но нет, он безопаснее МД5 в области коллизий.

          Давайте я вам дам хеш, а вы найдете коллизию sha1 ?

          Если на МД5 это можно сделать на любой хеш, то для sha1 можно просто подобрать 2 файла с одинаковым хешем (что в практическом смысле бесполезно). Это если моя память меня не подводит.


          1. funny_falcon
            13.12.2021 20:21

            Для md5 тоже не на любой хэш.

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

            Но без добавления суффикса подбора коллизии для произвольного сообщения все ещё нет.

            Например, сообщение plain text на человеко-читаемом языке все ещё безопасно подписывать, т.к. подобрать человекочитаемый суффикс вряд ли получится.

            а вот pdf уже нельзя, т.к. внутрь pdf произвольный бинарный блоб можно вставить.


        1. Gem
          13.12.2021 03:37

          А если нужно быстрее и файлы xxhash murmurhash или cityhash


  1. peacemakerv
    12.12.2021 20:50

    Ну, а нельзя выпустить в свет MD7 поправленный наконец? MD6 вроде бы уже тоже был...


    1. Gem
      13.12.2021 03:43

      На фоне sha3 blake2 и некриптохешей типа xxhash -- он не выделяется ни скоростью ни надёжностью