Stanford JavaScript Crypto Library изначально проектировалась как браузерная криптографическая библиотека, поэтому при использовании в Node.js возникает ряд особенностей, связанных с отсутствием DOM-окружения и различиями в источниках случайности. Подключение сводится к установке пакета и адаптации окружения.
npm install sjcl
После установки библиотека подключается стандартным способом:
const sjcl = require('sjcl');
В проектах с ES Modules используется импорт:
import sjcl from 'sjcl';
В зависимости от конфигурации сборщика (Node.js ESM, TypeScript, bundler) может потребоваться дополнительная настройка интеропа между CommonJS и ES Modules.
SJCL ожидает наличие браузерных глобальных объектов, прежде всего:
windowdocument (в некоторых сценариях)navigatorcrypto (Web Crypto API или fallback)В Node.js часть этих объектов отсутствует, что требует частичной эмуляции окружения.
Для большинства сценариев достаточно минимального shim’а:
global.window = global;
global.navigator = { userAgent: 'node.js' };
Однако ключевая проблема связана не с DOM, а с генерацией случайных чисел.
SJCL имеет собственный механизм генерации случайных чисел через
sjcl.random. В браузере он использует события мыши и
системные источники. В Node.js этого нет, поэтому требуется подключение
криптографически стойкого генератора из стандартного модуля
crypto.
const crypto = require('crypto');
Добавление энтропии:
sjcl.random.addEntropy(
crypto.randomBytes(32).toString('hex'),
256,
'crypto'
);
Параметр 256 указывает на количество бит энтропии,
которое добавляется в пул.
SJCL не сразу переходит в режим криптографической готовности. Перед использованием функций шифрования, зависящих от RNG, проверяется состояние:
if (!sjcl.random.isReady()) {
sjcl.random.startCollectors();
}
В Node.js startCollectors() не имеет эффекта, поэтому
основная стратегия — ручное добавление энтропии из
crypto.
В современных версиях Node.js доступен crypto.webcrypto,
который можно использовать для улучшенной совместимости.
const { webcrypto } = require('crypto');
global.crypto = webcrypto;
Это приближает окружение к браузерному и позволяет SJCL работать более предсказуемо в режимах, завязанных на стандарт WebCrypto.
После подготовки окружения SJCL используется без изменений API.
const plaintext = "секретное сообщение";
const password = "ключ";
const encrypted = sjcl.encrypt(password, plaintext);
console.log(encrypted);
const decrypted = sjcl.decrypt(password, encrypted);
console.log(decrypted);
Результат шифрования представляет собой JSON-строку, содержащую параметры алгоритма, соль, IV и ciphertext.
SJCL использует собственные представления данных:
sjcl.bitArray)const bits = sjcl.codec.utf8String.toBits("данные");
const str = sjcl.codec.utf8String.fromBits(bits);
SJCL поддерживает несколько криптографических хеш-функций, включая SHA-256.
const hash = sjcl.hash.sha256.hash("данные");
const hex = sjcl.codec.hex.fromBits(hash);
console.log(hex);
Хеш-значение возвращается в виде bitArray и обычно кодируется в hex или base64.
Для производных ключей используется PBKDF2:
const key = sjcl.misc.pbkdf2("пароль", "соль", 1000, 256);
Параметры:
Результат — битовый массив, пригодный для AES.
При запуске в headless-среде SJCL может блокироваться из-за
недостатка энтропии. Решение — явное добавление источника через
crypto.randomBytes.
При использовании Webpack или Vite возможны конфликты из-за ожидания глобальных объектов браузера. Обычно требуется настройка:
resolve.fallbackDefinePlugin для globalcryptoSJCL написана на чистом JavaScript без использования нативных биндингов. В Node.js это приводит к:
cryptoВ Node.js уже существует полноценный криптографический модуль:
const crypto = require('crypto');
Он предоставляет:
SJCL в Node.js используется преимущественно в случаях:
При использовании в API-сервисах SJCL обычно включается как слой совместимости:
Типичная схема обмена:
// сервер принимает SJCL JSON
const decrypted = sjcl.decrypt(serverKey, request.body.data);
Ключевые параметры, влияющие на безопасность:
const derivedKey = sjcl.misc.pbkdf2(password, salt, 10000, 256);
Результат sjcl.encrypt имеет структуру JSON:
ivsaltct (ciphertext)modeks (key size)iter (iterations)Эта структура позволяет переносить зашифрованные данные между средами без потери контекста.
Типизация SJCL отсутствует по умолчанию, поэтому используется декларация:
declare module "sjcl";
Либо подключаются сторонние d.ts файлы, описывающие bitArray и crypto API.
SJCL не предназначена для высоконагруженных серверных криптосистем. В Node.js она используется как:
Основные ограничения: