Парольное шифрование: PBES2-HS256+A128KW и другие

PBES2 как механизм защиты ключа

PBES2 (Password-Based Encryption Scheme 2) используется в JSON Web Encryption (JWE) для преобразования пароля в криптографический ключ, который затем применяется для защиты ключа контента. В отличие от прямого использования симметричного ключа, PBES2 вводит промежуточный этап деривации ключа, что позволяет безопасно использовать человеческие пароли.

В основе схемы лежит комбинация:

  • PBKDF2 как функция деривации ключа
  • HMAC (например, HS256 или HS512) как псевдослучайная функция
  • алгоритм шифрования ключа контента (Key Wrapping Algorithm), например A128KW

Типичный идентификатор алгоритма в JWE:

  • PBES2-HS256+A128KW
  • PBES2-HS384+A192KW
  • PBES2-HS512+A256KW

Каждая комбинация определяет:

  • HMAC для PBKDF2 (HS256 → SHA-256)
  • длину ключа для wrapping-алгоритма (A128KW → 128 бит)

Структура PBES2-HS256+A128KW

Алгоритм состоит из двух логических этапов:

1. Деривация ключа из пароля

PBKDF2 применяется к паролю с использованием:

  • salt (случайная соль)
  • iteration count (p2c)
  • HMAC-SHA256 (HS256)

Формально:

DK = PBKDF2_{HMACSHA256}(password, salt, p2c, key_length)

Результат — ключ деривации (Derived Key), который далее используется для защиты CEK (Content Encryption Key).


2. Оборачивание ключа контента

CEK (Content Encryption Key) — случайный симметричный ключ, используемый для шифрования полезных данных (например, AES-GCM).

После получения DK выполняется key wrapping:

CEK_{wrapped} = A128KW(DK, CEK)

A128KW — алгоритм AES Key Wrap с 128-битным ключом.


Роль параметров p2s и p2c

PBES2 требует дополнительных параметров, которые передаются в JWE header:

  • p2s (PBES2 Salt Input) — соль
  • p2c (PBES2 Count) — количество итераций PBKDF2

Чем выше p2c, тем выше стойкость к перебору, но ниже производительность.

Пример зависимости вычислительной стоимости:

T p2c


Формат JWE при PBES2

JWE объект в compact serialization включает:

  • protected header
  • encrypted key
  • IV
  • ciphertext
  • authentication tag

Пример заголовка:

{
  "alg": "PBES2-HS256+A128KW",
  "enc": "A256GCM",
  "p2s": "Base64URLSalt",
  "p2c": 10000
}

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

Библиотека jose предоставляет высокоуровневые API для JWE, включая PBES2.

Установка

npm install jose

Шифрование с PBES2-HS256+A128KW

Пример использования CompactEncrypt:

import { CompactEncrypt } from 'jose'

const encoder = new TextEncoder()

const payload = encoder.encode('секретные данные')

const jwe = await new CompactEncrypt(payload)
  .setProtectedHeader({
    alg: 'PBES2-HS256+A128KW',
    enc: 'A256GCM'
  })
  .encrypt('password123')

Расшифрование

import { compactDecrypt } from 'jose'

const { plaintext } = await compactDecrypt(jwe, 'password123')

console.log(new TextDecoder().decode(plaintext))

Внутренние шаги jose при PBES2

При вызове encrypt происходит:

  1. Генерация CEK
  2. Генерация salt (p2s)
  3. PBKDF2(password, p2s, p2c, keylen)
  4. Получение DK
  5. AES Key Wrap (A128KW)
  6. Шифрование payload через AES-GCM (enc)
  7. Формирование JWE структуры

Отличия PBES2-HS256+A128KW от других вариантов

PBES2-HS384+A192KW

  • HMAC-SHA384 вместо SHA256
  • 192-битный ключ wrapping

PBES2-HS512+A256KW

  • максимальная криптографическая стойкость
  • увеличенная стоимость PBKDF2

Стойкость к атаке перебора

Основной фактор безопасности — PBKDF2 iteration count.

Модель сложности перебора:

C_{attack} = O(2^k p2c)

где:

  • k — размер пространства паролей
  • p2c — число итераций

Практические особенности реализации jose

  • salt всегда случайный (128 бит и выше)
  • CEK генерируется криптографически стойким RNG
  • A128KW требует корректной длины ключа DK
  • PBES2 используется только для защиты CEK, а не данных напрямую

Типичные ошибки при использовании PBES2

  • слишком низкий p2c (уязвимость к brute-force)
  • использование слабых паролей
  • повторное использование salt
  • попытка использовать PBES2 без AES-GCM в enc

Совместимость алгоритмов

PBES2 корректно работает только в связке с:

  • A128KW / A192KW / A256KW
  • A128GCM / A256GCM
  • XC20P (в современных реализациях jose)

Несовместимые комбинации приводят к ошибкам валидации JWE заголовка.


Криптографическая роль PBES2 в JWE-экосистеме

PBES2 занимает промежуточное положение между:

  • симметричным шифрованием (shared secret)
  • асимметричным шифрованием (RSA-OAEP, ECDH-ES)

Его основная задача — обеспечить безопасное использование пароля без прямого его включения в криптосистему, превращая пароль в управляемый криптографический материал через PBKDF2 и wrapping-слой AES.