Google Authenticator

20.02.2023


Google Authenticator — приложение для двухэтапной аутентификации с помощью Time-based One-time Password Algorithm (TOTP) и HMAC-based One-time Password Algorithm (HOTP) от Google LLC. Сервис реализует алгоритмы, указанные в RFC 6238 и RFC 4226.

Authenticator представляет 6- или 8-значный одноразовый цифровой пароль, который пользователь должен предоставить в дополнение к имени пользователя и пароля, чтобы войти в службы Google или других сервисов. Authenticator также может генерировать коды для сторонних приложений, такие как менеджеры паролей или услуг хостинга файлов. Предыдущие версии программы были доступны с открытым исходным кодом на GitHub, но последние выпуски являются частной собственностью Google.

Пример использования

Как правило, пользователи должны сначала установить приложение на своё мобильное устройство. Для того, чтобы войти на сайт или воспользоваться услугами сервиса, требуется ввести имя пользователя и пароль, запустить приложение Authenticator и ввести в специальное поле сгенерированный одноразовый пароль.

Для этого сайт предоставляет общий секретный ключ пользователю, который должен быть сохранен в приложение Google Authenticator. Этот секретный ключ будет использоваться для всех будущих входов на сайт.

С двухэтапной аутентификацией простое знание логина/пароля не является достаточным для взлома учётной записи. Злоумышленник также должен знать секретный ключ или иметь физический доступ к устройству с Google Authenticator. Альтернативным путем является MITM-атака: если компьютер пользователя заражен трояном, то имя пользователя, пароль и одноразовый код могут быть перехвачены, чтобы затем инициировать свой собственный сеанс входа на сайте или отслеживать и изменять информацию между пользователем и сайтом.

Реализации

Google Authenticator представлен на Android, BlackBerry, и iOS. Также доступно несколько сторонних реализаций:

  • Windows Phone 7.5/8/8.1/10: Microsoft Authenticator Virtual TokenFactor
  • Windows Mobile: Google Authenticator for Windows Mobile
  • Java CLI: Authenticator.jar
  • Java GUI: JAuth FXAuth
  • J2ME: gauthj2me lwuitgauthj2me Mobile-OTP (Chinese only) totp-me
  • Palm OS: gauthj2me
  • Python: onetimepass
  • PHP: GoogleAuthenticator.php
  • Ruby: rotp, twofu
  • Rails: active_model_otp (third party implementation)
  • webOS: GAuth
  • Windows: gauth4win MOS Authenticator WinAuth
  • .NET: TwoStepsAuthenticator
  • HTML5: html5-google-authenticator
  • MeeGo/Harmattan (Nokia N9): GAuth
  • Sailfish OS: SGAuth, SailOTP
  • Apache: Google Authenticator Apache Module
  • PAM: Google Pluggable Authentication Module oauth-pam
  • Backend: LinOTP (Management Backend implemented in python)
  • Chrome/Chrome OS: Authenticator
  • iOS: OTP Auth

Техническое описание

Поставщик услуг генерирует 80-битный секретный ключ для каждого пользователя (хотя RFC 4226 § 4 требует минимум 128 бит и рекомендует 160 бит). Ключ предоставляется в виде 16-, 26-, 32-значной строки в кодировке Base32 или в виде QR-кода. С помощью секретного ключа клиент создает HMAC-SHA1 от:

  • количества 30-секундных интервалов с начала «эры UNIX» для варианта TOTP
  • счётчика, который увеличивается с каждым новым кодом для варианта HOTP.

Затем часть HMAC извлекается и преобразуется в 6-значный код.

Псевдокод для Time-based OTP

function GoogleAuthenticatorCode(string secret) // based on RFC 4226 key := base32decode(secret) // key: array of uint8 message := htobe64(current Unix time / 30) // message: uint64, make it big-endian hash := HMAC-SHA1(key, message) // hash: array of uint8 offset := last nibble of hash // offset := hash[hash.size() - 1] & 0x0F truncatedHash := (hash[offset] << 24) | (hash[offset+1] << 16) // truncatedHash: uint32 big-endian | (hash[offset+2] << 8) | hash[offset+3] truncatedHash = truncatedHash & 0x7FFFFFFF // reset MSB code := truncatedHash mod 1000000 pad code with 0 until length of code is 6 return code // code: string

Псевдокод для Event/Counter OTP

function GoogleAuthenticatorCode(string secret) key := base32decode(secret) message := counter encoded on 8 bytes hash := HMAC-SHA1(key, message) offset := last nibble of hash truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset Set the first bit of truncatedHash to zero //remove the most significant bit code := truncatedHash mod 1000000 pad code with 0 until length of code is 6 return code

Перенос аккаунтов

Пользователи могут выбрать, какие учетные записи экспортировать, а затем, после проверки с помощью ввода ПИН-кода устройства или биометрической аутентификации, отобразить QR-код, который может быть отсканирован другим телефоном с помощью Authenticator в режиме импорта.