Соль (криптография)
Соль (криптография) — это случайная строка данных, добавляемая к входным данным (например, к паролю) перед их хэшированием. Основная цель соли — обеспечить уникальность хэшей даже для одинаковых исходных данных, что предотвращает атаки по предварительно вычисленным таблицам (радужным таблицам) и словарные атаки. Соль является несекретным, но уникальным для каждого экземпляра данных значением, которое хранится вместе с хэшем.
История и происхождение
Концепция соли в криптографии возникла в 1970-х годах как ответ на рост вычислительных мощностей и развитие методов взлома паролей. Одним из первых применений стала система UNIX, где в 1976 году разработчики Роберт Моррис и Кен Томпсон внедрили соль в алгоритм хэширования паролей (алгоритм DES). В оригинальной реализации использовалась 12-битная соль, что давало 4096 возможных значений. Это позволяло затруднить массовый подбор паролей, так как злоумышленнику требовалось вычислять хэши отдельно для каждой соли.
С развитием криптографии и увеличением скорости вычислений длина соли и методы её генерации совершенствовались. Современные стандарты, такие как bcrypt, scrypt и Argon2, используют соль длиной не менее 128 бит (16 байт), что делает атаки по радужным таблицам практически неосуществимыми.
Принцип работы
Хэширование с солью
Процесс хэширования с солью включает следующие шаги:
- Генерация случайной соли (обычно с помощью криптографически стойкого генератора случайных чисел).
- Объединение соли с входными данными (например, конкатенация строк).
- Вычисление хэш-функции от полученной комбинации.
- Сохранение результата вместе с солью (в открытом виде или в зашифрованном виде, но не засекреченном).
При проверке подлинности (например, при аутентификации пользователя) система извлекает соль из хранилища, добавляет её к введённому паролю, вычисляет хэш и сравнивает с сохранённым значением.
Пример
Допустим, два пользователя выбрали одинаковый пароль «password123». Без соли их хэши будут идентичны (например, SHA-256: «ef92b778...»). При добавлении уникальных солей, например «a1b2c3» для первого пользователя и «d4e5f6» для второго, хэши станут разными:
- Хэш для «password123» + «a1b2c3»: «8f3a2b...»
- Хэш для «password123» + «d4e5f6»: «c7e1d9...»
Таким образом, злоумышленник не может использовать одну радужную таблицу для взлома всех паролей.
Классификация и виды
По длине
- Короткая соль (менее 64 бит) — устаревший стандарт, уязвимый для атак с использованием современных вычислительных мощностей.
- Длинная соль (128 бит и более) — современный стандарт, обеспечивающий достаточную энтропию.
По способу генерации
- Случайная соль — генерируется криптографически стойким генератором псевдослучайных чисел (CSPRNG). Является предпочтительным методом.
- Детерминированная соль — вычисляется на основе других данных (например, идентификатора пользователя). Менее безопасна, так как может быть предсказуема.
По способу хранения
- Открытая соль — хранится в базе данных вместе с хэшем в незашифрованном виде. Это стандартная практика, так как соль не является секретом.
- Закрытая соль (секретная соль) — хранится отдельно, например, в конфигурационном файле. Усложняет атаку, но не является обязательной.
Применение
Хэширование паролей
Соль обязательна в современных системах аутентификации. Она используется в алгоритмах:
- bcrypt — включает соль как часть алгоритма, автоматически генерирует её при каждом хэшировании.
- scrypt — использует соль для защиты от атак с использованием специализированного оборудования (ASIC).
- Argon2 — победитель конкурса Password Hashing Competition (2015), поддерживает настраиваемую соль.
Цифровые подписи и сертификаты
В криптографии с открытым ключом соль может применяться для предотвращения коллизий при подписании одинаковых сообщений. Например, в стандарте RSA-PSS (Probabilistic Signature Scheme) используется случайная соль для создания вероятностной подписи.
Базы данных и уникальные идентификаторы
Соль используется для хэширования конфиденциальных данных (например, номеров кредитных карт, адресов электронной почты) с целью их обезличивания, но сохранения возможности проверки.
Безопасность и критика
Преимущества
- Защита от радужных таблиц: уникальная соль делает каждую таблицу бесполезной для других экземпляров.
- Защита от словарных атак: злоумышленник должен вычислять хэш для каждого пароля отдельно, что замедляет атаку.
- Устойчивость к коллизиям: даже при одинаковых входных данных хэши различаются.
Недостатки и ограничения
- Не защищает от слабых паролей: если пароль слишком короткий или распространённый, соль лишь замедляет, но не предотвращает подбор.
- Необходимость безопасной генерации: использование слабого генератора случайных чисел (например,
rand()в C) может сделать соль предсказуемой. - Управление солями: при большом количестве пользователей требуется хранить соли для каждого экземпляра, что увеличивает объём данных.
Уязвимости
- Атаки по времени: если сравнение хэшей выполняется неконстантно, злоумышленник может определить правильность пароля по времени ответа.
- Повторное использование соли: если одна и та же соль применяется для нескольких экземпляров, защита снижается до уровня хэширования без соли.
Интересные факты
- В ранних версиях UNIX соль была 12-битной, что давало всего 4096 вариантов. Современные системы используют соль длиной 128 бит, что даёт 2^128 возможных значений.
- Алгоритм bcrypt, разработанный в 1999 году, до сих пор считается одним из самых надёжных для хэширования паролей благодаря встроенной соли и регулируемой сложности.
- В криптовалютах (например, Bitcoin) соль не используется, так как хэширование блоков основано на других принципах (proof-of-work).
См. также
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →