Почему «просто кэшировать последний результат» на самом деле не работает
Очевидное решение — запомнить последнюю успешную проверку в локальном файле или реестре и пропустить сетевой запрос в следующий раз. Это решает проблему офлайна, но ничего не проверяет — это просто строка на диске, которую любой пользователь с текстовым редактором может переключить с false на true. Она также не истекает аккуратно (скопированный файл работает вечно на второй машине) и не может сказать вам, когда она была реально в последний раз проверена. Вы обменяли «нет офлайн-поддержки» на «офлайн-поддержку, которая на самом деле не является проверкой» — файлу доверяют, но не проверяют его.
Почему написать настоящую офлайн-проверку самому сложнее, чем кэшировать флаг
Настоящая офлайн-проверка означает, что приложение должно уметь доказать, что лицензия действительна, не спрашивая сервер, используя только данные, которые могли прийти исключительно от этого сервера. Для этого нужна пара приватный/публичный ключ (сервер подписывает, приложение хранит только публичную половину), компактный подписанный payload с лицензионным ключом, ID устройства и сроком действия, который приложение может сверить с часами, способ сделать подделку обнаруживаемой — переверните один байт, и подпись обязательно должна стать недействительной — и решение о том, как долго устаревший, но подписанный результат остаётся доверенным, прежде чем приложение будет вынуждено снова связаться с сервером. Ничто из этого не экзотическая криптография, но правильно всё это собрать — проверять подпись ещё до разбора payload, проверять каждое утверждение внутри него, выбрать разумное окно истечения — это именно то, что легко один раз тонко сделать неправильно и никогда этого не заметить.
Подписанные аренды: сервер подписывает, приложение только проверяет
Именно это и делает офлайн-проверка SublimeKeys. Каждый вызов activate/verify возвращает аренду (lease) — небольшой токен, подписанный Ed25519, содержащий лицензионный ключ, ID устройства, ID продукта и срок действия, действительный 7 дней. Ваше приложение кэширует его локально и проверяет подпись по публичному ключу, встроенному прямо в ваш собственный бинарник — приватный ключ никогда не покидает наш сервер, так что на диске пользователя нет ничего, что можно отредактировать в действительную аренду. Подделанная аренда немедленно проваливает проверку подписи, ещё до того, как её содержимое вообще разбирается. Когда 7-дневное окно истекает, следующая проверка тихо выходит в онлайн, получает свежую аренду, и цикл повторяется — так что полностью офлайн-машина остаётся доказуемо лицензированной до недели за раз, а отозванная лицензия обнаруживается при следующем подключении машины к сети.
Как это добавить — 3 шага с официальными SDK
Что это вам реально даёт
Ваше приложение проверяет лицензию за микросекунды с нулём сетевых запросов в обычный день, продолжает корректно работать неделю в авиарежиме или в заблокированной корпоративной сети, и всё равно обнаруживает отозванную или возвращённую лицензию в течение 7 дней после повторного подключения машины — без того, чтобы вам пришлось писать хоть одну строку криптографии самому, хостить систему управления ключами или изобретать собственный формат токена, который кто-нибудь рано или поздно найдёт способ отредактировать.
Кому это реально нужно
Путешествующие пользователи
Консультанты, выездные инженеры — все, чей ноутбук проводит реальное время офлайн между перелётами и клиентами.
Заблокированные корпоративные сети
Машины за файрволами, блокирующими исходящие API-вызовы ко всему, что явно не в белом списке.
Настольные инструменты на Python
pip install sublimekeys — офлайн-проверка встроена в официальный SDK.
Приложения на Electron
npm install sublimekeys — та же проверка подписанной арендой, ноль нативных зависимостей.
Изолированные / регулируемые среды
Машины, которые вообще не должны выходить в интернет, только изредка синхронизироваться.
About
Patrick Chen — инди-разработчик, стоящий за Sublimearts.io. Встроил офлайн-проверку в SublimeKeys, поняв, что каждое настольное приложение, продаваемое путешествующим или корпоративным пользователям, рано или поздно упирается в одну и ту же стену «нет интернета».
Did you find this helpful?