Библиотека sjcl (Stanford JavaScript Crypto Library) предоставляет реализацию блочных шифров с акцентом на безопасность и переносимость в браузерной среде.
Основной и единственный блочный шифр в библиотеке — AES. Поддерживаются следующие характеристики:
Пример создания объекта шифра:
var key = sjcl.random.randomWords(4); // 128 бит
var aes = new sjcl.cipher.aes(key);
SJCL реализует несколько режимов работы блочных шифров, позволяющих использовать AES в различных сценариях.
Наиболее часто используемый режим в SJCL — CCM, обеспечивающий одновременно:
Особенности:
Пример:
var encrypted = sjcl.mode.ccm.encrypt(aes, data, iv);
var decrypted = sjcl.mode.ccm.decrypt(aes, encrypted, iv);
Также доступен режим GCM, обладающий высокой производительностью и аналогичной функциональностью:
var encrypted = sjcl.mode.gcm.encrypt(aes, data, iv);
Режим OCB2 реализует аутентифицированное шифрование:
var encrypted = sjcl.mode.ocb2.encrypt(aes, data, iv);
SJCL включает криптографические хэш-функции для обеспечения целостности данных и построения других примитивов.
Основная хэш-функция — SHA-256:
Пример:
var hash = sjcl.hash.sha256.hash("message");
Поддерживается также SHA-1, но использование не рекомендуется:
var hash = sjcl.hash.sha1.hash("message");
SJCL реализует HMAC на основе SHA-256:
Пример:
var hmac = new sjcl.misc.hmac(key, sjcl.hash.sha256);
var mac = hmac.encrypt("message");
SJCL содержит криптографически стойкий генератор случайных чисел:
Пример:
var randomWords = sjcl.random.randomWords(8);
Особенности:
sjcl.random.addEntropy(data, bits, "source");
Используется для получения криптографических ключей из паролей:
Пример:
var key = sjcl.misc.pbkdf2(password, salt, iterations, keyLength);
Параметры:
password — исходный парольsalt — случайная сольiterations — число итераций (например, 10000+)keyLength — длина ключа в битахSJCL активно использует собственное представление данных — массивы 32-битных слов (bitArray). Для взаимодействия с внешними форматами предусмотрены кодеки.
var bits = sjcl.codec.utf8String.toBits("text");
var text = sjcl.codec.utf8String.fromBits(bits);
var hex = sjcl.codec.hex.fromBits(bits);
var bits = sjcl.codec.hex.toBits(hex);
var b64 = sjcl.codec.base64.fromBits(bits);
var bits = sjcl.codec.base64.toBits(b64);
SJCL включает поддержку криптографии на эллиптических кривых.
Пример генерации ключа:
var keys = sjcl.ecc.elGamal.generateKeys(256);
var ciphertext = keys.pub.encrypt("message");
var plaintext = keys.sec.decrypt(ciphertext);
var keys = sjcl.ecc.ecdsa.generateKeys(256);
var signature = keys.sec.sign(hash);
var valid = keys.pub.verify(hash, signature);
Функция безопасного сравнения предотвращает тайминговые атаки:
sjcl.bitArray.equal(a, b);
Особенности:
Центральная структура данных:
Пример:
var bits = sjcl.bitArray.concat(a, b);
var slice = sjcl.bitArray.bitSlice(bits, 0, 64);
SJCL предоставляет удобный интерфейс для сериализации криптографических операций:
var encrypted = sjcl.encrypt(password, data);
var decrypted = sjcl.decrypt(password, encrypted);
Внутренне используются:
Формат JSON включает:
iv — вектор инициализацииsalt — сольct — ciphertextiter — итерации PBKDF2Комбинация примитивов в SJCL строится следующим образом:
Такая модульность позволяет гибко строить криптографические протоколы, комбинируя базовые элементы библиотеки.