В библиотеке CryptoJS ключи не рассматриваются как примитивные
строки. Основной внутренний формат — объект типа WordArray.
Это структура, представляющая собой массив 32-битных слов и
дополнительное поле длины (в байтах). Такой подход обеспечивает:
Пример структуры:
{
words: [0x12345678, 0x90abcdef],
sigBytes: 8
}
Поле sigBytes определяет фактическое количество значимых
байтов, что важно при работе с неполными словами.
Любой входной ключ (строка, hex, base64) перед использованием проходит нормализацию:
var key = CryptoJS.enc.Utf8.parse("my-secret-key");
Поддерживаются различные кодировки:
CryptoJS.enc.Utf8CryptoJS.enc.HexCryptoJS.enc.Base64CryptoJS.enc.Latin1Каждая кодировка преобразует данные в WordArray, который
далее используется алгоритмами.
Если вместо ключа передаётся строка-пароль, библиотека автоматически запускает механизм деривации ключа (Key Derivation Function, KDF). В основе лежит алгоритм OpenSSL EVP_BytesToKey.
var encrypted = CryptoJS.AES.encrypt("data", "password");
Внутренние шаги:
Формула процесса:
D_i = MD5(D_(i-1) + password + salt)
Где:
D_i — промежуточные блокиD_iДля симметричных алгоритмов (например, AES) требуется:
При использовании KDF оба значения извлекаются из общего результата:
var keySize = 256 / 32; // 8 слов
var ivSize = 128 / 32; // 4 слова
Итоговый массив разбивается:
var key = derived.words.slice(0, keySize);
var iv = derived.words.slice(keySize, keySize + ivSize);
При передаче готового ключа KDF не используется:
var key = CryptoJS.enc.Hex.parse("00112233445566778899aabbccddeeff");
var iv = CryptoJS.enc.Hex.parse("0102030405060708");
CryptoJS.AES.encrypt("data", key, { iv: iv });
Особенности:
Алгоритмы требуют строго определённые размеры:
| Алгоритм | Размер ключа |
|---|---|
| AES-128 | 16 байт |
| AES-192 | 24 байта |
| AES-256 | 32 байта |
CryptoJS не всегда явно валидирует длину — возможны неявные ошибки или автоматическое усечение.
Для безопасной генерации используется встроенный генератор:
var key = CryptoJS.lib.WordArray.random(32);
Важно:
crypto.getRandomValues (если
доступен)WordArray не защищён от:
Каждая операция (concat, slice) создаёт
новые объекты, что увеличивает поверхность атаки.
Ключи могут комбинироваться:
var combined = key1.clone().concat(key2);
Используется при:
В алгоритмах HMAC ключ также преобразуется в
WordArray:
CryptoJS.HmacSHA256(message, key);
Если ключ длиннее блока:
Внутри некоторых алгоритмов (например, HMAC) происходит кеширование:
ipad, opad)
сохраняютсяЭто снижает вычислительные затраты при множественных операциях.
При работе с потоками:
var cipher = CryptoJS.algo.AES.createEncryptor(key, { iv: iv });
Ключ сохраняется в состоянии объекта:
Ключевые риски:
WordArray.random для генерацииПример PBKDF2:
var key = CryptoJS.PBKDF2("password", salt, {
keySize: 256/32,
iterations: 100000
});
CryptoJS оптимизирует работу с ключами через:
Это позволяет эффективно обрабатывать даже большие объёмы данных без значительных затрат памяти.
Ключ является центральным элементом:
Все алгоритмы в CryptoJS построены вокруг корректного преобразования и использования ключей, что делает понимание их внутреннего устройства критически важным для безопасной разработки.