Самый простой способ использования 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 не использует ES-модули, поэтому вся функциональность находится внутри одного глобального объекта:
sjcl
Примеры доступных модулей:
sjcl.encryptsjcl.decryptsjcl.hashsjcl.codecsjcl.randomsjcl.cipherПосле подключения библиотеки можно сразу выполнять симметричное шифрование:
<script>
const data = "секретное сообщение";
const password = "ключ123";
const encrypted = sjcl.encrypt(password, data);
console.log(encrypted);
</script>
Результат — JSON-структура, содержащая:
<script>
const password = "ключ123";
const decrypted = sjcl.decrypt(password, encrypted);
console.log(decrypted);
</script>
Важно учитывать:
При использовании 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 важно учитывать ряд особенностей:
SJCL не экспортирует ESM или CommonJS модули, поэтому:
import sjcl from 'sjcl'Работа всегда идёт через глобальный объект.
Если проект содержит несколько файлов:
<script src="./lib/sjcl.min.js"></script>
<script src="./app.js"></script>
Файл sjcl.min.js должен подключаться строго перед кодом,
который его использует.
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.hexsjcl.codec.base64sjcl.codec.utf8StringПример преобразования:
const bits = sjcl.codec.utf8String.toBits("текст");
const base64 = sjcl.codec.base64.fromBits(bits);
SJCL поддерживает старые браузеры благодаря отсутствию зависимости от современных 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>
Причина:
Приводит к:
Если скрипт выполняется раньше загрузки библиотеки:
console.log(sjcl.encrypt); // ошибка
Решение — размещение <script> внизу страницы или
использование defer:
<script src="./lib/sjcl.min.js" defer></script>
defer — безопасный вариант, сохраняет порядок
выполненияasync — может нарушить порядок загрузкиРекомендуемый вариант:
<script src="./lib/sjcl.min.js" defer></script>
<script src="./app.js" defer></script>
Официальная версия SJCL распространяется в минифицированном виде:
При локальном использовании важно не подключать исходную (development) версию в продакшене.
Некоторые проекты оборачивают код:
(function () {
const encrypted = sjcl.encrypt("key", "data");
console.log(encrypted);
})();
SJCL при этом остаётся глобально доступным, но код приложения изолируется от глобального пространства имён.
При подключении без сборщиков вся ответственность за безопасность смещается на:
SJCL не выполняет сетевых операций и не отправляет данные, но безопасность зависит от корректности интеграции.