Присяга никогда не соглашается с Google Authenticator

В настоящее время я использую Google Authenticator для 2FA, например, для подключения к VPN и т. Д. Я хотел посмотреть, смогу ли я получить шестизначный код на своем компьютере с OSX, но по какой-то причине oathtool никогда не возвращает то же значение, что и Authenticator. И код аутентификатора работает, oathtool никто не

Интересно, что я также пробовал в симуляторе iOS с https://github.com/mattrubin/Authenticator в той же системе, и код, который он производит, согласуется с oathtool а не Аутентификатор.

Я подозревал, что, возможно, это проблема синхронизации времени, но после ручной синхронизации времени OSX код остается прежним. Мне интересно, могут ли быть параметры по умолчанию в алгоритме TOTP, которые не совпадают, но я не знаю, какими они будут.

oathtool команда выводит что-то вроде следующего

% oathtool --verbose --base32 --totp "$SECRET"
Hex secret: ...
Base32 secret: ...
Digits: 6
Window size: 0
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2016-10-20 22:27:22 UTC (1477002442)
Counter: 0x2EF3E06 (49233414)

(Заметка, $SECRET Выше приведено то же значение, которое использовалось для генерации QR-кода, используемого Authenticator.)

Любая причина, почему они не согласятся?

Обновить

Я попытался поиграть со временем 30 секунд по обе стороны от времени моей системы, используя

oathtool --now "$(perl -e'use DateTime; print DateTime->now()->subtract(seconds=>30)->strftime( "%Y-%m-%d %H:%M:%S %Z" )')" -b --totp $SECRET -w 20|sort

Perl выше генерирует время в формате

2016-10-20 23:36:15 UTC

Я также выводил 20 чисел каждый раз, но ни одно из них не соответствовало тому, что есть в Authenticator.

2 ответа

Поскольку поиск по запросу «Google Authenticator oathtool» приводит вас сюда, а ответ частично находится в комментариях, для удобства и полноты...

и Google Authenticator являются реализациями RFC 6238 TOTP. TOTP выдает 6-значный вывод, используя HMAC. Хотя официальный клиент Android больше не является открытым исходным кодом, это не потому, что реализация TOTP изменилась или является «секретной».

Есть 2 входа для HMAC: номер и секрет. В TOTP число представляет собой количество временных интервалов из эпохи, значения по умолчанию для обоих и GA составляют 30-секундные интервалы (размер временного шага) и 1970-01-01 00:00:00 UTC. Чтобы внести ясность,oathtoolи GA согласится, если параметры совпадают: эпоха и время должны быть достаточно близки, а временной шаг и секрет должны совпадать.

При необходимости (например, некоторые аппаратные токены TOTP используют 60-секундный интервал) вы можете использовать-sчтобы установить размер интервала и учесть смещение/дрейф, вы можете переопределить то, что oathtool считает «сейчас» (или подделать эпоху).

Для устранения неполадок полезно следующее:

      oathtool -v --now  "now -30 minutes" -w 120 --totp $SECRET

Для 30-секундного интервала будут созданы значения за полный час, от 30 минут назад до 30 минут в будущем. Из этого вы можете вывести смещение токена или смещение часов (diff -yпараллельное сравнение результатов может оказаться полезным). TOTP использует «время unix», поэтому часовые пояса не должны быть проблемой, если только часовой пояс не «скрывает» какое-то большое смещение неправильных часов.

--nowи--epochиспользовать надежный анализатор даты и времени GNU и поддерживать спецификации относительного времени, а также абсолютные метки времени,--now "30 min ago"тоже работает.

Как определил ОП, для эпохи и временного шага по умолчанию, если время правильное, то это должен быть секрет, который неверен.

Я синхронизировал Google Authenticator и oathtool:

      secret=`echo 1234567812345678 | base32`
oathtool -v --totp -b $secret
qrencode -t ANSI "otpauth://totp/test?secret="${secret}""
Другие вопросы по тегам