oathtool 從來不同​​意 Google Authenticator

oathtool 從來不同​​意 Google Authenticator

我目前使用 Google Authenticator 進行 2FA,例如連接 VPN 等oathtool。驗證器代碼可以工作,而驗證器oathtool代碼則不能。

有趣的是,我也嘗試過在 iOS 模擬器中使用https://github.com/mattrubin/Authenticator在同一系統上,它產生的程式碼與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上面的值與 Authenticator 使用的用於產生 QR 碼的值相同。)

這些人有什麼理由不同意嗎?

更新

我嘗試使用以下命令來擺弄系統時間兩側的 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。 TOTP 使用 HMAC 產生 6 位元數位輸出。儘管官方 Android 用戶端不再開源,但這並不是因為 TOTP 實作已更改或「保密」。

HMAC 有 2 個輸入:一個數字和一個秘密。在 TOTP 中,數字是來自一個紀元的時間間隔計數,GAoathtool和 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"也可以。

正如OP所確定的,對於預設的紀元和時間步長,如果時間正確,那麼它一定是不正確的秘密。

答案2

我同步了 Google Authenticator 和 oathtool:

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

相關內容