oathtool никогда не согласуется с Google Authenticator

oathtool никогда не согласуется с Google Authenticator

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

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

Я подозревал, что это проблема синхронизации времени, но после ручной синхронизации времени 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.

решение1

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

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

Для HMAC есть 2 входа, число и секрет. В TOTP число — это количество временных интервалов от эпохи, значения по умолчанию для обоих oathtoolи 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".

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

решение2

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

secret=`echo 1234567812345678 | base32`
oathtool -v --totp -b $secret
qrencode -t ANSI "otpauth://totp/test?secret="${secret}""

Связанный контент