Кодирование base64 в SJCL реализовано как отдельный модуль кодеков,
работающий поверх внутреннего представления данных библиотеки —
bitArray. Это принципиально важно: SJCL не оперирует
байтами или строками напрямую, а использует побитовый массив
фиксированной структуры, что позволяет унифицировать криптографические
операции и устранить неоднозначности, связанные с кодировками
JavaScript-строк.
Стандарт base64 предназначен для преобразования бинарных данных в текстовый формат, удобный для передачи по текстовым протоколам. Он использует алфавит из 64 символов:
A–Z, a–z, 0–9, +, /
Каждые 3 байта (24 бита) преобразуются в 4 символа по 6 бит.
SJCL работает не с байтами, а с массивом 32-битных слов, где каждый
элемент содержит 32 бита данных. Поэтому перед кодированием происходит
интерпретация bitArray как последовательности бит без
привязки к байтовой границе.
Реализация стандартного base64 находится в
sjcl.codec.base64. Основные методы:
sjcl.codec.base64.fromBits(arrBit) — кодированиеsjcl.codec.base64.toBits(str) — декодированиеvar sjcl = require('sjcl');
var bits = sjcl.hash.sha256.hash("hello");
var encoded = sjcl.codec.base64.fromBits(bits);
На выходе получается строка base64, пригодная для хранения или передачи.
Внутри fromBits происходит:
bitArray=, если длина не кратна 24
битамvar decodedBits = sjcl.codec.base64.toBits(encoded);
Алгоритм обратный:
=bitArray=)SJCL сохраняет классическое поведение RFC 4648:
=Это важно при совместимости с внешними API, особенно при взаимодействии с серверными языками (Java, Python, Go).
Используется классический набор:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Это означает, что результат может содержать символы + и
/, которые не всегда безопасны для URL или файловых
имен.
SJCL требует строгого соблюдения формата входа:
Для сценариев, где base64 должен использоваться в URL, cookie, токенах или идентификаторах, применяется модифицированный вариант — base64url.
В SJCL он реализован как:
sjcl.codec.base64url.fromBitssjcl.codec.base64url.toBitsОсновные изменения касаются алфавита:
| Стандарт base64 | base64url |
|---|---|
+ |
- |
/ |
_ |
= padding |
обычно убирается |
var bits = sjcl.hash.sha256.hash("hello");
var urlSafe = sjcl.codec.base64url.fromBits(bits);
Результат:
+ и /var restoredBits = sjcl.codec.base64url.toBits(urlSafe);
Алгоритм декодирования включает:
- → + и _ → /SJCL придерживается практики, при которой = обычно
удаляется:
encoded = encoded.replace(/=/g, "");
Это уменьшает размер строки и делает её удобной для использования в URL-параметрах:
https://example.com/?token=QmFzZTY0X1Rva2Vu
+, /, =SJCL не хранит отдельные реализации алгоритмов кодирования — вместо этого оба кодека построены на общей базе функций:
Ключевая идея — минимизация зависимостей от строковой кодировки JavaScript.
sjcl.codec.base64.fromBits([])
Результат: пустая строка
SJCL корректно обрабатывает случаи, когда длина бит не кратна 8, автоматически обрезая лишние биты при кодировании.
При некорректных символах:
toBits может выбросить исключениеbase64 и base64url в SJCL чаще всего применяются в связке с:
SHA-256, SHA-512)Пример HMAC + base64url:
var key = sjcl.codec.utf8String.toBits("secret");
var data = sjcl.codec.utf8String.toBits("message");
var mac = sjcl.misc.hmac(key, sjcl.hash.sha256);
var result = mac.encrypt(data);
var token = sjcl.codec.base64url.fromBits(result);
При интеграции SJCL с backend важно учитывать:
= до длины
кратной 4base64.urlsafe_b64decode может требовать
нормализации строкиТипичный pipeline согласования:
SJCL base64url → HTTP → backend decode → restore padding → decode
Неверно:
sjcl.codec.base64.fromBits("text");
Правильно:
var bits = sjcl.codec.utf8String.toBits("text");
sjcl.codec.base64.fromBits(bits);
SJCL не предполагает автоматическую работу со строками JavaScript, поэтому:
Результаты этих кодеков не взаимозаменяемы без преобразования алфавита и padding.
Сам по себе base64 не является механизмом защиты данных:
В контексте SJCL он используется как транспортный слой поверх криптографических операций.
SJCL минимизирует overhead:
Внутри реальных приложений на SJCL выбор обычно следующий:
base64 → совместимость с legacy API, email, бинарные
протоколыbase64url → web-токены, URL, браузерные приложения,
OAuth-подобные схемыРазделение на два кодека позволяет избежать постоянного ручного escaping и нормализации строк.