Один секрет — два независимых расчёта
Чтобы приложение могло создавать коды офлайн, при настройке учётной записи оно получает секретный ключ. Такой же ключ хранится на сервере. Это не очередной код для входа, а общий секрет, который стороны используют для вычислений и не должны раскрывать посторонним.
Телефон и сервер берут этот ключ и текущее время, затем обрабатывают их по одному и тому же алгоритму. Из результата получают короткое число — часто шесть цифр. Серверу не нужно заранее генерировать код и отправлять его телефону: приложение рассчитывает значение само.
Почему цифры меняются и что проверяет сервер
Время делят на короткие интервалы. Для каждого интервала получается новый код, поэтому случайно подсмотренные цифры вскоре перестают подходить. Когда пользователь вводит код, сервер выполняет тот же расчёт и сравнивает результат. Чтобы небольшое расхождение часов не мешало входу, сервер может принимать коды для соседних временных интервалов.
Именно поэтому точность часов важна: если время на телефоне заметно сбилось, приложение и сервер могут рассчитать разные числа, хотя общий ключ у них совпадает. А сам код не доказывает серверу, что телефон был в сети; он лишь показывает, что приложение располагает секретом и его часы достаточно близки к серверным.
Офлайн-код — не офлайн-вход
Отсутствие связи нужно только для вычисления цифр. Чтобы войти в интернет-сервис, телефону всё равно потребуется отправить код серверу — например, через мобильную сеть или Wi‑Fi. Если подключиться сейчас нельзя, код можно получить заранее, но проверить его сервер сможет лишь после того, как запрос до него дойдёт.
Такой способ превращает телефон в небольшой автономный генератор: серверу достаточно хранить секрет и проверять поступившее значение, а приложению — иметь доступ к ключу и более-менее точным часам.






