Перец (криптография)
Перец (криптография) — это вспомогательная переменная (случайное или псевдослучайное значение), добавляемая к входным данным (например, к паролю или ключу) перед вычислением хеш-функции. Основная цель использования перца — повышение устойчивости системы к атакам перебором (брутфорс) и атакам по предварительно вычисленным таблицам (радужным таблицам), а также защита от компрометации всей базы данных хешей в случае её утечки.
История возникновения
Концепция добавления дополнительного случайного значения к паролю перед хешированием восходит к ранним работам по криптографии 1970-х годов. Однако термин «перец» (pepper) в отличие от «соли» (salt) не был формализован вплоть до начала 2000-х годов. Впервые чёткое различие между солью и перцем было предложено в контексте рекомендаций по безопасному хранению паролей, в частности в документах Национального института стандартов и технологий США (NIST) и в публикациях криптографов, таких как Фергюсон и Шнайер в книге «Practical Cryptography» (2003).
Ранее разработчики часто использовали только соль — значение, хранимое открыто вместе с хешем. Перец стал применяться как дополнительная мера для защиты от атак, при которых злоумышленник получает доступ к базе данных, но не может извлечь ключ шифрования или секретный параметр, используемый для хеширования.
Отличие от соли
Хотя и соль, и перец являются случайными значениями, добавляемыми к паролю, их ключевое различие заключается в способе хранения и доступа:
- Соль — уникальное для каждого пользователя значение, которое хранится открыто в базе данных вместе с хешем. Она защищает от атак с использованием радужных таблиц и делает одинаковые пароли разных пользователей различными.
- Перец — одно и то же значение для всех пользователей (или небольшое количество вариантов), которое хранится отдельно от базы данных — в конфигурационном файле, аппаратном модуле безопасности (HSM), в переменной окружения или в защищённом хранилище. Перец не раскрывается при утечке базы данных хешей.
Таким образом, соль защищает от предвычисленных атак, а перец — от атак, при которых злоумышленник имеет доступ только к базе данных, но не к секретному ключу системы.
Принцип работы
Процесс хеширования пароля с использованием перца выглядит следующим образом:
- Пользователь вводит пароль (например,
password123). - Система генерирует случайную соль (например,
abc123). - К паролю последовательно или комбинированно добавляется соль и перец (например,
password123abc123secret_pepper). - Полученная строка обрабатывается криптографической хеш-функцией (например, bcrypt, scrypt, Argon2).
- Результат (хеш) сохраняется в базе данных вместе с солью. Перец при этом не сохраняется в базе.
При аутентификации система повторяет процесс: берёт введённый пароль, добавляет соль из базы, добавляет перец из защищённого хранилища, вычисляет хеш и сравнивает с сохранённым.
Виды перца
В зависимости от способа генерации и хранения различают несколько подходов:
- Статический перец — одно фиксированное значение, заданное при настройке системы. Прост в реализации, но при компрометации ключа все хеши становятся уязвимыми.
- Динамический перец — значение, которое может меняться с течением времени (например, ежедневно или при смене ключа шифрования). Требует более сложной логики для хранения истории версий, чтобы старые пароли оставались проверяемыми.
- Аппаратный перец — значение, хранящееся в аппаратном модуле безопасности (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 →