Дополню немного подредактированным FAQ из PasswordsPRO.
FAQ
Q1: У меня есть хэш "XXXYYYZZZ". Какой у него тип (т.е. алгоритм хэширования)? A: 1) Ниже перечислены некоторые типы хэшей:
- если хэш начинается с сигнатуры "$1$", то обычно это MD5 (Unix) хэш.
- если хэш начинается с сигнатуры "$apr1$", то обычно это MD5 (APR) хэш.
- если хэш имеет длину 8 байт, то это может быть MySQL-хэш или любой более длинный хэш, "урезанный" до длины 8 байт - например, MD5-хэш.
- длину 16 байт обычно имеют следующие типы хэшей:
- -MD2, MD4, MD5, LM, NT и другие алгоритмы;
-некоторые SALT'овые алгоритмы, например, md5(md5($pass).$salt);
-некоторые составные алгоритмы, например, md5(md5($pass)) и др.
- если хэш имеет длину 20 байт, то это может быть SHA-1, MySQL5 и др.
2) Иногда хэш может быть в Base64-кодировке (а не в стандартном HEX-виде) и для более точного анализа его необходимо преобразовать в текстовый вид. Для этого также можно использовать вышеупомянутый сервис или соответствующий инструмент в программе.
Q2: Если я могу быстро вычислить хэш от своего пароля, то почему я не могу быстро сделать обратную операцию - вычислить пароль на основе хэша?
Любой алгоритм хэширования фактически представляет собой подсчет контрольной суммы от исходного текста. При этом используются необратимые математические операции над исходным сообщением, такие как AND и др. Например, даже если в выражении "X AND Y = Z" мы знаем Y и Z, то мы никогда не сможем по ним точно восстановить исходное значение X (максимум, что мы можем - это рассчитать область возможных значений X, удовлетворяющих данному равенству). Это одна из причин, почему обратное преобразование "хэш -> пароль" невозможно (теоретически, можно лишь рассчитать область возможных исходных паролей, но на практике это нереальная задача). Вторая же причина, почему невозможно абсолютно точно вычислить исходный пароль на основе хэша - это коллизии.
Что такое коллизии?
Так как область выходных значений (всевозможных хэшей) в любом алгоритме хэширования является величиной конечной и определяется размером хэша (к примеру, для алгоритма MD5 количество возможных хэшей составляет 2128 или 3.4*1038 вариантов), а количество входных значений (исходных сообщений) - величина бесконечная, то само собой существуют такие исходные сообщения, которым соответствует один и тот же хэш. Такие исходные сообщения и называются коллизиями.
Что такое SALT и SALT-овые хэши?
SALT (или так называемая "привязка") в основном используется для того. чтобы пользователи, использущие одинаковые пароли, имели различные хэши. Как правило, SALT - это строка из 4...8 случайных символов, которая дополнительно используется для хэширования паролей пользователей и сохраняется вместе с финальным хэшем (как, к примеру, сделано в MD5 (Unix)-хэшах) или же хранится отдельно от хэша.
Почему у SALT'овых хэшей низкая скорость перебора?
В крайне упрощенном виде перебор паролей к обычным (не-SALT'овым) хэшам происходит так - однократно подсчитывается хэш от текущего пароля, а затем хэш многократно сравнивается со всеми перебираемыми хэшами. При восстановлении же паролей к SALT'овым хэшам текущий пароль приходится хэшировать отдельно для каждого пользователя, т.к. у них разные SALT'ы. Само собой, скорость любой атаки при этом будет снижена пропорционально количеству пользователей.
Почему у MD5 (Unix) и MD5 (APR) хэшей низкая скорость перебора?
Это связано с тем, что помимо использования SALT'ов, эти хэши формируются в цикле на 1000 итераций, в каждой из которых вызывается от 2 до 4 обычных MD5-преобразований. В результате скорость атаки для таких хэшей в тысячи раз ниже по сравнению с обычными MD5-хэшами.
Где используются хэши, имеющие в PasswordsPro суффикс [PHP]?
Суффикс [PHP] указывает на то, что эти алгоритмы по своему синтаксису соответствуют PHP-коду, в котором они обычно и применяются:
- md5(md5($pass)) [PHP] - используется в форуме e107.
- md5(md5($pass).$salt) [PHP] - используется в форуме vBulletin 3.x.x.
- md5(md5($salt).md5($pass)) [PHP] - используется в форуме IPB 2.x.x.
Что такое "словари" и где их взять?
Словарь - это текстовый файл, в котором находятся возможные пароли пользователей (одна строка файла - один пароль). Это могут быть как часто употребляемые пароли ("admin", "master" и др.) так и пароли из нужного диапазона символов ("1111" - "9999"), которые можно сгенерировать внешней утилитой "Генератор словарей".
про словари смотри ссылки:
https://forum.antichat.ru/thread13640.html
http://www.insidepro.com/rus/download.shtml