Каковы важные моменты в криптографических хеш-функциях?

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

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

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

Что происходит, когда размер входных данных меньше фиксированного размера выходных данных (например, хеширование пароля "abc" )?

EDIT:

Хорошо, дайте мне посмотреть, есть ли у меня это прямо:

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

Ответ 1

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

Устойчивость к прообразу - это другое свойство, чем обратимость. Функция обратима, если задано y = f (x), существует ровно один x, который подходит (легко или нет). Например, определим f (x) = x mod 10. Тогда f не обратимо. Из f (x) = 7 вы не можете определить, было ли x 17, 27 или что-то еще. Но f не является устойчивым к прообразу, так как значения x 'такие, что f (x) = 7 легко найти. x '= 17, 27, 12341237 и т.д. все работают.

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

Ответ 2

Предупреждение: длинный ответ

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

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

(Несмотря на распространенное мнение о ненадежности MD5, MD5 по-прежнему устойчив к прообразу. Любой, кто не верит мне, может дать мне все, что хеширует до 2aaddf751bff2121cc51dc709e866f19. Что MD5 не имеет, это сопротивление столкновения, что совсем другое.)

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

Так возникает вопрос: почему бы и нет? (Или, другими словами, как вы делаете функцию прообразом устойчивой?)

Ответ заключается в том, что криптографические хеш-функции имитируют хаотические системы. Они берут ваше сообщение, разбивают его на блоки, смешивают эти блоки вокруг, блокируют некоторые из блоков, смешивают эти блоки вокруг и повторяют это много раз (ну, одна криптографическая хэш-функция делает это, другие имеют свои собственные методы). Поскольку блоки взаимодействуют друг с другом, блок C не только должен взаимодействовать с блоком D, чтобы создать блок A, но он должен взаимодействовать с блоком E, чтобы создать блок B. Теперь, конечно, вы можете найти значения блоков C, D, E, который будет генерировать блоки A и B в вашем хеш-значении, но по мере того, как вы идете дальше назад, вам понадобится блок F, который взаимодействует с C, чтобы сделать D, а с E сделать B, и такой блок не может делать как в в то же время! Вы должны были угадать неправильные значения для C, D и E.

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

Ответ 3

1: Основная цель хэша состоит в том, чтобы отобразить очень и очень большое пространство в меньшем, но все же очень большом пространстве (например, MD5, который возьмет "что угодно" и преобразует его в пространство размером 2 ^ 128 - большой, но не такой большой, как aleph-0.)

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

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

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

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

2: Да, хэши всегда вызывают потерю данных, за исключением случаев, когда ваше пространство вывода такое же, как или больше, чем ваше входное пространство - и в этом случае вам, вероятно, не нужно хешировать!

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

edit. В криптографии важно также, чтобы хеш-функция была устойчивой к атакам preimage, интуитивно, что трудно угадать вход для данного выхода, даже зная много других пар ввода/вывода, Функция "sum", вероятно, можно было бы догадаться довольно легко (но поскольку она уничтожает данные, все же может быть нелегко отменить).

Ответ 4

Это свойства хэш-функций вообще.

Слово предостережения, однако, MD5 больше не следует использовать из-за обнаруженных в нем уязвимостей. Проверьте раздел "Уязвимости" и внешние ссылки, подробно описывающие эти атаки. http://en.wikipedia.org/wiki/Md5 Вы можете сделать столкновение MD5, изменив только 128 бит в сообщении.

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

SHA-256 является безопасной отправной точкой для технологий в течение следующих нескольких десятилетий.

Ответ 5

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

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

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

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

Ответ 6

"почему значения MD5 не меняются?" потому что "бесконечное количество входных строк" ​​будет генерировать один и тот же вывод "

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

Когда размер ввода меньше размера блока, padding используется для соответствия его размеру блока.