我已按照以下说明编写了Google身份验证器的实现:https://en.wikipedia.org/wiki/Google_Authenticator
现在我唯一的问题是:如何检查我的程序生成的6位代码是否正确?我还没有在Google本身找到任何针对开发人员的网络演示。在网上的其他地方,我发现了这些信息:
http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/
我的代码与这些都不相同。第一个可能使用了错误的时间。我不知道第二个。是否有这样的在线实施方式是正确的?
我的实现使用32位unix时间作为消息。我已与网络上的来源核实,我生成的时间是正确的。我记得使用大端字节。我已经检查了我的hmac_sha1函数,它是正确的。生成的哈希为20个字节。据我了解,最后一个字节的低位半字节是偏移量,对吗?然后,被截断的哈希是从该偏移量开始的4个字节,尽管MSB为零,也被解释为32位的bigendian整数。我对吗?最终,您将此模100万用作6位十进制整数,是吗?
密钥作为base32字符串输入,必须进行解码。我检查了我的解码功能是否正确。
我做错了什么?也许我没有做错任何事?如何找出?我可以在Google上开设一个帐户,并将其配置为使用2FA,然后查看是否可以使用自己的密码登录,但是这非常繁琐,如果我的密码错误,我很快就会被屏蔽。
答案 0 :(得分:1)
我发现了我的一个错误,经过更正后,我的代码与此处的代码一致:
所以我可以确认这些代码是正确的。他和我的代码同意我们的实现中的一个或两个都包含错误的可能性实际上为零,因此在线实现可以视为权威性的。其他人都可以对照它检查他们的程序。
我的错误是将Unix时间视为32位数量。在此应用中,必须将其视为64位1(大字节序),即从MSB开始的8个字节。