PBKDF2 (Password-Based Key Derivation Function 2) применяется для преобразования пароля в криптографически стойкий ключ фиксированной длины. В библиотеке Stanford JavaScript Crypto Library (SJCL) этот алгоритм используется как стандартный механизм усиления паролей перед их использованием в шифровании или аутентификации.
Основная проблема, которую решает PBKDF2 — слабость пользовательских паролей. Даже при использовании современных хеш-функций прямое преобразование пароля в ключ остаётся уязвимым к перебору. PBKDF2 вводит вычислительную стоимость через многократное применение псевдослучайной функции.
PBKDF2 основан на повторяющемся применении HMAC с криптографической хеш-функцией. В SJCL используется HMAC-SHA256 как базовый PRF.
Функция ключа определяется как:
(P, S, c, dkLen) = _1 | 2 | | {dkLen/hLen }
где:
Каждый блок (T_i) вычисляется через функцию (F):
T_i = F(P, S, c, i)
Функция (F) определяется как XOR последовательных значений (U_j):
F(P, S, c, i) = U_1 U_2 U_c
где:
Соль в PBKDF2 предотвращает атаки с использованием радужных таблиц и предварительно вычисленных хешей.
Свойства соли:
В SJCL соль передаётся как массив бит или строка и автоматически включается в вычисление HMAC.
Параметр итераций (c) определяет количество повторений PRF.
Рост числа итераций увеличивает стоимость вычисления ключа как для легитимного пользователя, так и для атакующего.
T_{} c
В SJCL функция PBKDF2 доступна через
sjcl.misc.pbkdf2.
sjcl.misc.pbkdf2(password, salt, iterations, keyLength, prf);
password — строка или массив битsalt — строка или массив битiterations — число повторенийkeyLength — длина ключа в битахprf — (опционально) псевдослучайная функция, обычно
HMAC-SHA256const sjcl = require("sjcl");
const password = "correct horse battery staple";
const salt = sjcl.random.randomWords(8, 0);
const key = sjcl.misc.pbkdf2(
password,
salt,
200000,
256
);
В этом примере:
PBKDF2 проходит несколько фаз:
PRF строится на HMAC:
(P, X) = _{}(P, X)
Каждый блок результата формируется независимо, что позволяет параллелизацию.
Каждая итерация зависит от предыдущей:
Увеличение длины не влияет на стойкость пароля, но увеличивает стоимость вычислений.
Главный параметр безопасности PBKDF2.
Увеличение итераций:
Баланс выбирается исходя из допустимой задержки:
PBKDF2 обеспечивает:
Ограничения:
Часто используемые значения 1000–10000 сегодня считаются небезопасными.
Использование одинаковой соли для разных пользователей приводит к корреляции хешей.
Снижение длины ключа без необходимости уменьшает криптографическую устойчивость всей системы.
Фиксированные параметры без учёта производительности серверов приводят либо к уязвимости, либо к деградации UX.
В реализации SJCL:
Это делает библиотеку независимой от платформы и предсказуемой по результатам между браузерами и Node.js.
При выборе параметров учитываются три переменные:
Условно:
PBKDF2 остаётся базовым стандартом KDF в JavaScript-экосистеме, а реализация в Stanford JavaScript Crypto Library используется как эталон простоты и переносимости, несмотря на появление более современных memory-hard алгоритмов.