【发布时间】:2016-06-01 22:22:45
【问题描述】:
我已经在 vbscript 中实现了这个http://jacob.jkrall.net/totp/。
我的代码给出了相同的十六进制,给出了正确的 6 位 otp,所以这部分工作正常。
我还验证了 HMAC-SHA-1。针对在线生成器http://www.freeformatter.com/hmac-generator.html#ad-output 进行编码,相同的输入给出相同的输出。
我的时间和http://www.currenttimestamp.com/一样
我已经在http://www.qr-koder.dk/ 生成了一个带有字符串 otpauth://totp/$LABEL?secret=$SECRET 的二维码,谷歌身份验证器应用程序读取该代码并开始输出每 30 秒更改一次的 6 位数代码。
但来自应用程序的代码与 VBScript 生成的 6 位代码不匹配!
我什至尝试了 trunc(time/30) +/-7500 步来查看是否是时区/夏令时问题,但无济于事。
由于生成 6 位数的例程的其他部分似乎有效,我得出的结论是我不明白这一点:
二维码上的网址是
otpauth://totp/$LABEL?secret=$SECRET
有解释
LABEL 可用于描述应用中的密钥,而 SECRET 是 16 个字符的 base32 编码的共享密钥,现在双方都知道 客户端和服务器。
所以当我计算 HMAC-SHA-1(SECRET, time()/30)
SECRET 是否应该与应用程序和计算的字符串相同?
如果我选择1234567890的秘密,根据http://emn178.github.io/online-tools/base32_encode.html,base32是GEZDGNBVGY3TQOJQ。
那我该不该吃
HMAC-SHA-1("1234567890", time()/30)
或
HMAC-SHA-1("GEZDGNBVGY3TQOJQ", time()/30)
?
我相信我都试过了,但都不管用。
【问题讨论】: