Совместимость формата между версиями библиотеки

Совместимость форматов данных в SJCL определяется тем, как библиотека сериализует результаты криптографических операций и какие метаданные сохраняются вместе с зашифрованным текстом. В отличие от низкоуровневых криптографических API, SJCL делает упор на переносимость результата: зашифрованный объект должен быть декодируемым в разных окружениях и версиях библиотеки без ручного разбора внутренних структур.

Результат работы sjcl.encrypt представляет собой JSON-строку, содержащую набор полей, описывающих параметры шифрования и сам шифротекст:

  • iv — вектор инициализации
  • salt — соль для KDF (если используется парольное шифрование)
  • ct — ciphertext (зашифрованные данные)
  • v — версия формата SJCL
  • iter — количество итераций KDF
  • ks — размер ключа
  • ts — размер тега аутентификации
  • mode — режим шифрования (например, ccm)
  • adata — дополнительные аутентифицированные данные (если указаны)
  • cipher — используемый алгоритм (например, aes)

Ключевым элементом совместимости является поле v. Оно позволяет библиотеке понимать, как интерпретировать структуру JSON и какие правила применялись при генерации данных.


Версионирование формата и обратная совместимость

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

  • интерпретацию полей JSON
  • порядок и состав параметров KDF
  • поведение при восстановлении ключа
  • допустимые режимы шифрования

На практике изменения между версиями затрагивают не столько структуру JSON, сколько внутреннюю семантику параметров.

Например, более старые версии могли не учитывать некоторые поля или использовать фиксированные значения параметров KDF, тогда как новые версии делают их явными (iter, ks).


Проблемы совместимости при обновлении SJCL

Наиболее частые источники несовместимости связаны не с самим JSON, а с криптографическими настройками:

1. Изменение параметров KDF

Поля iter и ks определяют процесс получения ключа из пароля. Если:

  • новая версия увеличивает iter
  • или изменяет стандартный ks

то данные, зашифрованные в одной версии, могут не быть воспроизведены в другой при неверных параметрах по умолчанию.


2. Расширение набора поддерживаемых режимов

Поле mode определяет режим шифрования. Если старое окружение не поддерживает режим, используемый в новом, дешифрование становится невозможным, даже если структура JSON корректна.


3. Изменения в сериализации bitArray

SJCL использует внутренний формат bitArray для представления бинарных данных. Он сериализуется в Base64-подобное представление внутри ct, iv, salt.

Изменения в реализации:

  • кодирования блоков
  • выравнивания битов
  • обработки конечных байтов

могут привести к несовпадению расшифровки при использовании разных версий библиотеки.


Роль поля v в определении совместимости

Поле v в структуре JSON — это основной механизм определения формата:

  • используется при парсинге входных данных
  • влияет на выбор алгоритма декодирования
  • позволяет поддерживать несколько форматов параллельно

Типичный процесс дешифрования начинается с проверки версии:

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

Совместимость между браузерной и серверной реализацией

SJCL часто используется как в браузере, так и в Node.js-окружении. При этом различия могут возникать не только из-за версии библиотеки, но и из-за:

  • различий в криптографических провайдерах (WebCrypto vs pure JS)
  • различий в генерации случайных чисел
  • различий в кодировке строк (UTF-8 обработка)

Особенно критично это для:

  • iv
  • salt
  • ct

Поскольку эти поля должны быть идентичны побайтно для корректного восстановления данных.


Обратная совместимость sjcl.decrypt

Функция sjcl.decrypt построена так, чтобы максимально долго поддерживать старые форматы. При этом она:

  • читает JSON без жёсткой схемы
  • извлекает только необходимые поля
  • игнорирует неизвестные дополнительные параметры
  • адаптирует KDF под доступные значения

Однако полная совместимость гарантируется только при сохранении:

  • алгоритма шифрования (cipher)
  • режима (mode)
  • параметров ключа (ks, iter)

Эволюция формата и расширяемость

Формат SJCL изначально проектировался как расширяемый JSON-контейнер. Это позволило:

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

Типичная стратегия расширения:

  1. добавляется новое поле (например, дополнительный параметр аутентификации)
  2. старые версии его игнорируют
  3. новые версии используют его при наличии
  4. при отсутствии используется значение по умолчанию

Практические аспекты миграции данных между версиями

При переносе зашифрованных данных между версиями SJCL важно учитывать:

  • сохранение исходного JSON без преобразований
  • контроль параметров KDF
  • фиксирование версии v при архивировании данных
  • избегание повторного шифрования без необходимости

Если данные были зашифрованы старой версией, но расшифровываются новой, чаще всего достаточно передать оригинальный JSON без изменений.


Потенциальные точки несовместимости при кастомных сборках

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

  • отключены отдельные модули (например, определённые режимы шифрования)
  • изменён алгоритм генерации IV
  • изменён формат сериализации bitArray
  • переопределены функции KDF

В таких случаях поле v не гарантирует корректную интерпретацию, так как логика внутри версии может отличаться.


Поведение при неизвестных или повреждённых полях

SJCL при декодировании придерживается принципа устойчивости:

  • неизвестные поля игнорируются
  • отсутствующие поля приводят к ошибке только если критичны (ct, iv, salt)
  • дополнительные данные не влияют на дешифрование, если не задействованы в аутентификации

Это позволяет сохранять частичную совместимость даже при изменении структуры данных между релизами.