Библиотека Crypto-js оперирует не обычными строками JavaScript, а
специальным типом — WordArray. Это ключевая структура,
через которую проходят все криптографические операции.
WordArray представляет собой массив 32-битных слов
(words) и количество значимых байтов
(sigBytes). Такое представление позволяет эффективно
обрабатывать бинарные данные и выполнять побитовые операции.
var wordArray = CryptoJS.lib.WordArray.create([0x12345678, 0x90abcdef], 8);
words — массив чисел (по 4 байта каждое)sigBytes — фактическая длина данных в байтахПо умолчанию строка интерпретируется как UTF-8:
var data = CryptoJS.enc.Utf8.parse("Hello");
Результат — объект WordArray, пригодный для шифрования
или хэширования.
Альтернативные кодировки:
var data = CryptoJS.enc.Latin1.parse("Hello");
var data = CryptoJS.enc.Utf16.parse("Hello");
var data = CryptoJS.enc.Utf16LE.parse("Hello");
Обратное преобразование выполняется методом toString() с
указанием кодировки:
var str = wordArray.toString(CryptoJS.enc.Utf8);
Примеры:
wordArray.toString(CryptoJS.enc.Hex);
wordArray.toString(CryptoJS.enc.Base64);
wordArray.toString(CryptoJS.enc.Latin1);
Если кодировка не указана, по умолчанию используется Hex.
Hex (шестнадцатеричная строка) — один из основных форматов представления бинарных данных.
var hex = CryptoJS.enc.Hex.stringify(
CryptoJS.enc.Utf8.parse("Hello")
);
var wordArray = CryptoJS.enc.Hex.parse("48656c6c6f");
var str = wordArray.toString(CryptoJS.enc.Utf8);
Hex широко используется для:
Base64 применяется для компактного текстового представления бинарных данных.
var base64 = CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse("Hello")
);
Результат:
SGVsbG8=
var wordArray = CryptoJS.enc.Base64.parse("SGVsbG8=");
var str = wordArray.toString(CryptoJS.enc.Utf8);
Base64 используется:
Crypto-js не предоставляет прямого API для работы с массивами байтов
(Uint8Array), но их можно преобразовать.
function wordArrayToUint8Array(wordArray) {
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var u8 = new Uint8Array(sigBytes);
for (var i = 0; i < sigBytes; i++) {
u8[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
}
return u8;
}
function uint8ArrayToWordArray(u8Array) {
var words = [];
for (var i = 0; i < u8Array.length; i++) {
words[i >>> 2] |= u8Array[i] << (24 - (i % 4) * 8);
}
return CryptoJS.lib.WordArray.create(words, u8Array.length);
}
Это необходимо при интеграции с:
Неправильный выбор кодировки приводит к:
Многие функции Crypto-js автоматически принимают строки:
var hash = CryptoJS.SHA256("Hello");
Внутри происходит:
Для явного контроля лучше выполнять преобразования вручную:
var data = CryptoJS.enc.Utf8.parse("Hello");
var hash = CryptoJS.SHA256(data);
При работе с файлами или сетевыми пакетами важно избегать промежуточных строк:
Рекомендуемый подход:
Uint8ArrayWordArray1. Потеря данных при неправильной кодировке
CryptoJS.enc.Utf8.parse(binaryData) // ошибка
2. Двойное кодирование
CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Base64.parse(data)
)
3. Игнорирование sigBytes
4. Использование строк вместо WordArray в сложных сценариях
| Формат | Размер | Читаемость | Применение |
|---|---|---|---|
| UTF-8 | средний | высокая | текст |
| Hex | большой | высокая | отладка, хэши |
| Base64 | меньше Hex | средняя | передача данных |
| Binary | минимальный | низкая | внутренняя обработка |
Типичный поток обработки данных:
Строка (UTF-8)
↓ parse
WordArray
↓ crypto operation
WordArray
↓ stringify
Hex / Base64 / строка
Для бинарных данных:
Uint8Array
↓ convert
WordArray
↓ crypto
WordArray
↓ convert
Uint8Array / Base64
Ключевая идея работы с Crypto-js — явное управление форматом данных на каждом этапе:
Это исключает: