Энтропия соли и криптографическая стойкость

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

Энтропия соли определяет степень её случайности и непредсказуемости. Чем выше энтропия, тем сложнее восстановить исходные данные или использовать предрассчитанные таблицы хешей.

Понятие энтропии

Энтропия в криптографическом контексте измеряется в битах и отражает количество возможных состояний, которые может принимать случайная величина.

Соль с энтропией 128 бит означает, что количество возможных вариантов равно:

2^128

Такое пространство делает перебор практически невозможным при современных вычислительных ресурсах.

Источники низкой и высокой энтропии

Качество соли напрямую зависит от источника генерации:

  • Низкая энтропия:

    • Math.random() в JavaScript
    • предсказуемые таймстемпы
    • фиксированные или повторяющиеся значения
  • Высокая энтропия:

    • криптографический генератор случайных чисел (CSPRNG)
    • системные источники случайности (/dev/urandom, Windows CNG)

В среде Node.js стандартом считается использование модуля crypto:

import crypto from 'crypto';

const salt = crypto.randomBytes(16);

16 байт дают 128 бит энтропии, что является промышленным стандартом для соли.

Роль соли в криптографической стойкости password-hash

Алгоритмы хеширования паролей (включая реализации, подобные password-hash) используют соль для защиты от нескольких классов атак.

Защита от радужных таблиц

Радужные таблицы представляют собой предрасчитанные наборы соответствий «пароль → хеш». Без соли одинаковые пароли всегда дают одинаковый хеш, что делает такие таблицы эффективными.

Добавление уникальной соли к каждому паролю приводит к следующему:

hash = H(password + salt)

Даже при одинаковых паролях результат будет различным, что делает невозможным использование универсальных таблиц.

Устранение массовых совпадений хешей

В системах без соли повторяющиеся пароли приводят к одинаковым хешам в базе данных. Это позволяет злоумышленнику:

  • определять популярные пароли
  • проводить статистический анализ пользователей
  • атаковать сразу множество аккаунтов

Соль разрушает эту корреляцию, делая каждый хеш уникальным.

Влияние длины соли на криптографическую стойкость

Длина соли напрямую влияет на количество возможных комбинаций.

Длина соли Энтропия Уровень стойкости
8 байт 64 бит недостаточный для современных систем
12 байт 96 бит минимально допустимый
16 байт 128 бит стандартный уровень
32 байта 256 бит избыточный, но безопасный

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

Соль и алгоритмы password-hash

В JavaScript-библиотеках типа password-hash соль используется совместно с различными хеш-функциями:

  • PBKDF2
  • bcrypt
  • scrypt
  • Argon2 (в современных реализациях)

Каждый из алгоритмов по-разному комбинирует соль и пароль, но общая модель остаётся одинаковой:

  1. генерация случайной соли
  2. добавление соли к паролю
  3. многократное хеширование
  4. сохранение соли вместе с хешем

Пример структуры результата:

algorithm$salt$hash

или в бинарном виде:

{ salt: ..., hash: ... }

Криптографическая стойкость и её компоненты

Стойкость системы хеширования паролей определяется совокупностью факторов:

1. Энтропия пароля

Даже идеальная соль не защищает слабый пароль. Если пароль имеет низкую энтропию (например, словарные значения), атаки перебора остаются возможными.

2. Энтропия соли

Соль должна быть уникальной и непредсказуемой. При энтропии ниже 96 бит появляются теоретические возможности оптимизации атак.

3. Вычислительная стоимость алгоритма

Современные алгоритмы увеличивают стоимость вычисления хеша:

  • bcrypt регулирует «cost factor»
  • scrypt увеличивает потребление памяти
  • Argon2 использует адаптивные параметры памяти и времени

Высокая стоимость делает перебор менее эффективным даже при наличии GPU-ферм.

4. Устойчивость к параллельным атакам

Соль не защищает напрямую от перебора, но делает невозможным массовое ускорение атак через предварительные вычисления.

Ошибки реализации соли в JavaScript

В практических реализациях password-hash часто встречаются критические ошибки:

Использование Math.random()

const salt = Math.random().toString();

Такой подход приводит к:

  • предсказуемости значений
  • низкой энтропии
  • возможности восстановления генерации

Повторное использование соли

Использование одной соли для всех пользователей полностью нивелирует её защитную функцию.

Хранение соли отдельно от хеша

Разделение соли и хеша в разных хранилищах увеличивает риск компрометации системы. Корректная практика — хранить их вместе.

Практическая модель оценки стойкости

Криптографическая стойкость системы password-hash можно приблизительно оценить как сумму факторов:

S = E_password + E_salt + C_algorithm

где:

  • E_password — энтропия пароля
  • E_salt — энтропия соли
  • C_algorithm — вычислительная сложность алгоритма

При E_salt ≥ 128 бит вклад соли в возможность взлома становится практически незначимым, поскольку основным ограничением остаётся энтропия пароля и стоимость вычислений.

Значение соли в современных системах

В современных криптографических практиках соль перестала быть опциональным элементом. Она рассматривается как обязательный компонент любой схемы хранения паролей.

В рамках password-hash подхода соль выполняет не только защитную, но и структурную роль:

  • обеспечивает уникальность хешей
  • предотвращает предвычисленные атаки
  • поддерживает масштабируемость систем хранения
  • позволяет безопасно применять один алгоритм ко множеству пользователей с разными данными