Не сип мені сіль на password реанімуємо померлий md5

Жив-був на світі бадьорий парубійко Джон, кличка у того хлопчини була
Різник. У Мережі його знали не інакше як John The Ripper. І ось в один
прекрасний день з'явився його господар і дав Джонні завдання підібрати пароль до хешу,
який господар витягнув з допомогою супермегапріватного сплоітов з порталу аматорів
морських свинок і іншої живності. Працював Джонні довго-довго, поки, нарешті, не
зрозумів, що з хешем щось не те. Звернувся він до свого найкращого друга
PasswordsPro. А той йому: «Дурень ти, Джонні, пас солоний». Ось, власне, з
цього-то все і почалося ...

А тепер відійдемо від теорії і перейдемо до практики. На даний момент відома
купа програм для здійснення підбору паролів: під будь-які платформи і з будь-яким
інтерфейсом, написані гуру і просто початківцями програмістами, охочими
внести свій вклад в історію. Однак, як і буває, в історію потрапляють тільки
най-най. Зараз особливою популярністю користуються такі програмні продукти,
як PasswordsPro. MD5Inside. John the Ripper. ну і, звичайно, відомий
проект RainbowCrack. який взагалі заслуговує
окремої статті.

Розглянемо використання першої з вищезгаданих утиліт в контексті наших
задач. Середня швидкість перебору по набору символів, що складається з латинських
букв нижнього регістру і цифр, на моєму слабкому комп'ютері з каменем 1,7 ГГц і
512 метрами мізків на борту становить тут 3,3 мільйона паролів в секунду. але
люблю я цю утиліту не тільки за її швидкість, але і за функціонал. Це перебір по
словників, за таблицями веселки, попередній перебір з міні-словників з
подальшим повним Брут і т.д. Краще один раз побачити, ніж сто разів прочитати.

Отже, повернемося до наших солоно-маринованим паролів. Думаю, не варто тобі
розповідати, що в алгоритмі MD5, як і в його попередника, можливо
поява колізій (повторів), тобто твій складний пароль довжиною в 32 символу,
містить спецсимволи, цифри, букви різних регістрів, може дати таку ж
хеш-суму, як і, наприклад, п'яти-, шестісімвольний простий пароль
(Теоретично). Однак імовірність появи колізій цифрового дайджесту MD5
критично мала. Виходить щось з розряду: якщо багато-багато мавп посадити
за друкарські машинки, дати їм багато-багато часу, то вони рано чи пізно напишуть
текст, доступний для сприйняття (з появою інтернету з'ясувалося, що це брехня
🙂 - примітка Forb'а). Теоретично це цілком реально, кількість всіх
можливих повідомлень, що дають цифрові дайджести, дорівнює 2 ^ 256. Однак на їх пошук
буде потрібно задіяти занадто багато комп'ютерних ресурсів, повний перебір
значень займе 1,5 * 10 ^ 62, а сумарний обсяг пам'яті для зберігання всіх дайджестів
складе 2 ^ 230. Щоб уникнути цього, а точніше, щоб звести шанс появи
колізії практично до нуля, розробники програмного забезпечення придумали
досить-таки цікавий спосіб штучного ускладнення пароля -
накладання «солі».

Отже, «сіль» являє собою якийсь набір символів; зазвичай це символи
обох регістрів, цифри і спецсимволи, які накладаються або склеюються з
самим паролем або з хеш-сумою пароля.

На даний момент відомі наступні способи накладення солі:
md5 (md5 (salt) .md5 (pass)), md5 (md5 (pass) .salt). Перший спосіб використовується в
форумних движках IPB версії нижче 2.0. *. За замовчуванням сіль і хеш там зберігаються в
таблиці members_converge. Використання соління було введено для підвищення
безпеки системи. На мій погляд, особливо там нічого не підвищився, просто ще
один пункт в сhange-балці проекту. Другий спосіб соління застосовується в форумном
движку vBulletin. Там сіль і хешірованние паролі за замовчуванням зберігаються в таблиці
vb_user. Якщо порівняти криптостойкость обох методів, то другий більш грамотний в
плані реалізації. Перша спроба зробити щось подібне було здійснено в
одному з двигунів для форуму. Суть алгоритму полягала в обчисленні подвійного
MD5-хеша від тексту. Цей спосіб не є чимось навіть трохи схожим на
хороший кріпстойкій алгоритм; перебір пароля, що складається з букв, за допомогою
PasswordsPro займе пару секунд. Особисто я вважаю його використання в якості
основного способу просто небезпечним. У цій статті ми розглянемо спосіб посилення
першого варіанту соління. Приклад буде на мові програмування PHP.

Отже, що ми тут бачимо. Функція обчислення хеш-суми від солоного пасу
досить-таки проста. Спочатку отримуємо хеш від тексту proba
(C0a8e1e5e307cc5b33819b387b5f01fd), потім хеш від самої солі - від 123! ## 038;% asgfHTA
(033352797d18a1bb33e77562559b474d). Далі дві хеш-суми склеюються в одну
рядок (033352797d18a1bb33e77562559b474dc0a8e1e5e307cc5b33819b387b5f01fd). після
цього отримуємо хеш від неї (e612c1f3055ac3f9c31f52d421a3e721). Такий спосіб не
захищає зовсім вже слабкі паролі. Для розкриття їх іноді навіть не треба знати саму
сіль, лише алгоритм накладання. Отримуємо наступні дії:

  1. За хеш-сумі «солоного» пароля знаходимо рядок довгою 64 символу; перебір
    спрощує те, що використовуються лише латинські символи нижнього регістра в
    інтервалі a-f і цифри.
  2. Відрізаємо ту частину отриманого рядка, яка представляє собою хешірованного
    сіль (в нашому випадку це символи з 33-го по 64-ий).
  3. Скармливаем на перебір отриманий рядок (1-32-ой символи).

Все це можна істотно полегшити, якщо використовувати названу вище програму.
Ось як з цієї «проблемою» справляється PasswordsPro:

  1. Викачуємо, розпаковуємо, запускаємо саму програму.
  2. В налаштуваннях вибираємо потрібний нам мову (в моєму випадку це російська).
  3. Після установки потрібного мови і перезапуску оболонки програми тупотимо в пункт
    меню «Атака повним перебором». Мудрувати ми не будемо, тому залишаємо галочку
    тільки на пункті «Набір символів - a..z».
  4. Тепер прийшов час годувати звірка. Додаємо новий хеш, сіль і т.д. хеш:
    e612c1f3055ac3f9c31f52d421a3e721; Salt (HMAC-ключ): 123! ## 038;% asgfHTA. Тип хеша
    вибираємо md5 (md5 (salt) .md5 (pass)) [PHP], тиснемо «Додати» і починаємо перебір.

Як бачиш, цей спосіб не є крипостійкість. Спробуємо посилити його в пару
раз. У моєму алгоритмі я буду використовувати метод зсуву і заміни. Почнемо.

Насамперед варто оголосити масив спецсимволов, які буде брати участь при
роботі методу заміни:

Далі ми отримаємо вже описану вище хеш-суму від стандартного методу соління
(Md5 (md5 (pass) .md5 (salt))):

Оголосимо ще одну змінну, в якій буде зберігатися хеш від населеного пароля:

Наступним кроком буде складання таблиці відповідності хеш-суми від соління і
хеш-суми від не соління.
Таблиця була побудована для з'ясування принципу посилення алгоритму. алгоритм
посилення буде наступним: якщо n'ий символ в MD5-хеше від plain-тексту
(Нешифрованих тексту) є цифрою, то в солоному хеше він зміниться на
спецсимвол, номер якого в раніше оголошеному масиві відповідає цій цифрі.
Тобто другий символ в plain-рядку - нуль. Отже, він замінить символ
«6» в солоній рядку символом «

». Далі, друга умова: якщо n'ий символ в
MD5-хеше від plain-тексту є буквою і потрапляє в діапазон a-d, то в солоній
рядку він переводиться в верхній регістр. Ну і якщо жодне з умови не
виконується, то в солоній рядку він зміниться на символ з відповідним
порядковим номером з рядка md5 (md5 (pass) .md5 (salt)). Ось, власне, лістинг
всього вищеописаного:

Після використання цього посиленого методу простенький пароль proba
перетворюється на звіра «E

21 ». А щоб такий звір не
відрізнявся від інших своїх MD5-братів, перед виведенням на екран, записом в базу
або ж порівнянням переводимо його знову в MD5-хеш. Шанс підбору такого пароля
знижується практично до нуля. Ось повний лістинг статті у вигляді єдиного коду.
Для зручності я зробив його у вигляді звичайної PHP-функції.