Лицензионные ключи
License key — человекочитаемый секрет для валидации в Runtime. Вендор выпускает и ротирует ключи в Management; продукты передают ключ в плоскость Runtime.
License key — не Compact JWS и не подписанный lease/license artifact (MH-LEASE-V1, MH-LICENSE-V1, …). Словарь и прочие non-goals: Основные понятия.
Форматы (v1 и v2)
Платформа поддерживает две формы human key. Версия — это metadata (formatVersion), она не вшита в строку.
| Версия | Каноническая форма | Значимых символов | Энтропия | Статус |
|---|---|---|---|---|
| v1 | XXXX-XXXX-XXXX-XXXX | 16 (4×4) | ~80 бит | Сохраняется навсегда для уже выданных ключей |
| v2 | XXXX-XXXX-XXXX-XXXX-XXXX | 20 (5×4) | ~100 бит | По умолчанию для нового issue / rotate |
Общие правила:
- Алфавит: Crockford Base32 без
I,L,O,U—0123456789ABCDEFGHJKMNPQRSTVWXYZ - Канон = uppercase; без product prefix в строке
Пример v1 (иллюстрация)
7K3M-9NPQ-2RST-WXYZ
Пример v2 (иллюстрация)
7K3M-9NPQ-2RST-WXYZ-ABCD
Нормализация (перед validate)
- Обрезать пробелы по краям.
- Убрать пробелы/опциональные разделители; собрать значимые символы.
- Привести к uppercase.
- На вводе сопоставить похожие символы:
I/L→1,O→0(генератор не выдаётI,L,O,U). - Если длина значимой части = 16 → v1; если 20 → v2; иначе отклонить.
- Отклонить символы вне алфавита после mapping.
Для хеширования всегда используется dashed uppercase каноническая форма обнаруженной версии.
Хранение и AuthN
- At rest: только SHA-256 hex канонического UTF-8 plaintext — plaintext не хранится.
- Issue / rotate: полный plaintext показывается один раз; повторно получить нельзя. Новые ключи по умолчанию — v2.
- Support handles: первая группа (
XXXX) — public prefix; последняя (YYYY) — public suffix. - UI mask: v1
XXXX-••••-••••-YYYY; v2XXXX-••••-••••-••••-YYYY. - Runtime: normalize (ветка по длине) → hash → lookup в доверенном tenant. Принимаются и v1, и v2.
- Logging: никогда не логируйте полный ключ — только prefix/mask.
Безопасное обращение
Относитесь к полному ключу как к паролю (secret manager / vault; не исходники и не чаты). В приложениях — env/secret stores (см. MYHORECA_LICENSE_KEY в матрице SDK). При компрометации: ротируйте в Management и обновите Runtime-клиенты. Энтропия — для онлайн-валидации Runtime с tenant scope и rate limiting, не для подписи платформы.
Durable-ротация и retry
Используйте customer-scoped API действий с лицензией клиента с точным precondition текущего material и стабильным Idempotency-Key. Успешная ротация немедленно инвалидирует старый Runtime credential, но не отзывает License и не аннулирует уже подписанные leases.
Сохраните plaintext до закрытия первого успешного ответа. Network- или audit-recovery retry больше не может раскрыть его: durable replay возвращает те же operation/material references и mask с явным null plaintext. Ответы ротации не кэшируются, а safe audit содержит только typed identifiers, state, mask, format и timestamps.