c++ - 我如何测试我的谷歌验证器的实现?

标签 c++ windows testing implementation google-authenticator

我已经按照此处所述编写了 google 身份验证器的实现:https://en.wikipedia.org/wiki/Google_Authenticator

现在我唯一的问题是:如何检查我的程序生成的 6 位代码是否正确?我无法在谷歌本身为开发人员找到任何网络演示。我在网上的其他地方找到了这些:

https://2fa.glitch.me/

http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/

我的代码不同意这些。第一个可能使用了错误的时间。我不知道第二个。网上有这样一个已知正确的实现吗?

我的实现使用 32 位 unix 时间作为消息。我已经与网络上的资源核对过我生成的时间是正确的。我记得使用big endian。我检查了我的 hmac_sha1 函数,它是正确的。生成的散列为 20 字节。据我了解,最后一个字节的低位半字节是偏移量,对吗?然后截断的散列是从该偏移量开始的 4 个字节,被解释为 bigendian 32 位整数,尽管 MSB 为零。我对吗?最后你使用这个模数 100 万作为 6 位十进制整数,是吗?

key 以 base32 字符串的形式输入,必须进行解码。我检查过我的解码函数是正确的。

我做错了什么?或者也许我没有做错什么?如何查明?我可以在 google 上开一个账户,并将其配置为使用 2FA,然后看看我是否可以使用我自己的密码等登录,但这非常乏味,如果我的密码有误,我很快就会被屏蔽。

最佳答案

我发现了我的一个错误并更正了我的代码与这里的代码一致:

https://2fa.glitch.me/

所以我可以确认这些代码是正确的。如果我们的一个或两个实现包含错误,他和我的代码达成一致的可能性几乎为零,因此在线实现可能被视为权威实现。其他人都可以根据它检查他们的程序。

我的错误是将 Unix 时间视为 32 位数量。在此应用程序中,它必须被视为 64 位 1(大端),即从 MSB 开始的 8 个字节。

关于c++ - 我如何测试我的谷歌验证器的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58999161/

相关文章:

在我关闭程序之前,C++ 文件夹不会删除

java - Gradle 'error: package com.google.common.collect does not exist'

c++ - int a[] = {1,2,};为什么允许在初始化列表中使用尾随逗号?

c++ - Ofstream 在 Windows 临时目录中创建一个文件

c++ - 在单头文件、静态库和共享库之间链接 boost 库的哪种用法变体更好?

windows - Windows 上的 Qt DLL 部署

unit-testing - 自动布局测试

unit-testing - Dart:如何测试流是否在特定时间发出元素?

c++ - CMake:尝试在 Jenkins Build Machine 上运行时出现 "Linked Library"错误(0xc0000135)

c++ - 用一行代码替换字符串中所有句点的 C++ 方法?