Час від часу хочемо ми цього чи ні, але відбуваються зломи серверів баз даних. З огляду на це, важливо бути впевненим в тому, що конфіденційні дані, такі як паролі користувачів, які не будуть розкриті. Сьогодні, ми висвітлимо тему хешування і заходів щодо захисту паролів у вашому web додатку.
Криптология це досить складна тема в якій я далеко не експерт. До цього дня різні інститути та організації з безпеки займаються дослідженнями в цій галузі.
У цій статті я постараюся викладатися якомога простіше, на тему міцного методу зберігання паролів в web-додатках
Хешування перетворює дані в набір строкових і цілочисельних елементів.
Це відбувається завдяки одностороннім хешем. "Одностороннє" означає, що зробити зворотне перетворення ну дуже вже й складно або зовсім неможливо.
Найпоширеніша хеш функція це md5 ():
Застосовуючи md5 (), ви завжди будете отримувати в якості результату рядок розміром 32 символу. Але ці символи будуть в шістнадцятковому вигляді; технічно хеш може являти собою і 128-бітове ціле. Ви можете поміщати в функцію md5 () рядки і числа будь-якої довжини, але на виході завжди будете отримувати результат у 32 символу. Вже тільки цей факт гарне підтвердження того, що це "одностороння" функція.
Звичайний процес реєстрації:
- Користувач заповнює форму реєстрації, включаючи поле "Пароль".
- Скрипт-обробник поміщає ці дані в базу даних.
- Перед записом в базу, пароль обробляється хеш функцією.
- Оригінальна значення пароля ніде не використовується.
Процес входу в систему:
- Користувач вводить свій логін і пароль.
- Скрипт-обробник хешірует пароль, який ввів користувач.
- Скрипт знаходить запис в базі даних, і зчитує значення пароля, який зберігається в ній.
- Пароль з бази і пароль введений користувачем порівнюються, і якщо вони збігаються (в хешірованного вигляді), то користувача впускають в систему.
Процес хешування пароля буде викладено далі в цій статті.
Зауважте, що оригінальне значення паролі ніде не було збережено. Якщо база даних потрапить до зловмисників, то вони не зможуть побачити паролі, так? Та не зовсім. Давайте подивимося на потенційні "дірки".
"Колізії" виникають тоді коли при хешування двох даних різного типу, виходить один і той же результат. Взагалі-то це залежить від того яку функцію ви використовуєте.
Як це можна використовувати?
Наприклад, я бачив кілька застарілі скрипти, де для хешування пароля використовувалася функція crc32 (). Ця функція повертає в якості результат 32-бітове ціле. Це означає, що на виході може бути тільки 2 ^ 32 (або 4,294,967,296) можливих варіантів.
Давайте захешіруем пароль:
Тепер, давайте пограємо в лиходія, який вкрав базу даних разом з хешірованного паролем. У нас немає можливості перетворити 323322056 в 'supersecretpassword', однак, завдяки простому скрипту ми можемо підібрати інший пароль, який в хешірованного вигляді буде точно такий же як і той, який знаходиться в базі:
Цьому скрипту звичайно потрібен час, але врешті-решт він поверне рядок. Тепер ми можемо використовувати рядок, яку отримали - замість 'supersecretpassword' - що дозволить нам зайти в систему від імені користувача у якого був цей пароль.
Наприклад ось цей скрипт через кілька миттєвостей повернув мені рядок 'MTIxMjY5MTAwNg =='. Давайте протестуємо:
Як це можна запобігти?
У наші дні, навіть на найпростішому домашньому комп'ютері можна використовувати мільярди хеш функцій в секунду. Тому нам потрібна така хеш функція, яка згенерувала якомога більшого значення.
Наприклад можна використовувати md5 (), яка генерує 128-бітові хеші. Таким чином варіантів підбору стає набагато більше 340,282,366,920,938,463,463,374,607,431,768,211,456. Пробіг по всьому итерациям з метою знаходження колізії неможливий. Однак деяким людям все ж вдається знайти "дірки" додатково про це тут).
Sha1 () це найкраща альтернатива тому вона повертає 160-бітний хеш.
Навіть якщо ми розібралися з колізіями, це не означає, що ми убезпечили себе з усіх боків.
Райдужна таблиця будується шляхом обчислення хеш-значення найбільш часто використовуваних слів і словосполучень.
Такі таблиці можуть містити мільйони, а то і мільярди рядків.
Наприклад, для створення такої таблиці можна пройтися по словнику і створити хеш для кожного слова. Так само можна створювати хеши для комбінації слів. Але і це не все; ви можете так само вставляти цифри перед / після / між слів, і теж записувати значення таких хеш в таблицю.
Ось такі величезні Райдужні Таблиці можуть бути складені і використані.
Як це можна використовувати:
Давайте уявимо, що у нас в руках база з десятками тисяч паролів. Особливих труднощів не складе, щоб порівняти їх з значеннями з Райдужній таблиці. Звичайно ж не всі паролі співпадуть, але в кінцевому підсумку парочка інша знайдеться!
Як можна себе захистити:
Просто додамо "солі":
Все, що потрібно зробити, це сконкатеніровать "сіль" і пароль перед хешем. Навряд чи в Райдужних таблицях знайдеться таке значення. Але ми все ще в небезпеці!
Пам'ятайте, що Райдужні таблиці можуть бути сформовані вже після того, як база буде вкрадена.
Як це можна використовувати?
Якщо ви створили сіль, то при крадіжці бази вона потрапить в руки зловмисникам. Все, що їм залишиться зробити це згенерувати нову Веселкову таблицю з "солями", які вони отримали з бази.
Наприклад в Райдужній таблиці є хеш рядка "easypassword". У новій Райдужній таблиці замість минулого значення у них буде міститися рядок "f # @ V) Hu ^% Hgfdseasypassword". Коли вони запустять скрипт, то знову можуть отримати деякі збіги.
Як захиститися?
Ми можемо використовувати "унікальну сіль" яка буде різною для кожного користувача.
Доповненням до солі для того, щоб вона стала унікальною може стати id користувача:
Це само собою має на увазі, що id користувача ніколи не буде змінюватися.
Так само ми можемо згенерувати випадкову рядок для кожного окремого користувача, ніж отримаємо "унікальну сіль". Таку сіль потрібно зберігати там же, де знаходиться запис про користувача.
Цей метод захищає нас від Райдужних таблиць, тому що у кожного пароля є своя унікальна сіль. Атакуючому доведеться створити 10 мільйонів окремих Райдужних таблиць, що на практиці неможливо.
Більшість функцій хешування розроблялися, з огляду на те, що вони часто використовуються для розрахунку контрольних сум якихось значень або файлів з перевіркою цілісності даних.
Як це використовувати?
Як я говорив раніше, комп'ютер з потужною графічною картою може вираховувати мільярди хеш за секунду. Зловмисники можуть застосувати "грубу силу", перевіряючи кожен єдино можливий пароль (проводячи повний перебір всіх можливих варіантів).
Якщо ви думаєте, що пароль з 8 символів може встояти перед "грубої атакою", то уявіть:
- Якщо пароль містить прописні, заголовні букви і цифри, це всього лише 62 (26 + 26 + 10) можливих символу.
- Рядок з 8 символів містить 62 ^ 8 варіантів комбінацій. Це трохи більше 218 трильйонів.
- Якщо обробляти 1 мільярд хеш за секунду, пароль буде підібраний за 60 годин.
Для пароля довжиною 6 символів та ж сама операція триватиме більше 1 хвилини.
Не соромтеся вимагати від користувачів паролі довжиною 9 або 10 символів, хоча це і буде їх нервувати.
Як захищатися?
Використовуйте повільні хеш функції
Уявіть собі, що ви використовуєте хеш функцію, яка генерує 1 мільйон хеш в секунду замість 1 мільярда. Атакуючому прийдеться в 1000 разів довше підбирати паролі. 60 годин перетворяться в 7 років!
Перший варіант самому створити таку функцію:
Або ви можете використовувати алгоритм, який використовує "cost параметр," такий як BLOWFISH. У PHP, це може бути реалізовано за допомогою методу crypt ().
Другий параметр в методі crypt () містить значення, розділені знаками долара ($).
Перше значення це '$ 2a', яке говорить, що ми будемо використовувати алгоритм BLOWFISH.
Друге значення '$ 10'. У цьому випадку це "cost параметр". Це параметр являє собою кількість ітерацій, які будуть проводитися (10 => 2 ^ 10 = 1024 ітерацій.) Значення може бути від 04 до 31.
Давайте запустимо приклад:
В результаті у нас вийшов хеш, який містить алгоритм ($ 2a), cost параметр ($ 10), і сіль довжиною 22 символи. Все інше це хеш. протестуємо:
Якщо ми це запустимо, то отримаємо повідомлення "Доступ дозволений!"
З огляду на все, що ми дізналися, напишемо клас:
За рахунок отримання інформації відразу по двох каналах (зір і слух) ефективність навчання значно перевершує навчання по книгах. А домашні завдання і онлайн-тести дозволять вам постійно думати на мові, що вивчається і відразу перевіряти свої знання!
Якщо ви давно хочете як слід вивчити HTML, то у мене для Вас є чудова новина!
Якщо ви вже вивчили HTML і хочете рухатися далі, то наступним кроком буде вивчення технології CSS.
Якщо ви хочете розібратися з поняттями домену і хостингу, навчитися створювати бази даних, закачувати файли сайту на сервер по FTP, створювати піддомени, налаштовувати поштові скриньки для свого сайту і стежити за його відвідуваністю, то цей курс створений спеціально для вас!