Каким образом значения хеша MD5 не являются обратимыми?

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

Если на моем сервере, в PHP я создаю:

md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"

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

Разве это не означает, что есть способ деконструировать происходящее и изменить значение хэша?

Что это за эти функции, из-за которых невозможно восстановить результирующие строки?

Ответ 1

Входной материал может быть бесконечной длины, где выход всегда имеет длину 128 бит. Это означает, что бесконечное количество входных строк будет генерировать один и тот же вывод.

Если вы выберете случайное число и разделите его на 2, но только запишите остаток, вы получите либо 0, либо 1 - четный или нечетный, соответственно. Можно ли взять 0 или 1 и получить исходный номер?

Ответ 2

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

Ответ 3

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

Рассмотрим эту функцию (в нотации PHP, как вопрос):

function simple_hash($input) {
     return bin2hex(substr(str_pad($input, 16), 0, 16));
}

Это добавляет некоторые пробелы, если строка слишком короткая, а затем берет первые 16 байтов строки, а затем кодирует ее как шестнадцатеричную. Он имеет тот же размер вывода, что и хэш MD5 (32 шестнадцатеричных символа или 16 байтов, если мы опускаем часть bin2hex).

print simple_hash("stackoverflow.com");

Это выведет:

737461636b6f766572666c6f772e636f6d

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

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

Важными предположениями для криптографической хэш-функции являются:

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

Очевидно, моя функция simple_hash не выполняет ни одно из этих условий. (На самом деле, если мы ограничиваем входное пространство "16-байтными строками", тогда моя функция становится инъективной и, следовательно, даже доказуемой устойчивостью к прочности и устойчивостью к столкновениям.)

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

Чтобы ответить на реальный вопрос:

Что это за эти функции, которые делают результирующие строки невозможно восстановить?

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

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

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

Ответ 4

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

Ответ 5

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

Например,

"hello" -> "1ab53"
"Hello" -> "993LB"
"ZR#!RELSIEKF" -> "1ab53"

(Очевидно, что не фактическое шифрование MD5)

Большинство хешей (если не все) также не уникальны; скорее, они достаточно уникальны, поэтому столкновение очень маловероятно, но все же возможно.

Ответ 6

Хороший способ подумать о хэш-алгоритме - подумать об изменении размера изображения в Photoshop... скажем, у вас есть изображение размером 5000х5000 пикселей, и вы измените его размер до 32x32. То, что у вас есть, все еще является представлением исходного изображения, но оно намного меньше и эффективно "выбрасывает" определенные части данных изображения, чтобы оно соответствовало меньшему размеру. Поэтому, если бы вы изменили размер изображения размером 32x32 до 5000x5000, все, что вы получили, это размытый беспорядок. Однако, поскольку изображение 32x32 не так велико, теоретически можно было бы предположить, что другое изображение может быть уменьшено для получения одинаковых пикселей!

Это просто аналогия, но она помогает понять, что делает хэш.

Ответ 7

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

Ответ 8

Поскольку количество возможных входных файлов больше числа 128-битных выходов, невозможно однозначно назначить хеш MD5 для каждого возможного.

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

Эти критерии иногда используются:

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

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

Число 3 означает номер 2.

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

Ответ 9

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

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

Ответ 11

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

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

Ответ 12

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

regd ваш вопрос: это односторонний хеш. вход (независимо от длины) будет генерировать выходной сигнал фиксированного размера (он будет дополнен на основе algo (граница 512 бит для MD5)). Информация сжимается (теряется) и практически невозможна для генерации из обратных преобразований.

Дополнительная информация о MD5: она уязвима для коллизий. недавно прошли эту статью, http://www.win.tue.nl/hashclash/Nostradamus/

открывает исходный код для реализации хэш-шифрования (MD5 и SHA) в коде Mozilla. (библиотека freebl).

Ответ 13

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

Например, попробуйте следующий хеш-код в http://gdataonline.com/seekhash.php, чтобы узнать, какой текст я использовал для вычисления хэша

aea23489ce3aa9b6406ebb28e0cda430

Ответ 14

f (x) = 1 необратимо. Хэш-функции не являются необратимыми.

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

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

Однако это игнорирует тот факт, что разумный открытый текст, созданный из семени password, намного, гораздо более вероятен, чем другой, произведенный семенем Wsg5Nm^[email protected]$IH$TYqiWvK!%&Ue&nk55ak%BX%9!NnG%32ftud%YkBO$U6o, до тех пор, пока кто-либо, утверждающий, что второй был возможностью, будет смеяться.

Таким же образом, если вы пытаетесь решить между двумя потенциальными паролями password и Wsg5Nm^bkI4EgxUO, это не так сложно сделать, как вы могли бы поверить некоторым математикам.

Ответ 15

Лучший способ понять, что означают все наиболее голосованные ответы, - это попытаться вернуть алгоритм MD5. Я помню, что несколько лет назад я пытался вернуть алгоритм MD5crypt, а не восстанавливать исходное сообщение, потому что это явно невозможно, а просто для генерации сообщения, которое создавало бы тот же хеш, что и исходный хеш. Это, по крайней мере теоретически, предоставило бы мне способ войти на устройство Linux, которое хранило бы пароль пользователя в файле /etc/passwd, используя сгенерированное сообщение (пароль) вместо исходного. Поскольку оба сообщения будут иметь одинаковый хэш, система распознает мой пароль (сгенерированный из исходного хэша) как действительный. Это не сработало. Через несколько недель, если я правильно помню, использование соли в исходном сообщении меня убило. Я должен был создать не только действительное начальное сообщение, но и соленое действительное начальное сообщение, которое я никогда не мог сделать. Но знание, которое я получил от этого эксперимента, было приятным.

Ответ 16

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

  • Хешируйте пароль по своему выбору и помещайте результаты в таблицу паролей, если у него есть права на запись/редактирование в таблице.
  • Генерировать хешированные значения общих паролей и проверять существование подобных хэшированных значений в таблице паролей.

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