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

Соль (криптография)

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

История и происхождение

Концепция соли в криптографии возникла в 1970-х годах как ответ на рост вычислительных мощностей и развитие методов взлома паролей. Одним из первых применений стала система UNIX, где в 1976 году разработчики Роберт Моррис и Кен Томпсон внедрили соль в алгоритм хэширования паролей (алгоритм DES). В оригинальной реализации использовалась 12-битная соль, что давало 4096 возможных значений. Это позволяло затруднить массовый подбор паролей, так как злоумышленнику требовалось вычислять хэши отдельно для каждой соли.

С развитием криптографии и увеличением скорости вычислений длина соли и методы её генерации совершенствовались. Современные стандарты, такие как bcrypt, scrypt и Argon2, используют соль длиной не менее 128 бит (16 байт), что делает атаки по радужным таблицам практически неосуществимыми.

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

Хэширование с солью

Процесс хэширования с солью включает следующие шаги:

  1. Генерация случайной соли (обычно с помощью криптографически стойкого генератора случайных чисел).
  2. Объединение соли с входными данными (например, конкатенация строк).
  3. Вычисление хэш-функции от полученной комбинации.
  4. Сохранение результата вместе с солью (в открытом виде или в зашифрованном виде, но не засекреченном).

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

Пример

Допустим, два пользователя выбрали одинаковый пароль «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 →