Что такого сложного в грубой силе хэшей, как MD5? - PullRequest
9 голосов
/ 10 июня 2010

Я просто потратил некоторое время на чтение https://stackoverflow.com/questions/2768248/is-md5-really-that-bad (я очень рекомендую!).

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

Ответы [ 6 ]

5 голосов
/ 10 июня 2010

Прежде всего, md5 и sha1 не являются функциями шифрования, они являются функциями дайджеста сообщений.Кроме того, большинство хэшей разбиваются в реальном мире, используя атаки по словарю, такие как John The Ripper и Rainbow Crack .

John The Ripper лучше всего подходит для подсоленных паролей, когда злоумышленник знаетсоленость.Rainbow Crack хорош для паролей с небольшими неизвестными солями и прямыми хешами, такими как md5($pass).

Для создания таблиц Rainbow Crack требуется много времени, но после этого пароли ломаются за считанные секунды.Это зависит от скорости ваших дисков.

3 голосов
/ 10 июня 2010

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

  1. Коллизии . Если вы запустите sha1 (md5 (текст)), то сначала получите хеш md5, а затем передайте его sha1. Предположим, что функция sha1 имеет 128-битный выход, а md5 также имеет 128-битный выход. Ваш шанс столкновения в функции md5 составляет 1/2 ^ 128. Тогда ваш шанс столкновения в sha1 составляет 1/2 ^ 128. Если любое из них сталкивается, то функция в целом сталкивается, и, следовательно, результат равен (1/2^128) + (1/2^128) или 1/2^127
  2. Грубое принуждение . Запуск sha1 (md5 (текст)) удвоит время, необходимое для поиска исходной строки. Это ничто с точки зрения безопасности. Например, если у вас есть 128-битное выходное пространство для каждого алгоритма, и для полного перебора требуется 1 час, то для получения исходной строки потребуется 2 часа, чтобы дважды выполнить одно и то же перебор. Это было бы то же самое, что увеличение выходного пространства до 129 бит. Однако, если вы действительно хотите сделать грубое принуждение невозможным, вам нужно удвоить выходной размер (который можно сравнить с размером ключа в шифровании).
2 голосов
/ 10 июня 2010

Сначала не создавайте шифрование Message Digest с использованием хеш-функций.

ваш вопрос:

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

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

  1. Для любого данного кода h в вычислительном отношении невозможно найти такой x, что H (x) = h, это свойство называется односторонним или устойчивым к прообразу.

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

  3. В вычислительном отношении невозможно найти любую грушу (x, y) такую, что H (x) = H (y).Это называется устойчивостью к сильным столкновениям.

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

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

Предположим, что (зашифрованный) секретный ключ пользователя украден, и он, как известно, использует одно из 200 000 английских слов в качестве своего пароля.В системе используется 32-битная соль .Соленый ключ теперь является исходным паролем, добавленным к этой случайной 32-битной соли.Из-за этой соли заранее вычисленные хэши атакующего не имеют значения.Он должен вычислить хэш каждого слова с каждой из 2 ^ 32 (4 294 967 296) возможных солей, добавленных до совпадения.Общее количество возможных входных данных можно получить, умножив количество слов в словаре на количество возможных солей: alt text

if H(password+salt)(in system)=H(Your password+salt) (login process)
login else
print<<error
2 голосов
/ 10 июня 2010

Атака столкновением (например, тип, известный против MD5) не приносит особой пользы.Чтобы быть эффективным в отношении пароля, вам нужна атака с предизображением (т. Е. Умение находить входные данные, которые будут хэшировать известный хеш-код).Хотя против MD5 известны атаки с прообразом, в настоящее время они не практичны.

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

1 голос
/ 10 июня 2010

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

Это также не имеет ничего общего с тем, насколько легко будет выполнять брут.силовая атака.Такая атака будет систематически пробовать все возможные пароли в пределах заданного диапазона.Таким образом, если ваш пароль «foobar» и атака проверяет пароль «foobar», не имеет значения, как или сколько раз вы хэшировали пароль, потому что атака методом перебора успешно угадала его.

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

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

0 голосов
/ 10 июня 2010

Хэширование хэша - это своего рода «шифрование через запутывание», которое на самом деле не является лучшей практикой.Вы правы в том, что теоретически это может «уменьшить» вероятность столкновения, но, вероятно, не исключит возможность.Более того, функция хеширования на самом деле не является функцией шифрования, Google "хэширует против шифрования" для нескольких сотен объяснений.

...