Открыть сервис

Перец (криптография)

Перец (криптография) — это вспомогательная переменная (случайное или псевдослучайное значение), добавляемая к входным данным (например, к паролю или ключу) перед вычислением хеш-функции. Основная цель использования перца — повышение устойчивости системы к атакам перебором (брутфорс) и атакам по предварительно вычисленным таблицам (радужным таблицам), а также защита от компрометации всей базы данных хешей в случае её утечки.

История возникновения

Концепция добавления дополнительного случайного значения к паролю перед хешированием восходит к ранним работам по криптографии 1970-х годов. Однако термин «перец» (pepper) в отличие от «соли» (salt) не был формализован вплоть до начала 2000-х годов. Впервые чёткое различие между солью и перцем было предложено в контексте рекомендаций по безопасному хранению паролей, в частности в документах Национального института стандартов и технологий США (NIST) и в публикациях криптографов, таких как Фергюсон и Шнайер в книге «Practical Cryptography» (2003).

Ранее разработчики часто использовали только соль — значение, хранимое открыто вместе с хешем. Перец стал применяться как дополнительная мера для защиты от атак, при которых злоумышленник получает доступ к базе данных, но не может извлечь ключ шифрования или секретный параметр, используемый для хеширования.

Отличие от соли

Хотя и соль, и перец являются случайными значениями, добавляемыми к паролю, их ключевое различие заключается в способе хранения и доступа:

  • Соль — уникальное для каждого пользователя значение, которое хранится открыто в базе данных вместе с хешем. Она защищает от атак с использованием радужных таблиц и делает одинаковые пароли разных пользователей различными.
  • Перец — одно и то же значение для всех пользователей (или небольшое количество вариантов), которое хранится отдельно от базы данных — в конфигурационном файле, аппаратном модуле безопасности (HSM), в переменной окружения или в защищённом хранилище. Перец не раскрывается при утечке базы данных хешей.

Таким образом, соль защищает от предвычисленных атак, а перец — от атак, при которых злоумышленник имеет доступ только к базе данных, но не к секретному ключу системы.

Принцип работы

Процесс хеширования пароля с использованием перца выглядит следующим образом:

  1. Пользователь вводит пароль (например, password123).
  2. Система генерирует случайную соль (например, abc123).
  3. К паролю последовательно или комбинированно добавляется соль и перец (например, password123abc123secret_pepper).
  4. Полученная строка обрабатывается криптографической хеш-функцией (например, bcrypt, scrypt, Argon2).
  5. Результат (хеш) сохраняется в базе данных вместе с солью. Перец при этом не сохраняется в базе.

При аутентификации система повторяет процесс: берёт введённый пароль, добавляет соль из базы, добавляет перец из защищённого хранилища, вычисляет хеш и сравнивает с сохранённым.

Виды перца

В зависимости от способа генерации и хранения различают несколько подходов:

  • Статический перец — одно фиксированное значение, заданное при настройке системы. Прост в реализации, но при компрометации ключа все хеши становятся уязвимыми.
  • Динамический перец — значение, которое может меняться с течением времени (например, ежедневно или при смене ключа шифрования). Требует более сложной логики для хранения истории версий, чтобы старые пароли оставались проверяемыми.
  • Аппаратный перец — значение, хранящееся в аппаратном модуле безопасности (HSM) или доверенной платформенной среде (TPM). Обеспечивает максимальную защиту, так как перец физически недоступен для программного извлечения.
  • Выводимый перец — значение, которое не хранится явно, а вычисляется на основе других секретных данных (например, мастер-ключа) с использованием криптографической функции.

Применение

Перец используется в системах, где требуется высокая степень защиты учётных данных:

  • Хранение паролей пользователей — наиболее распространённая область. Применяется в веб-приложениях, операционных системах, базах данных.
  • Криптографические ключи — добавление перца к ключам перед хешированием для защиты от атак на основе побочных каналов.
  • Генерация токенов — при создании одноразовых токенов или сессионных идентификаторов.
  • Аутентификация в распределённых системах — где база данных хешей может быть скомпрометирована, но секретный ключ (перец) хранится централизованно.

Критика и ограничения

Несмотря на преимущества, использование перца имеет ряд недостатков:

  • Единая точка отказа — если перец скомпрометирован (например, из-за уязвимости в конфигурации или атаки на сервер), все хеши становятся уязвимыми для атаки перебором.
  • Сложность ротации — смена перца требует перехеширования всех паролей пользователей, что может быть трудоёмко для больших систем.
  • Зависимость от защищённого хранилищаэффективность перца полностью зависит от надёжности хранения секретного значения. Если злоумышленник получает доступ к серверу, где хранится перец, защита теряется.
  • Отсутствие стандартизации — в отличие от соли, для перца нет общепринятых стандартов или рекомендаций по длине, генерации и хранению, что приводит к ошибкам в реализации.

Интересные факты

  • Термин «перец» (pepper) был популяризирован в криптографическом сообществе как аналогия к «соли»: если соль добавляется в пищу (в открытую базу), то перец — это секретная приправа, которую знает только повар (система).
  • В некоторых реализациях (например, в PHP-функции password_hash с опцией PASSWORD_BCRYPT) перец не поддерживается «из коробки» и требует ручной реализации.
  • Алгоритм Argon2, победитель конкурса PHC (Password Hashing Competition), поддерживает концепцию «секретного ключа» (secret key), который функционально аналогичен перцу.

Источники

  • Фергюсон Н., Шнайер Б. «Practical Cryptography» (2003).
  • NIST Special Publication 800-63B «Digital Identity Guidelines: Authentication and Lifecycle Management» (2017).
  • Документация PHP: «Password Hashing — Salt and Pepper» (php.net).
  • Спецификация алгоритма Argon2 (RFC 9106).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →