Простое

Не шифровать

Плюсы

  • просто

Минусы

  • при любой утечке БД -> катастрофа

Шифрование

Шифрование – обратимое преобразование данных, которое делает их не читаемыми без специального ключа

Пароль - Алгоритм шифроания с ключом - шифр

Плюсы

  • просто

  • можно расшифровать

Минусы

  • можно расшифровать при утечке ключа

Пример

AES

Хэширование

Хэш-функция - алгоритм, который превращает данные в короткую строку фиксированной длинны

Плюсы

  • обратно получить пароль невозможно

  • быстро

Минусы

  • можно быстро подбирать. MD5, SHA-1 создавались не для паролей, а для проверки целостности данных

  • Радужные таблицы хорошо ломают популярные хэши без соли

  • Одинаковые хэши у одинаковых паролей – проще подобрать пароль

Радужные таблицы – огромные БД заранее вычесленных хэшей

Пример

SHA-256

password123 -> ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f

MD5

SHA-1

SHA-512

Соль + Глобальная соль + хэширование

  1. Соль (salt) - случайная строка, которую добавляют к паролю перед хэшированием, чтобы одинаковые пароли давали разные хэши (радужные таблицы не работают).

Соль хранится открыто в БД - это нормально.

  1. Глобальная соль (pepper) - одна общая строка, которую добавляют ко всем паролям, чтобы усложнить перебор.

Хранится в конфиге или в другом сервисе, а не в БД рядом с паролем.

  1. Хэширование хэша - чтобы сделать вычисление медленнее.

Но современный GPU всё равно такое посчитает относительно быстро.

Плюсы

Минусы

  • есть методики обхода - это устаревшие подходы

KDF

В идеале, для паролей вместо хэширования нужны специальные функции – KDF (Key Derivation Function).

Главные требования к KDF:

  1. Медленность (искусственная растяжка) - например, bcrypt 100мс на один пароль;

  2. Сложность для GPU/ASIC (memory-hard) - слабое место у GPU и ASIC - это операции, требующие много памяти, поэтому алгоритм должен требовать много памяти;

  3. Обязательная соль - одинаковые пароли теперь имеют разный хэш, радужные таблицы не работают:

  4. Стабильность и стандартизация - стандарты RFC, NIST, поддерживаемость библиотеками на разных языках и т.

Варианты KDF-алгоритмов:

  1. Argon2id:

    1. Защищён от GPU
    2. Нагрузка задаётся памятью (например, 64-256 МБ)
    3. Время вычисления можно регулировать
    4. Стандарт на 2025год
  2. PBKDF2-HMAC-SHA256:

    1. Медленный и стабильный
    2. FIPS-совместимый, часто используется в enterprise - сертефицированный стандарт для корпоративных и государственных систем
    3. Более слабый, чем Argon2, но всё ещё надёжный
    4. Много раз повторяет HMAC-SHA256 - десятки или сотни тысяч раз для замедления подбора
    5. Немножко слабее Argon2id тк не Memory hard
  3. bcrypt:

    1. Исторический стандарт, всё ещё приемлем, но устаревает из-за слабой защиты от GPU
  4. scrypt:

    1. Тоже memory-hard, но менее популярен
    2. Сложнее настраивать

Плюсы

  • злоумышленник вместо миллионов подборов будет генерировать 10-100 в секунду

Минусы

Рекомендации

  1. Используем Argon2id и другие KDF:

    1. Параметры:
      1. Память: 64-256 МБ
      2. Параллелизм: 1-4
      3. Итерации: 2-4
  2. Храним соль вместе с хэшем:

    1. Соль - не секрет.
    2. Генерируем минимум 16 байт криптостойким генератором.
  3. Опционально используем глобальную соль:

    1. Храним в конфиге или KMS, но не как замену соли, а как дополнительный слой.
  4. Стараемся не использовать MD5 / SHA1 /SHA256 / SHA512 для паролей - даже с солью это устаревшая практика.

  5. Ставим Rate limit на вход, чтобы ограничить попытки при онлайн-атаке.

Последнее обновление