← На главную

Свой QR-проход в спортзал без ленты соцсети

05.11.2026 17:30 · hackernews

Автор записался в спортзал с хорошим оборудованием и качественным приложением, но обнаружил, что ради простого входа и выхода приходится постоянно открывать социальную ленту. После тренировки приложение предлагает опубликовать story, а главный экран заполнен selfies других посетителей. Поскольку автор более 12 лет не пользуется соцсетями и систематически блокирует feeds, рекламу и рекомендации, он решил выделить только функцию QR-пропуска.

Код на экране менялся каждые 15 секунд, а создание screenshots было заблокировано Android FLAG_SECURE. При отключении Wi-Fi приложение сообщило, что коды ещё несколько дней будут действовать без повторного подключения. Это подсказало локальную генерацию вместо обязательного обращения к серверу при каждом входе.

Исследование проводилось с помощью LLM и инструментов анализа Flutter и Android. Автор сравнил GLM 5.3 с DeepSeek v4.1 Flash: по его оценке, первый расходовал в 10–20 раз больше средств на токены без соответствующего прогресса, а второй двигался быстрее. При этом подсказки человека о более простом устройстве алгоритма помогали модели менять неверное направление. Название спортзала и часть технических деталей намеренно скрыты, чтобы сохранить анонимность и не рисковать абонементом.

В результате выяснилось, что QR содержит URL с идентификатором аккаунта, зашифрованным сроком действия, случайным nonce и checksum. Для работы собственного генератора требовались секреты аккаунта. Их удалось получить при анализе устройства, после чего автор построил SvelteKit web app с WebCrypto.

Процесс выявил несколько ошибок реализации. В частности, собственный AES проходил внутренние round-trip-тесты, но обе стороны повторяли одну и ту же ошибку. Сверка с WebCrypto, OpenSSL и известными test vectors показала несовпадение. Финальную проверку провели против оригинального приложения: при одинаковых входных данных URL совпал побайтно, а QR независимо декодировался в правильную ссылку.

Прототип успешно сработал на турникете при check-in и check-out. Он не заменяет полноценный вход в аккаунт и требует обновления ключей при их ротации, но решает личную задачу автора: показать проход без навязанной социальной ленты.

Читать оригинал →