Хабр не место для репостов и копи-паст — запомнил!
Это репост комментария упомянутого в хабрпосте, а сам комментарий является комментарием (простите за тавтологию) вот на эту статью, где и может быть найден. На мой взгляд ему место на хабре, потому-что он шедеврален! Это должен прочитать каждый программист и DBA, да и вообще полезен для любого %username%.
Добавлять по очереди то соль, то воду, то ещё чего, можно до бесконечности… Не вижу смысла.
Первая проблема — это, короткий, «не извращённый» (и часто состоящий только из цифр) пароль пользователя. Взлом заключается в сравнении украденного хеша и хеша из «радужной таблицы». Размеры таблицы — не бесконечны. Скажем при переборе всех паролей из 6 символов (т. е. перепробовав все возможные символы в таком пароле, например 0-9, a-z, A-Z, всего 62 символа) получаем 62^6 (62 символа в 6-ой степени) = 56'800'235'584 хешей. Каждый длиной 32 байта, значит места на диске для хранения таблицы нужно 56'800'235'584 * 32 = 1'817'607'538'688 т. е. примерно 2 Тбайта. Это не очень много, но и пароль у нас был длиной всего в 6 символов, и именно такие короткие пароли (ну или чуть длиннее 9 -12 символов, но тогда генерируются и хранятся хеши паролей по словарю, т. е. по списку чаще используемых узерами паролей, это обычные слова, цифры ну и т. д., т. е. не «извращённые» пароли). А теперь посчитайте сколько хешей будет при длине пароля в 32 символа. Но заставлять узера вводить и помнить пароль из 32-ух символов, конечно же не реально, поэтому просто-напросто прогоняем реальный пароль узера 2 раза, например функцией md5();. После первого прогона мы получаем пароль, при чём не простой, а «извращённый», и длиной в 32 байта. А при втором прогоне, уже пароля из 32-х символов, получаем новый хеш, который и сохраняем. Теперь, что бы путём перебора определить из имеющегося хеша предыдущий хеш, а за тем по найденному предыдущему хешу — реальный пароль узера, нужна будет, мягко говоря, «бесконечная» таблица хешей…
Вот так, примерно!
Но это всё была присказка!!! а сказка — впереди…
Теперь возвращаемся к нашей главной проблеме, КОРОТКИЕ И ПРОСТЫЕ ПАРОЛИ узеров.
Что мне нужно, что бы «взломать» выше описанный способ «хранения» паролей. А главное — что я уже ИМЕЮ для этого?
А имею я совсем НЕ МАЛО! Можно сказать, что у меня уже есть пароль узера!!! А точнее говоря — у меня уже есть все пароли большинства узеров!!! А почему? да всё потому же! «короткие и простые пароли узеров».
Теперь, что я делаю…
1. Я регюсь на взламываемом сайте.
2. Взламываю БД или то место, где хранятся хеши паролей. (это условие данной темы)
3. Нахожу свой хеш. (по моему имени узера)
-. Зачем мне нужны первые три шага?
+. Для того, чтобы определить, каким образом получают хеш на сайте. Т. е. я перебираю возможные варианты:
md5($pass);
md5(md5($pass));
md5(md5(md5($pass)));
sha1(md5(crypt($pass)));
… и т. д., пока не получу мой хеш!
Если программер использовал просто md5(md5($pass));, то мне легче.
4. «Формула» получения хеша у меня есть, теперь мне нужна прога которая сгенерирует
все хеши ПО ДАННОЙ формуле (скачаю или сам напишу), и не много времени (если в секунду 1'000'000 хешей, то для 56'800'235'584 хешей это около 20 часов, НО это считайте МАКСИМУМ, а если по словарю перебирать или только пароли из цифр, то времени на порядок меньше потребуется).
И ВСЁ! Все пароли длиной до 6-и символов у меня «в кармане»!
И так! Этот метод взломали, теперь ПРО СОЛЬ…
Ломаем метод автора статьи…
-. Выполняю первые 3 шага.
Теперь, если я взломал БД и получил хеши паролей, то я также и получил каждую «солинку»!!!
И что я делаю?
Да всё тоже самое!!!
Просто теперь при поиске «формулы» получения хеша я добавляю эту соль, при чём всеми возможными вариантами!
md5(md5($pass.$salt));
md5(md5($pass).$salt);
md5(sha1($salt.crypt($pass)));
… и т. д…
Ну а далее думаю уже догадываетесь… Генерю все хеши добавляя соль УЖЕ в правильное место и используя правильную формулу.
НО здесь как видите уже есть один «худенький» плюсик.
Речь уже идёт не о взломе всех паролей, а о взломе одиночного аккаутна, соль то для каждого узера своя, а значит генерировать таблицу придётся для каждого узера заново. Во как!
А почему плюсик «худенький»?
Да опять же всё потому, что «ПРОСТЫЕ И КОРОТКИЕ ПАРОЛИ»!!! (на верное я вам уже надоел?!.. терпи'те!)
Начинаю генерить по словарю используя только цифры (большинство паролей — это даты рождения). Обычно на сайте требуют пароль длиной не менее 6-и символов, т. е. я перебираю например:
даты типа 010101; (длина 6 символов, всего их от 01 января 1901 года, до 22 апреля 2011 где то 365*110=36500!!! ВСЕГО ТО ?!!! и это я ещё щедрый, а можно смело убрать первые лет 50 и последние лет 10-15.
Так же, даты когда узер пишет что то типа 111977; (1 января 1977 года, т. е. варианты без нулей)
Так же варианты с 7-и значными датами и с 8-и значными…
«Год у меня был… 3 — за побег… 5 — за дет-сад… ну сколько за старуха дадут? ну пусть 10 лет… И я из-за каких-то 16 лет.........................»
Ну пусть у нас получилось всего 1'000'000 вариантов даты рождения! Если машина генерирует 1'000'000 хешей в секунду — получается я буду вскрывать по узеру в секунду, а если двигаться от младших к старшим, то ещё быстрее!!!
И что у нас получилось? Мы вскрыли за один час — 3600 узеров «с СОЛЬЮ»!
И вся прелесть в том, что и соль НЕ ПОМОГЛА! А почему? Вижу по лицу, уже догадались!
последний раз: «ПРОСТЫЕ И КОРОТКИЕ ПАРОЛИ»!!!
«И что же?» — скажете вы — «значит нет надёжного метода?».
И ПРАВИЛЬНО скажете!
Вы ищете в интернете надёжный метод или как вы ещё любите «часто используемый метод», и при этом вы УЖЕ СОВЕРШАЕТЕ ОШИБКУ! потому, как «то, что знают двое — знают все!» и как вы знаете «то, что один человек построил — другой завсегда поломать сможет».
Ну так и что же делать?
А всё просто, «ХОЧЕШЬ ЖИТЬ — УМЕЙ ВЕРТЕТЬСЯ!»
Не используйте общеизвестные приёмы, или изменяйте их на свой манер, отпиливайте, приклеивайте, меняйте местами, копируйте, придумывайте что то своё, и т. д. и т. п… Думайте своей головой. И вообще, подумайте, а стоит ли овчина выделки?!!! Нужна ли вам эта бетонная крепость, или можно и и так прожить в деревянной… Даже если вы напишете код, который будет чередовать функции хеширования 10-20 раз, например в файле «enter.php». Во первых: что мне помешает написать программку которая будет перебирать все варианты чередования функций md5, sha1, crypt, и т.д., и в итоге будет находить нужную последовательность за считанные секунды. А во вторых: где гарантия, что я не заставлю сервер не выполнить ваш файл «enter.php», а просто прочитать его, или найти в вашем сайте ещё какую дырку и получить исходный код файла. И тогда хоть ваш код чередует 1000 раз, да и всё что угодно, я просто повторю ваш код при генерации таблицы хешей и результат будет тот же, а все ваши старания понапрасну…
Так что, надёжной защиты нет. Бывает лишь более надёжная защита, и бывает хакер который хитрее Вас, кстати, который не обязательно умнее Вас!
P.S. комментарий оставлен неким «k313», возможно этим, если автор оригинального комментария против данного репоста, я уберу.
P.S.S. при данном репосте из оригинального комментария убраны лишние знаки препинания.
Автор: Casus