Skip to content

Feature Signed

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

✍️ Подпись нагрузки

← Возможности · Главная · Сравнение

Serializer::signed($key) — HMAC-SHA256-подпись поверх любого формата: нагрузка становится tamper-proof для cookie, очередей, кэша и межсервисного обмена.

Принцип работы

seal() сериализует значение, кодирует в base64 и добавляет HMAC-подпись: результат — строка подпись.нагрузка. unseal() пересчитывает подпись и сравнивает её константным временем (hash_equals) до десериализации — подделанные и усечённые данные отклоняются, не доходя до разбора. Ключ должен быть не короче 32 байт. По умолчанию базовый формат — PHP с анти-POP: даже при утечке ключа подпись не превращается в RCE.

use CloudCastle\Serialize\Serializer;

$signed = Serializer::signed($secretKey);          // ключ ≥ 32 байт
$sealed = $signed->seal(['user_id' => 5, 'role' => 'admin']);

$signed->unseal($sealed);                          // ['user_id' => 5, ...]
$signed->unseal($tampered);                        // ← InvalidSignatureException

// Поверх JSON — для читаемой межсервисной нагрузки
Serializer::signed($secretKey, Serializer::json());

Плюсы

  • Готовая защита целостности — без ручного кода hash_hmac в каждом месте.
  • Сравнение константным временем исключает тайминговые атаки на подпись.
  • Подпись проверяется до десериализации — подделка не доходит до разбора.
  • Работает поверх любого формата (php/json/igbinary).
  • Требование ключа ≥ 32 байт защищает от слабых ключей на этапе конструктора.

Минусы

  • Подпись не шифрует данные — она подтверждает целостность, но не конфиденциальность. Для секретов комбинируйте с шифрованием на транспортном уровне.

✅ Рекомендуется

  • Cookie/токены состояния, задачи очередей, кэш с внешним хранилищем.
  • Хранить ключ в секрет-хранилище, не в коде; ротировать при компрометации.

❌ Антипаттерны

  • Хранить чувствительные данные в подписанной, но незашифрованной нагрузке (подпись ≠ шифрование).
  • Короткий/предсказуемый ключ — HMAC вырождается; пакет отвергает ключи < 32 байт.

Clone this wiki locally