我在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/生成了一个qrcode,其字符串为otpauth:// totp / $ LABEL?secret = $ SECRET,google身份验证器应用程序读取代码并开始输出每30秒更改一次的6位数代码
但APP中的代码与6个数字代码不符合VBSCRIPT代码!
我甚至尝试过截断(时间/ 30)+/- 7500步,看看它是否是时区/夏令时问题,但无济于事。
由于生成6位数的例程的其他部分似乎有效,我得出结论我不明白这一点:
qr-code上的url是
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)
我相信我已经尝试了两种,但都没有效果。
答案 0 :(得分:1)
系统unix时间正确。
我想问题可能在于您的HMAC-SHA-1功能中的秘密。这在很大程度上取决于HMAC-SHA-1的预期。
您的字符串“123456790”可能是二进制字符串。它是ascii表示还是utf8?即这个字符串是10个字节还是20个字节长?
我建议您在VBScript中获取输入字符串。
另一方面,除了编写自己的VBScript之外,您还可以使用现成的解决方案,例如privacyIDEA身份验证服务器,它是开源的,也带有TOTP。