Уплывающие md5 хэши
По dev-кругам инета, плывут слухи, про слив базы md5 хешей из известных сервисов, и их дальнейшая расшифровка, с помощью перебора или радужных таблиц. Разработчики выдумывают, все новые способы защиты, ну и разумеется взлома. Наткнулся на один интересный комментарий по этому поводу, который приведу здесь..
Оригинал тут: md5() + соль. Хранение паролей в базе данных. Комментарий №24.
Добавлять по очереди то соль, то воду, то ещё чего, можно до бесконечности... Не вижу смысла.
Первая проблема - это, короткий, "не извращённый" (и часто состоящий только из цифр) пароль пользователя. Взлом заключается в сравнении украденного хеша и хеша из "радужной таблицы". Размеры таблицы - не бесконечны. Скажем при переборе всех паролей из 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 раз, да и всё что угодно, я просто повторю ваш код при генерации таблицы хешей и результат будет тот же, а все ваши старания понапрасну... =(((
Так что, надёжной защиты нет. Бывает лишь более надёжная защита, и бывает хакер который хитрее Вас, кстати, который не обязательно умнее Вас!
Author: | Tags: /
| Rating:
Leave a Reply