хешування паролів


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

Перше, що треба зрозуміти: принцип захисту хешем - це принцип "заховати у всіх на виду". Передбачається, що і сам хеш, і всі його елементи (крім пароля, зрозуміло), свідомо відомі атакуючому. Але це йому не допоможе. Це дуже важливо. Слід розуміти, що завдання хешування - не сховати результат роботи хешірующей функції, а навпаки - зробити безпечним навіть в тому випадку, якщо хеш буде скомпрометований.

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

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

Яким типам атак може бути підданий хеш пароля?

1. Пошук хеша по "райдужним таблиць" (rainbow tables): величезних баз даних, де збираються заздалегідь пораховані хеші для будь-яких можливих рядків.
2. Метод грубої сили (bruteforce): перебирати всі комбінації символів і прменять до них хешірующую функцію доти, поки вона не поверне шуканий хеш.
3. Пошук по словнику. Схожий на брутфорс, але перебір не всіх можливих значень, а всього декількох тисяч найпопулярніших паролів, типу "123", "password" та ін.

Для захисту від цих трьох типів атак потрібні різні механізми. це:

1. Для захисту від пошуку про райдужним таблицями була придумана сіль (salt): рядок з випадкових символів, що додається до паролю перед обчисленням хеша. Таким чином ми подовжуємо пароль до такого стану, що ніяка райдужна таблиця не зможе вмістити всіх варіантів.
Недолік солі полягає в тому, що вона повинна зберігатися разом з паролем у відкритому вигляді. І таким чином робить пароль уразливим для двох інших типів атак. Але слід завжди віддавати собі звіт в тому, що це так і задумано - сіль призначена для того, щоб бути скомпрометованої разом з хешем. І захист будується виходячи з того факту, що сіль свідомо відома атакуючому.

Дотримуючись всіх три правила, ми можемо бути впевнені в тому, що навіть при витоку бази паролів, або при зломі додатки або навіть при крадіжці комп'ютера паролі будуть в безпеці. Слід розуміти, що нехтування будь-яким з перерахованих трьох правил зробить паролі уразливими у разі витоку.

Перейдемо тепер до конкретики.

Схожі статті