PBKDF2 в Web Crypto API используется для получения криптографических ключей из паролей. В основе лежит функция многократного хеширования, которая превращает слабый пользовательский пароль в устойчивый ключ. Без правильной настройки параметров результат остаётся уязвимым к перебору и словарным атакам.
Соль — случайный набор байтов, который добавляется к паролю перед началом вычислений. Её основная задача — исключить возможность использования заранее подготовленных таблиц (rainbow tables) и обеспечить уникальность результата даже при одинаковых паролях.
В Web Crypto API соль передаётся как ArrayBuffer или
Uint8Array.
Пример генерации соли:
const salt = crypto.getRandomValues(new Uint8Array(16));
Соль сохраняется вместе с результатом деривации ключа, поскольку без неё невозможно восстановить тот же ключ из пароля.
Итерации определяют, сколько раз хеш-функция будет применена к данным. Это основной параметр, влияющий на стойкость PBKDF2 против атак перебора.
Чем выше число итераций, тем:
В Web Crypto API параметр задаётся числом:
iterations: 100000
PBKDF2 выполняется синхронно внутри криптографического модуля браузера, но всё равно нагружает CPU. Поэтому увеличение итераций всегда требует компромисса между безопасностью и временем выполнения.
PBKDF2 опирается на криптографическую хеш-функцию, которая используется на каждом шаге итераций. В Web Crypto API выбор осуществляется через алгоритмы SHA.
Поддерживаемые значения:
"SHA-1" (устаревший, не рекомендуется)"SHA-256" (минимальный современный стандарт)"SHA-384" (повышенная стойкость)"SHA-512" (максимальная стойкость среди стандартных
вариантов)Пример выбора:
hash: "SHA-256"
Хеш-функция влияет на внутреннюю стойкость PBKDF2, поскольку каждый цикл итерации использует её как базовую операцию.
Этот параметр определяет, сколько байтов будет у итогового ключа, полученного из пароля.
Задаётся в байтах:
derivedKeyLength: 32
PBKDF2 в Web Crypto API используется через
crypto.subtle.deriveKey или
crypto.subtle.deriveBits.
Конфигурация выглядит следующим образом:
const algorithm = {
name: "PBKDF2",
salt: salt,
iterations: 100000,
hash: "SHA-256"
};
const baseKey = await crypto.subtle.importKey(
"raw",
new TextEncoder().encode("password123"),
"PBKDF2",
false,
["deriveKey"]
);
const derivedKey = await crypto.subtle.deriveKey(
algorithm,
baseKey,
{
name: "AES-GCM",
length: 256
},
false,
["encrypt", "decrypt"]
);
PBKDF2 может использоваться в двух режимах:
Возвращает “сырые” байты ключа:
const bits = await crypto.subtle.deriveBits(
algorithm,
baseKey,
256
);
Используется когда нужно:
Сразу возвращает объект CryptoKey:
const key = await crypto.subtle.deriveKey(
algorithm,
baseKey,
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"]
);
Используется когда:
Все параметры PBKDF2 работают совместно:
Изменение одного параметра полностью меняет итоговый ключ.
crypto.getRandomValuesНеправильная настройка PBKDF2 приводит к серьёзным уязвимостям:
Если соль фиксирована или короткая:
PBKDF2 не предназначен для защиты от современных высокопроизводительных атак сам по себе, но при корректной настройке остаётся применимым:
При использовании PBKDF2 обычно сохраняются:
Пример структуры:
{
"salt": "base64...",
"iterations": 150000,
"hash": "SHA-256",
"keyLength": 32
}
PBKDF2 реализован через SubtleCrypto:
crypto.subtle.importKey(...)
crypto.subtle.deriveKey(...)
crypto.subtle.deriveBits(...)
Поддержка:
Ограничения:
PBKDF2 используется в:
Во всех случаях корректная настройка параметров определяет устойчивость всей схемы безопасности.