Подключение в браузере без сборщиков

Самый простой способ использования Stanford JavaScript Crypto Library (SJCL) в браузере без сборщиков — подключение готовой минифицированной версии через CDN.

<script src="https://cdn.jsdelivr.net/npm/sjcl@1.0.8/sjcl.min.js"></script>

После загрузки скрипта глобальный объект sjcl становится доступен в window, и все криптографические функции можно использовать напрямую.

Ключевой момент: SJCL не требует модулей, импортов или сборки, он изначально проектировался как самодостаточная библиотека для браузера.


Подключение локальной копии библиотеки

В ряде случаев использование CDN нежелательно (офлайн-режим, контроль поставки кода, корпоративные ограничения). Тогда библиотеку подключают локально.

Структура проекта:

/project
  ├── index.html
  ├── lib/
  │     └── sjcl.min.js

HTML:

<script src="./lib/sjcl.min.js"></script>

После подключения объект sjcl доступен глобально, как и при CDN-варианте.


Проверка загрузки библиотеки

После подключения можно убедиться, что библиотека доступна:

<script>
  console.log(typeof sjcl);
</script>

Ожидаемый результат:

object

Доступ к основным модулям осуществляется через пространство имён sjcl.


Использование SJCL в глобальной области видимости

SJCL не использует ES-модули, поэтому вся функциональность находится внутри одного глобального объекта:

sjcl

Примеры доступных модулей:

  • sjcl.encrypt
  • sjcl.decrypt
  • sjcl.hash
  • sjcl.codec
  • sjcl.random
  • sjcl.cipher

Базовый пример шифрования текста

После подключения библиотеки можно сразу выполнять симметричное шифрование:

<script>
  const data = "секретное сообщение";
  const password = "ключ123";

  const encrypted = sjcl.encrypt(password, data);
  console.log(encrypted);
</script>

Результат — JSON-структура, содержащая:

  • зашифрованный текст
  • параметры алгоритма
  • соль
  • IV (инициализационный вектор)

Расшифровка данных

<script>
  const password = "ключ123";

  const decrypted = sjcl.decrypt(password, encrypted);
  console.log(decrypted);
</script>

Важно учитывать:

  • неправильный пароль вызывает исключение
  • результат возвращается в виде строки

Подключение с контролем целостности (SRI)

При использовании CDN в продакшене часто добавляют проверку целостности файла:

<script
  src="https://cdn.jsdelivr.net/npm/sjcl@1.0.8/sjcl.min.js"
  integrity="sha384-..."
  crossorigin="anonymous">
</script>

SRI защищает от подмены содержимого библиотеки на стороне CDN.


Особенности работы без сборщиков

При использовании SJCL без Webpack / Vite / Parcel важно учитывать ряд особенностей:

1. Отсутствие модульной системы

SJCL не экспортирует ESM или CommonJS модули, поэтому:

  • нельзя использовать import sjcl from 'sjcl'
  • нельзя подключать как зависимость через ESM без обёрток

Работа всегда идёт через глобальный объект.


2. Порядок подключения скриптов

Если проект содержит несколько файлов:

<script src="./lib/sjcl.min.js"></script>
<script src="./app.js"></script>

Файл sjcl.min.js должен подключаться строго перед кодом, который его использует.


3. Конфликт с другими библиотеками

SJCL использует глобальное имя sjcl. Возможные проблемы:

  • перезапись переменной другим скриптом
  • повторное подключение разных версий

Решение — фиксированная версия и контроль зависимостей вручную.


Работа с генератором случайных чисел

SJCL содержит встроенный криптографический PRNG:

sjcl.random.addEventListener("ready", function () {
  console.log("Генератор готов");
});

Если генератор не инициализирован, некоторые операции могут использовать менее безопасные источники энтропии.


Хэширование без дополнительных зависимостей

SJCL поддерживает SHA-256 и другие алгоритмы:

const hash = sjcl.hash.sha256.hash("данные");
console.log(hash);

Часто используется совместно с кодировкой:

const hex = sjcl.codec.hex.fromBits(hash);
console.log(hex);

Работа с кодировками

SJCL активно использует собственные кодеки:

  • sjcl.codec.hex
  • sjcl.codec.base64
  • sjcl.codec.utf8String

Пример преобразования:

const bits = sjcl.codec.utf8String.toBits("текст");
const base64 = sjcl.codec.base64.fromBits(bits);

Подключение в старых браузерах

SJCL поддерживает старые браузеры благодаря отсутствию зависимости от современных API.

Однако важно учитывать:

  • нет ESM
  • нет async/await внутри библиотеки
  • минимальная зависимость от Web Crypto API

Это делает библиотеку пригодной для legacy-проектов.


Типичная структура подключения в реальном проекте

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>SJCL example</title>
</head>
<body>

<script src="./lib/sjcl.min.js"></script>

<script>
  const msg = "данные";
  const key = "password";

  const enc = sjcl.encrypt(key, msg);
  const dec = sjcl.decrypt(key, enc);

  console.log(enc);
  console.log(dec);
</script>

</body>
</html>

Частые ошибки при подключении

1. sjcl is not defined

Причина:

  • скрипт не загружен
  • неправильный порядок подключения

2. двойное подключение библиотеки

Приводит к:

  • перезаписи глобального объекта
  • конфликту версий

3. использование до загрузки DOM

Если скрипт выполняется раньше загрузки библиотеки:

console.log(sjcl.encrypt); // ошибка

Решение — размещение <script> внизу страницы или использование defer:

<script src="./lib/sjcl.min.js" defer></script>

Использование defer и async

  • defer — безопасный вариант, сохраняет порядок выполнения
  • async — может нарушить порядок загрузки

Рекомендуемый вариант:

<script src="./lib/sjcl.min.js" defer></script>
<script src="./app.js" defer></script>

Минификация и производительность

Официальная версия SJCL распространяется в минифицированном виде:

  • уменьшенный размер
  • быстрее загрузка
  • отсутствие лишних символов

При локальном использовании важно не подключать исходную (development) версию в продакшене.


Изоляция в IIFE-окружениях

Некоторые проекты оборачивают код:

(function () {
  const encrypted = sjcl.encrypt("key", "data");
  console.log(encrypted);
})();

SJCL при этом остаётся глобально доступным, но код приложения изолируется от глобального пространства имён.


Безопасное использование в браузерной среде

При подключении без сборщиков вся ответственность за безопасность смещается на:

  • контроль источника скрипта
  • фиксацию версии
  • проверку целостности (SRI)
  • отсутствие динамической подмены

SJCL не выполняет сетевых операций и не отправляет данные, но безопасность зависит от корректности интеграции.