Соответствие стандартам NIST и рекомендациям OWASP

Национальный институт стандартов и технологий США (NIST) формирует фундаментальные требования к криптографическим алгоритмам, длинам ключей и режимам их использования. В контексте Web Crypto API соответствие этим стандартам означает выбор безопасных примитивов, корректную конфигурацию параметров и соблюдение ограничений на устаревшие алгоритмы.

Рекомендуемые алгоритмы

В рамках современных рекомендаций NIST допускаются:

  • Симметричное шифрование:

    • AES (Advanced Encryption Standard)
    • Режимы: GCM (предпочтительный), CBC (с ограничениями)
  • Хеширование:

    • SHA-256, SHA-384, SHA-512
    • SHA-1 признан устаревшим
  • Асимметричная криптография:

    • RSA (с длиной ключа не менее 2048 бит)
    • ECDSA (на кривых P-256, P-384)
  • Обмен ключами:

    • ECDH
    • RSA-OAEP (для передачи ключей)

Пример: генерация ключа AES-GCM

const key = await crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256
  },
  true,
  ["encrypt", "decrypt"]
);

Ключевые моменты:

  • Длина 256 бит соответствует современным требованиям безопасности
  • Используется режим GCM, обеспечивающий аутентифицированное шифрование

Управление ключами по стандартам NIST

NIST уделяет особое внимание жизненному циклу ключей:

  • Генерация с использованием криптографически стойкого генератора
  • Ограничение области применения ключа (key usage)
  • Минимизация времени хранения в памяти
  • Защита от экспорта (если возможно)

Пример ограничения использования ключа

const key = await crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256
  },
  false,
  ["encrypt"] // только шифрование
);

Запрет на экспорт (extractable: false) снижает риск компрометации.


Рекомендации OWASP: практическая безопасность

OWASP (Open Web Application Security Project) фокусируется на прикладных аспектах безопасности веб-приложений. В отличие от NIST, который задаёт стандарты, OWASP описывает реальные угрозы и способы их предотвращения.

Основные принципы OWASP для криптографии

  • Использование проверенных библиотек (Web Crypto API входит в список доверенных)
  • Исключение самописной криптографии
  • Безопасное хранение ключей
  • Защита от повторного использования IV (nonce)
  • Применение аутентифицированного шифрования

Безопасная работа с IV (инициализационным вектором)

Для AES-GCM критично:

  • IV должен быть уникальным для каждой операции
  • Рекомендуемая длина: 12 байт

Генерация IV

const iv = crypto.getRandomValues(new Uint8Array(12));

Ошибка: повторное использование IV

Повтор IV при том же ключе делает шифрование уязвимым к атакам. Это одно из наиболее критичных нарушений рекомендаций OWASP.


Аутентифицированное шифрование

OWASP рекомендует использовать режимы, которые обеспечивают:

  • Конфиденциальность
  • Целостность
  • Аутентичность

В Web Crypto API это реализовано через AES-GCM.

Пример шифрования

const encoded = new TextEncoder().encode("данные");

const ciphertext = await crypto.subtle.encrypt(
  {
    name: "AES-GCM",
    iv: iv
  },
  key,
  encoded
);

Проверка целостности данных

В режиме GCM встроена проверка подлинности. При расшифровке:

const decrypted = await crypto.subtle.decrypt(
  {
    name: "AES-GCM",
    iv: iv
  },
  key,
  ciphertext
);

Если данные были изменены — операция завершится с ошибкой.


Хеширование и защита паролей

OWASP строго запрещает:

  • Хранение паролей в открытом виде
  • Использование SHA-256 без соли и итераций

Вместо этого рекомендуется:

  • PBKDF2
  • bcrypt / scrypt (вне Web Crypto API)

Пример PBKDF2

const passwordKey = await crypto.subtle.importKey(
  "raw",
  new TextEncoder().encode("password"),
  "PBKDF2",
  false,
  ["deriveKey"]
);

const derivedKey = await crypto.subtle.deriveKey(
  {
    name: "PBKDF2",
    salt: crypto.getRandomValues(new Uint8Array(16)),
    iterations: 100000,
    hash: "SHA-256"
  },
  passwordKey,
  {
    name: "AES-GCM",
    length: 256
  },
  false,
  ["encrypt"]
);

Важно:

  • Не менее 100000 итераций
  • Уникальная соль

Устаревшие алгоритмы и запреты

Не допускаются:

  • MD5
  • SHA-1
  • RC4
  • DES

Использование таких алгоритмов нарушает как NIST, так и OWASP.


Экспорт и хранение ключей

OWASP рекомендует:

  • Минимизировать экспорт ключей
  • Использовать защищённые контейнеры
  • Избегать хранения в localStorage

Пример экспорта (если необходимо)

const exported = await crypto.subtle.exportKey("jwk", key);

При этом:

  • Следует шифровать экспортированные ключи
  • Ограничивать доступ к ним

Защита от атак на стороне клиента

OWASP выделяет несколько рисков:

XSS (межсайтовый скриптинг)

Если злоумышленник внедрит код:

  • может получить доступ к ключам
  • может перехватить операции шифрования

Меры защиты:

  • Content Security Policy (CSP)
  • Экранирование пользовательского ввода

Использование HTTPS

Web Crypto API доступен только в безопасном контексте:

  • HTTPS обязателен
  • Исключение — localhost

Это соответствует требованиям OWASP по защите транспортного уровня.


Контроль параметров алгоритмов

Некорректные параметры — частая причина уязвимостей.

Пример небезопасной конфигурации:

{
  name: "AES-CBC",
  iv: new Uint8Array(16) // фиксированный IV
}

Исправление:

  • Генерация случайного IV
  • Переход на AES-GCM

Минимизация доверия к клиенту

OWASP подчёркивает:

  • Клиентская криптография не заменяет серверную
  • Нельзя полагаться на клиента для защиты критичных данных

Web Crypto API должен использоваться:

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

Аудит и тестирование

Рекомендации OWASP включают:

  • Регулярный аудит криптографических решений
  • Проверку соответствия стандартам NIST
  • Использование автоматизированных инструментов анализа

Совместимость браузеров и реализаций

Разные браузеры могут:

  • по-разному реализовывать алгоритмы
  • иметь ограничения

Рекомендуется:

  • тестировать на всех целевых платформах
  • избегать нестандартных параметров

Итоговые практики безопасного использования

  • Использование AES-GCM с ключами 256 бит
  • Генерация случайных IV для каждой операции
  • Применение PBKDF2 для паролей
  • Отказ от устаревших алгоритмов
  • Ограничение экспорта ключей
  • Работа только через HTTPS
  • Защита от XSS

Такая конфигурация обеспечивает соответствие одновременно требованиям NIST и рекомендациям OWASP, формируя надёжную основу для криптографии в веб-приложениях.