PBES2 (Password-Based Encryption Scheme 2) используется в JSON Web Encryption (JWE) для преобразования пароля в криптографический ключ, который затем применяется для защиты ключа контента. В отличие от прямого использования симметричного ключа, PBES2 вводит промежуточный этап деривации ключа, что позволяет безопасно использовать человеческие пароли.
В основе схемы лежит комбинация:
Типичный идентификатор алгоритма в JWE:
Каждая комбинация определяет:
Алгоритм состоит из двух логических этапов:
PBKDF2 применяется к паролю с использованием:
Формально:
DK = PBKDF2_{HMACSHA256}(password, salt, p2c, key_length)
Результат — ключ деривации (Derived Key), который далее используется для защиты CEK (Content Encryption Key).
CEK (Content Encryption Key) — случайный симметричный ключ, используемый для шифрования полезных данных (например, AES-GCM).
После получения DK выполняется key wrapping:
CEK_{wrapped} = A128KW(DK, CEK)
A128KW — алгоритм AES Key Wrap с 128-битным ключом.
PBES2 требует дополнительных параметров, которые передаются в JWE header:
Чем выше p2c, тем выше стойкость к перебору, но ниже производительность.
Пример зависимости вычислительной стоимости:
T p2c
JWE объект в compact serialization включает:
Пример заголовка:
{
"alg": "PBES2-HS256+A128KW",
"enc": "A256GCM",
"p2s": "Base64URLSalt",
"p2c": 10000
}
Библиотека jose предоставляет высокоуровневые API для JWE, включая PBES2.
npm install jose
Пример использования 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))
При вызове encrypt происходит:
Основной фактор безопасности — PBKDF2 iteration count.
Модель сложности перебора:
C_{attack} = O(2^k p2c)
где:
PBES2 корректно работает только в связке с:
Несовместимые комбинации приводят к ошибкам валидации JWE заголовка.
PBES2 занимает промежуточное положение между:
Его основная задача — обеспечить безопасное использование пароля без прямого его включения в криптосистему, превращая пароль в управляемый криптографический материал через PBKDF2 и wrapping-слой AES.