Подкаст про одноразовые коды: OTP, TOTP, HOTP
Здарова, народ!
Второй выпуск подкаста GoLang Awesome и вторая его расшифровка. Сегодня поговорим про технологию генерации одноразовых кодов. Что, есть какая-то технология?! Да, и даже целый стандарт!
Наверняка на вашем смартфоне установлено приложение Google Authenticator или любое другое, которое формирует некий числовой код, который обновляется раз в 10 секунд. Никогда не задумывались, как формируются и как формировать самим эти одноразовые коды? Сейчас расскажу.
OTP код – это одноразовый пароль или One-Time Password. По факту это алгоритм, который в свою очередь имеет расширение TOTP – одноразовый пароль, основанный на времени, или Time-Based One Time Password; и HOTP – одноразовый пароль, основанный на специальном счётчике. Много непонятных слов, понимаю, но сейчас станет понятнее.
И HOTP и TOTP работают за счёт формирования хеша на основе некоторых данных. В эти данные всегда входит некоторый ключ или секрет. А вот вторая часть отличается в зависимости от конкретной реализации.
HOTP
В случае с HOTP второй переменной является некий счётчик, который инкрементируется при каждой генерации кода. В приложении аутентификации новый генерируется только тогда, когда вы нажимаете кнопку “обновить”. При этом увеличивается счётчик, и, конечно, этот счётчик должен быть засинхронизирован между сервером и клиентом.
А что произойдёт, если вы случайно в приложении кодов сгенерируете несколько новых комбинаций без реальной попытки логина? Ведь счётчик на вашем телефоне будет больше, чем на сервере. Неужели с этого момента авторизоваться не удастся?
К счастью, удастся. Когда сервер поймёт, что введённый код не подходит, он попробует несколько раз увеличить у себя счётчик, то есть уйдёт “вперёд”, и рано или поздно наткнётся на актуальное состояние.
А если вы с десяток раз сгенерируете код на телефоне? Всё равно, скорее всего, всё будет нормально. А вот если вы на сотню попыток уйдёте вперёд, то вот тут сервер уже не дойдёт до актуального значения счётчика, потому что обычно производится не больше 80-100 попыток. В этой рассинхронизации и заключается основной минус HOTP. И в дело вступает TOTP.
TOTP
TOTP, как я уже сказал, – это одноразовый код, основанный на времени. Вместо некоего счётчика как раз и используется время. При этом используется интервал либо 30, либо 60 секунд.
Получается, в случае с TOTP проблема может появиться только в случае рассинхронизации времени на сервере и клиенте, что, согласитесь, довольно редкий кейс. И в этом его первое преимущество над HOTP. А второе, более важное преимущество: TOTP коды имеют ограниченное время действия, как раз вот эти 30 или 60 секунд.
Но когда HOTP коды могут быть более правильным выбором?
Когда вы не можете гарантировать, что код удастся получить и ввести в течение заданного периода времени. Например, вы отправляете одноразовый код в SMS, и тут уже куча неизвестных:
- насколько загружен SMS шлюз?
- насколько хороший сигнал у клиента?
- как много времени нужно, чтобы получить и затем ввести код?
А как работать с OTP кодами на Go?
С помощью двух библиотек-героинь этого выпуска!
Библиотека otpgo – целый набор функционала для работы с OTP кодами. Тут вы сможете работать с обоими типами кодов: и с HOTP, и с TOTP. Причём вы сможете и генерировать, и верифицировать коды, и экспортировать конфиг для Google Authenticator, и формировать привычный QR код.
Словом, библиотека “всё в одном”, на базе которой и клиентскую часть можно построить, и серверную со всеми проверками. Также у optgo можно найти много примеров в репозитории. Звёздочек здесь 45, а последний коммит хоть и был почти два года назад, но и алгоритм достаточно простой, чтобы часто что-то менять.
Что касается otpgen: если вам достаточно лишь генерировать одноразовые коды, то optgen – ваш выбор. Весь полезный код библиотеки умещается всего в 130 строчек. Последний апдейт был полтора назад, а звёздочек тут 121.
Спасибо, что читали/слушали/смотрели, а я по-прежнему напоминаю, что в Telegram канале есть версия без видеоряда.