Хешування паролів: використання солі та 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

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

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

  • Java. Повний огляд мережевих моделей. Socket API, forking, non-blocking sockets, event-driven API

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

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

    Java
  • Java. WebSocket. Spring WebSocket

    Сервер в свою чергу повертає відповідь із 101 статус кодом — що так, давай змінимо протокол між тобою і мною. Тепер будемо використовувати вебсокети. Потім, після з’єднання, я розсилаю всім клієнтам інфомацію про нового користуча (і собі також, не робив додаткових перевірок).

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

    Java
  • Телеграм бот. Нотатки. Стаді плани. Архітектура. Вебсокети. Част. 3

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

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

    Java

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

  • Neural Network [guide] 1

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

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

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

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

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

    Java

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

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

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

  • Neural Network [guide] 1

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

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

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

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

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

    Java