Хешування паролів: використання солі та bcrypt

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

Що таке хешування?

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

Сіль у хешуванні

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

rainbow table chain
https://www.wallarm.com/what/rainbow-table-attack

Plaintext

Hash (MD5)

password1

e38ad214943daad1d64c102faec29de4afe9da3d

123456

e10adc3949ba59abbe56e057f20f883e

qwerty

d8578edf8458ce06fbc5bb76a58c5ca4

Як працює сіль і хешування паролів

  1. Генерація солі. Коли користувач реєструється або змінює пароль, генерується випадкова сіль (наприклад, 16 байтів).

  2. Додавання солі до пароля. До пароля додається сіль.

  3. Хешування пароля з сіллю. Отриманий результат хешується за допомогою криптографічної хеш-функції (наприклад, SHA-256, bcrypt).

  4. Збереження результату. У базі даних зберігається як хешований пароль, так і сіль (*у випадку, якщо не використовувати BCrypt).

id

username

password_hash

salt

1

john_doe

5e884898da28047151d0e56f8dc6292773603d0d6aabbdded6d23ffbc0efef1a

3d2e1f4c5a6b7c8d

2

jane_smith

12dada3e0f772f5a5ebd56a0c2928a16b9bb6c3a5044e79a4cb5d5a1f12a2e04

1a2b3c4d5e6f7g8h

Як порівняти паролі

  1. Отримання введеного пароля. Система отримує пароль, введений користувачем.

  2. Отримання солі з бази даних. Система витягує сіль, що зберігається для цього користувача, з бази даних.

  3. Додавання солі до введеного пароля. Система додає отриману сіль до введеного користувачем пароля.

  4. Хешування пароля з сіллю. Система хешує отриманий результат за допомогою тієї ж хеш-функції, яка використовувалась при створенні пароля.

  5. Порівняння хешів. Система порівнює отриманий хеш з тим, що зберігається в базі даних. Якщо хеші збігаються, пароль правильний.

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, має спеціальний формат, який включає:

  1. Префікс алгоритму ($2b$ або $2a$ для старіших версій).

  2. Параметр складності (наприклад, 12).

  3. Власне сіль (22 символи).

  4. Хеш пароля.

$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

Таким чином, вся необхідна інформація для перевірки пароля зберігається в одному рядку, і немає потреби зберігати сіль окремо. Це спрощує процес зберігання і перевірки паролів, а також робить систему більш безпечною і зручною у використанні.

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

4.4KПрочитань
1Автори
71Читачі
На Друкарні з 19 квітня

Більше від автора

  • Secure networking. Deep Dive

    Глибоке занурення в протоколи TLS/SSL та інфраструктуру відкритих ключів (PKI). Основні поняття, процес встановлення захищеного з'єднання, роль сертифікатів та ланцюжка довіри

    Теми цього довгочиту:

    Security
  • Поширені помилки у дизайні REST API

    У довгочиті розглядаються поширені помилки при проектуванні REST API та способи їх уникнення: версіонування, використання DTO, підхід CQRS, робота з мікросервісами, та інші практики для підвищення продуктивності, безпеки й зручності API

    Теми цього довгочиту:

    Java
  • Java. Короткий огляд еволюції багатопотоковості

    У перших версіях Java багатопоточність реалізовувалася за допомогою класу Thread, який дозволяв створювати нові потоки. Проте ця модель мала багато недоліків:

    Теми цього довгочиту:

    Java

Вам також сподобається

  • Лямбда-вирази у Java

    Коментар щодо використання лямбда-виразів у програмуванні. Порівняння імплементації ЛВ у різних мовах, функціональне програмування vs/& ООП, особливість імплементації у Java.

    Теми цього довгочиту:

    Java
  • Дві проблеми двофакторної автентифікації ASP.NET Core Identity на основі TOTP

    В ASP.NET Core Identity, при використанні TOTP для 2FA, існують дві ключові проблеми: занадто довге часове вікно для верифікації кодів і відсутність перевірки на їх повторне використання, що підвищує ризик небезпеки.

    Теми цього довгочиту:

    Programming
  • Функціональний стиль на Java

    Коментар про використання функціонального стилю в програмуванні на Java для покращення читання коду і його підтримки.

    Теми цього довгочиту:

    Java

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається

  • Лямбда-вирази у Java

    Коментар щодо використання лямбда-виразів у програмуванні. Порівняння імплементації ЛВ у різних мовах, функціональне програмування vs/& ООП, особливість імплементації у Java.

    Теми цього довгочиту:

    Java
  • Дві проблеми двофакторної автентифікації ASP.NET Core Identity на основі TOTP

    В ASP.NET Core Identity, при використанні TOTP для 2FA, існують дві ключові проблеми: занадто довге часове вікно для верифікації кодів і відсутність перевірки на їх повторне використання, що підвищує ризик небезпеки.

    Теми цього довгочиту:

    Programming
  • Функціональний стиль на Java

    Коментар про використання функціонального стилю в програмуванні на Java для покращення читання коду і його підтримки.

    Теми цього довгочиту:

    Java