Хэш-функции (Hash-functions)

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

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

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

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

Простой пример: Мы хотим сохранить строку test, как пароль для пользователя Admin. Для этого мы записываем в базу паролей:
Admin = 098f6bcd4621d373cade4e832627b4f6 (эта последовательность символов есть хеш-значение MD5 от строки test).

Теперь мы можем проверить любую строку на соответсвие нашему паролю очень просто - посчитаем от нее хеш-значение, и сравним с тем, которое мы сохранили в базе.

Для примера, MD5 от строки rest - это 65e8800b5c6800aad896f888b2a62afc и оно не совпадает с тем, что мы сохранили. А значит, rest - не пароль для Admin.

В то же время, MD5 от строки test - это всегда 098f6bcd4621d373cade4e832627b4f6, что совпадает с сохраненным значением. А значит, test всегда подойдет как пароль к Admin.

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

А потому, сам процесс атаки делится на три этапа:


А теперь немного подробнее.

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

Тем не менее, в сети Интернет, существует немало сайтов, предоставляющих хеш-значения для восстановления. Например:

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


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

Единственное, что может дать определенную информацию - это длина хеш-значения в символах. Она должна соответствовать в точности разрядности хеш-функции, которую можно узнать, например, из программы The UDC, на вкладке *Прогресс* (надо заметить, что чтобы перевести биты в символы, число бит нужно поделить на 4).

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

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

Вот самые простые соответствия хеш-функциям из UDC и реальным системам:


Большая часть информации об атаке на хеш-значения перебором находится в основной справке.

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

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

 

© The [SNS] Technologies, 28 апреля 2007