Почему невозможно отменить криптографический хэш?

147
24

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


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

спросил(а) 2011-07-07T01:33:00+04:00 8 лет, 7 месяцев назад
1
Решение
199

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


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


Теперь попробуем другой хеш. Для этого я собираюсь представить идею арифметики часов. На часах нет бесконечного количества чисел. Фактически, он просто идет от 0 до 11 (помните, что 0 и 12 одинаковы на часах). Поэтому, если вы "добавите один" в 11, вы просто получите нуль. Вы можете расширить идеи умножения, добавления и возведения в степень на часы. Например, 8 + 7 = 15, но 15 на часах действительно всего 3! Итак, на часах вы сказали бы 8 + 7 = 3! 6 * 6 = 36, но на часах 36 = 0! так что 6 * 6 = 0! Теперь, для концепции власти, вы можете сделать то же самое. 2 ^ 4 = 16, но 16 равно 4. Итак, 2 ^ 4 = 4! Теперь, как это связано с хешированием. Как насчет хэш-функции f (x) = 5 ^ x, но с арифметикой часов. Как вы увидите, это приводит к некоторым интересным результатам. Попробуем взять хэш 7, как и раньше.


Мы видим, что 5 ^ 7 = 78125, но на часах, что всего 5 (если вы делаете математику, вы видите, что мы обернули вокруг часы 6510 раз). Итак, получаем f (7) = 5. Теперь вопрос в том, что если бы я сказал вам, что хэш моего номера равен 5, можете ли вы понять, что мой номер равен 7? Ну, на самом деле, очень сложно вычислить обратное значение этой функции в общем случае. Люди, намного умнее меня, доказали, что в некоторых случаях реверсирование этой функции намного сложнее, чем вычисление ее вперед. (EDIT: Nemo отметил, что это фактически не было "доказано", на самом деле, единственная гарантия, которую вы получаете, заключается в том, что многие умные люди давно пытались найти простой способ сделать это, и ни один из них не преуспел.) Проблема обращения вспять этой операции называется " Задача дискретного логарифма. Посмотрите его для более глубокого освещения. Это, по крайней мере, начало хорошей хэш-функции.


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


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

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

Лучшей ставкой для злоумышленника является атака с использованием bruteforce, где они пробуют кучу паролей. Так же, как вы можете попробовать цифры меньше 12 в предыдущей задаче, злоумышленник может попробовать все пароли, состоящие только из чисел и букв длиной менее 7 символов, или всех слов, которые появляются в словаре. Важно то, что он не может использовать все возможные пароли, потому что существует слишком много возможных 16-символьных паролей, например, когда-либо проверяемых. Итак, дело в том, что злоумышленник должен ограничить возможные пароли, которые он тестирует, иначе он даже не проверит небольшой процент от них.


Теперь, что касается соли, идея такова: что, если у двух пользователей был тот же пароль? У них будет такой же хеш. Если вы думаете об этом, злоумышленнику действительно не нужно взламывать каждый пароль пользователя отдельно. Он просто просматривает все возможные пароли ввода и сравнивает хэш со всеми хэшами. Если он соответствует одному из них, то он нашел новый пароль. Нам бы очень хотелось заставить его вычислить новый хеш для каждой комбинации пользователя и пароля, которую он хочет проверить. Идея соли заключается в том, что вы делаете хеш-функцию немного отличающейся для каждого пользователя, поэтому он не может повторно использовать один набор предварительно вычисленных значений для всех пользователей. Самый простой способ сделать это - привязать какую-то случайную строку к каждому пользовательскому паролю, прежде чем принимать хэш, где случайная строка отличается для каждого пользователя. Так, например, если мой пароль "shittypassword" , мой хэш может отображаться как MD5 ( "6n93nshittypassword" ), и если ваш пароль "shittypassword" , ваш хэш может отображаться как MD5 ( "fa9elshittypassword" ). Этот маленький "fa9el" называется "солью", и он отличается для каждого пользователя. Например, моя соль "6n93n". Теперь этот маленький бит, который привязан к вашему паролю, просто хранится на вашем компьютере. Когда вы пытаетесь войти в систему с паролем X, компьютер может просто вычислить MD5 ( "fa9el" + X) и посмотреть, совпадает ли он с сохраненным хэшем.


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


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


    Они могут пересчитывать хэши для каждого пользователя. Поэтому вместо вычисления MD5 (passwordguess) для каждого пользователя X они вычисляют MD5 (Salt_of_user_X + passwordguess). Это не только заставляет их вычислять новый хеш для каждого пользователя, которого они хотят взломать, но также, что самое главное, он не позволяет им использовать предварительно просчитанные таблицы (например, таблицу радуги, например), потому что они не могут знать, что Salt_of_user_X находится перед рукой, поэтому они не могут предварительно вычислить хеши для тестирования.


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


Надеюсь, это ответит на все ваши вопросы.

ответил(а) 2011-07-07T02:35:00+04:00 8 лет, 7 месяцев назад
147

Подумайте о 2 числах от 1 до 9999. Добавьте их. Теперь скажите мне последнюю цифру.


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

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

ответил(а) 2011-07-07T01:46:00+04:00 8 лет, 7 месяцев назад
70

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


Рассмотрим простую примерную функцию: "OR". Если вы примените это к своим входным данным 1 и 0, это даст 1. Но теперь, если вы знаете, что ответ равен "1", как вы можете отменить исходные данные? Вы не можете. Это могло быть 1,1 или, может быть, 0,1 или, может быть, 1,0.


Что касается соляных и радужных столов. Да, теоретически, у вас может быть радужный стол, который будет охватывать все возможные соли и пароли, но практически, это просто слишком большой. Если вы пробовали все возможные комбинации строчных букв, верхнего регистра, цифр и двенадцати знаков пунктуации длиной до 50 символов, то (26 + 26 + 10 + 12) ^ 50 = 2,9 x 10 ^ 93 различных возможностей. Это больше, чем количество атомов в видимой вселенной.


Идея таблиц радуги заключается в том, чтобы заранее рассчитать хэш для нескольких возможных паролей, а пароли намного короче 50 символов, поэтому это можно сделать. Вот почему вы хотите добавить соль впереди: если вы добавите "57sjflk43380h4ljs9flj4ay" к фронту пароля. Хотя кто-то, возможно, уже вычислил хэш для "pa55w0rd", никто уже не рассчитал значение для "57sjflk43380h4ljs9flj4aypa55w0rd".

ответил(а) 2011-07-07T01:47:00+04:00 8 лет, 7 месяцев назад
49

md5 - 128 бит, что 3.4 * 10 ^ 38 комбинаций.


общее количество паролей длиной в восемь символов:


    только строчные буквы и цифры: 36 ^ 8 = 2,8 * 10 ^ 12
    нижний и верхний и цифры: 62 ^ 8 = 2,18 * 10 ^ 14

Вы должны сохранить 8 байтов для пароля, 16 для значения md5, что 24 байта для каждой записи.


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

ответил(а) 2011-07-07T01:47:00+04:00 8 лет, 7 месяцев назад
49

Я не думаю, что md5 дает вам весь результат - поэтому вы не можете работать назад, чтобы найти оригинальные вещи, которые были md5-ed

ответил(а) 2011-07-07T01:35:00+04:00 8 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема