如何在基于hmac的一次性密码实现中保证客户端和服务器之间的计数器同步?

时间:2013-03-21 17:27:10

标签: hmac one-time-password

我们正在尝试实施基于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

这很好用。由于计数器,每次通话都是完全唯一的(一次)。

但是我们如何处理计数器的同步?如果客户端生成请求,递增计数器以进行下一次调用,并发送请求,但服务器处于脱机状态且从未收到请求,或者存在Internet连接问题且请求永远不会通过 - 现在服务器并且客户与彼此的柜台不同步。

这是“您应该知道是否已提交请求”的情况?即我们可以从服务器添加一个响应头来说明计数器是否已经递增,而只有在它已经我们在应用程序中递增计数器 ...但是同样可以说另一个方式 - 我们可以发送请求,服务器接收它,增加自己的计数器并发送响应,但互联网连接已被中断,而服务器正在处理其请求,应用程序从未收到响应,从不增加其计数器和因此两者再次不同步。

感谢您给我的任何见解。

1 个答案:

答案 0 :(得分:1)

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