oathtool 绝不同意 Google Authenticator

oathtool 绝不同意 Google Authenticator

我目前使用 Google Authenticator 进行 2FA,例如连接到 VPN 等。我想看看我是否可以在我的 OSX 机器上获取六位数代码,但出于某种原因,它oathtool永远不会返回与 Authenticator 相同的值。而且 Authenticator 代码有效,而 Authenticator 代码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 用于生成二维码的值相同。)

这些不一致的原因是什么?

更新

我尝试使用以下方法摆弄系统时间左右各 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 中,数字是从一个纪元开始的时间间隔数,TOTPoathtool和 GA 的默认值均为 30 秒间隔(“时间步长”大小),1970-01-01 00:00:00 UTC。明确地说,oathtool只要参数一致,TOTP 和 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}""

相关内容