0

我们正在尝试实现一种基于 hmac 的一次性密码协议,以便通过我们的 api 对用户进行身份验证。

这个想法是针对私钥和增量计数器加密用户的唯一标识符(uid)。然后为下一次调用增加计数器。

encrypt(uid, private_key, counter)
# now increment the counter for the next call

然后在服务器端,使用私钥和计数器解密,得到用户标识符(uid)。

decrypt(encrpyted_string, private_key, counter)
# now increment the counter for the next received request

这工作正常。由于计数器,每个调用都是完全唯一的(一次)。

但是,我们将如何处理计数器的同步?如果客户端生成请求,为下一次调用增加计数器并发送请求,但服务器处于脱机状态并且从未接收到请求,或者存在互联网连接问题并且请求从未通过 - 现在服务器并且客户端与彼此的计数器不同步。

这是“您应该知道是否已提交请求”的情况吗?即我们可以从服务器添加一个响应标头来说明计数器是否已增加,并且只有当它增加时,我们才会在应用程序中增加计数器......但同样可以反过来说 - 我们可以发送一个请求,服务器接收到它,增加它自己的计数器并发送一个响应,但是在服务器处理它的请求时互联网连接已经中断,并且应用程序永远不会收到响应,永远不会增加它的计数器,因此两者都超出了再次同步。

感谢您能给我的任何见解。

4

1 回答 1

1

要在服务器和客户端之间同步计数器,只需检查一些 OTP 范围。如果客户端为当前计数器发送 OTP - 一切正常,则无事可做,如果客户端在当前计数器附近(~15)的某个范围内发送 OTP - 这意味着该客户端可以通过身份验证,但您需要更新服务器上的计数器. 在出现严重不同步的情况下,您应该询问两个一致的 OTP,并检查它们在各种计数器上是否正确。如果是 - 将您的服务器计数器设置为建立值。

于 2013-09-10T13:53:33.030 回答