Хешування паролів - це важливий елемент захисту інформації в сучасних системах. Використання солі в хешуванні додає додатковий рівень безпеки, а алгоритм BCrypt дозволяє забезпечити високу стійкість до атак грубою силою та інших видів атак.
Що таке хешування?
Хешування - це процес перетворення вхідних даних (наприклад, пароля) у фіксовану довжину рядок, який називається хеш. Хеш-функція є односторонньою, що означає, що отриманий хеш неможливо легко перетворити назад у вихідні дані. Хешування широко використовується для зберігання паролів у базах даних, оскільки зловмисники, навіть отримавши хеші, не зможуть легко відновити вихідні паролі.
Сіль у хешуванні
Сіль - це випадкове значення, яке додається до пароля перед його хешуванням. Основна мета солі - зробити кожен хеш унікальним, навіть якщо користувачі використовують однакові паролі. Це допомагає захистити паролі від атак за попередньо обчисленими хешами, таких як атаки за словником або атаки за допомогою веселкових таблиць (rainbow tables).
Plaintext | Hash (MD5) |
---|---|
password1 | e38ad214943daad1d64c102faec29de4afe9da3d |
123456 | e10adc3949ba59abbe56e057f20f883e |
qwerty | d8578edf8458ce06fbc5bb76a58c5ca4 |
Як працює сіль і хешування паролів
Генерація солі. Коли користувач реєструється або змінює пароль, генерується випадкова сіль (наприклад, 16 байтів).
Додавання солі до пароля. До пароля додається сіль.
Хешування пароля з сіллю. Отриманий результат хешується за допомогою криптографічної хеш-функції (наприклад, SHA-256, bcrypt).
Збереження результату. У базі даних зберігається як хешований пароль, так і сіль (*у випадку, якщо не використовувати BCrypt).
id | username | password_hash | salt |
---|---|---|---|
1 | john_doe | 5e884898da28047151d0e56f8dc6292773603d0d6aabbdded6d23ffbc0efef1a | 3d2e1f4c5a6b7c8d |
2 | jane_smith | 12dada3e0f772f5a5ebd56a0c2928a16b9bb6c3a5044e79a4cb5d5a1f12a2e04 | 1a2b3c4d5e6f7g8h |
Як порівняти паролі
Отримання введеного пароля. Система отримує пароль, введений користувачем.
Отримання солі з бази даних. Система витягує сіль, що зберігається для цього користувача, з бази даних.
Додавання солі до введеного пароля. Система додає отриману сіль до введеного користувачем пароля.
Хешування пароля з сіллю. Система хешує отриманий результат за допомогою тієї ж хеш-функції, яка використовувалась при створенні пароля.
Порівняння хешів. Система порівнює отриманий хеш з тим, що зберігається в базі даних. Якщо хеші збігаються, пароль правильний.
BCrypt
BCrypt є криптографічним алгоритмом хешування паролів, розробленим для забезпечення високої безпеки та захисту від атак грубою силою. Його основна мета - уповільнити процес хешування таким чином, щоб атаки з використанням сучасних машин стали непрактичними.
Основні особливості BCrypt:
Адаптивна складність. BCrypt дозволяє налаштовувати складність (cost factor), що визначає, скільки разів алгоритм буде виконувати хешування. Це робить можливим збільшення складності з часом, щоб протистояти зростаючій обчислювальній потужності атакуючих.
Вбудована сіль. BCrypt автоматично генерує випадкову сіль для кожного пароля, що робить кожен хеш унікальним, навіть для однакових паролів.
Захист від атак грубою силою. Завдяки своїй адаптивній природі, BCrypt забезпечує додатковий захист від атак грубою силою, роблячи їх дуже повільними та обчислювально затратними.
Як працює BCrypt
Генерація солі
При створенні нового пароля BCrypt генерує випадкову сіль довжиною 128 біт (16 байтів).Налаштування складності
Вибирається параметр складності (cost factor), який визначає, скільки разів алгоритм буде виконувати хешування. Зазвичай він задається у вигляді числа, яке є ступенем двійки (наприклад, 10 означає, що алгоритм буде виконуватися 2^10 = 1024 рази).
Хешування пароля
BCrypt об'єднує пароль з сіллю і застосовує алгоритм на основі Blowfish. Він включає етапи розширення ключа і шифрування, які виконуються повторювано відповідно до параметра складності.
Збереження результату
Результатом роботи алгоритму є хеш довжиною 184 біти (23 байти), який включає сіль і параметр складності, що дозволяє перевіряти пароль при вході користувача.
Як відбувається порівняння паролів у BCrypt:
BCrypt обробляє збереження і використання солі трохи інакше, ніж звичайні алгоритми хешування. У хеші, створеному за допомогою BCrypt, сіль вбудовується прямо в результат хешування. Тобто, коли ми зберігаємо хеш пароля, ми також зберігаємо інформацію про сіль і параметр складності в самому хеші. Це дозволяє алгоритму автоматично витягати потрібні дані під час перевірки пароля.
Чому сіль не треба зберігати окремо:
Хеш, створений за допомогою BCrypt, має спеціальний формат, який включає:
Префікс алгоритму (
$2b$
або$2a$
для старіших версій).Параметр складності (наприклад,
12
).Власне сіль (22 символи).
Хеш пароля.
$2b$12$KbQi7yB7WgO1ph8WIXtLHe5E59/qI4bzC1NCj4H.J5pIM6U01qK/a
Cтруктура:
$2b$
- версія алгоритму.12$
- параметр складності.KbQi7yB7WgO1ph8WIXtLHe
- сіль.5E59/qI4bzC1NCj4H.J5pIM6U01qK/a
- хешований пароль.
id | username | password_hash |
---|---|---|
1 | john_doe | $2a$10$7eqJ0BdpQYjKJuj0Uu7h/.G/EyRhgj.xFV6/UJ2E9Lf9k1D7E1EFi |
2 | jane_smith | $2a$10$WzYsNldQ8BJd6Er6IhH/0Oe68Y4ovdqfFEmmM8vvlz0MC6G5i5V9C |
Таким чином, вся необхідна інформація для перевірки пароля зберігається в одному рядку, і немає потреби зберігати сіль окремо. Це спрощує процес зберігання і перевірки паролів, а також робить систему більш безпечною і зручною у використанні.