【问题标题】:How to guarantee counter synchronisation between client and server for counter in hmac-based one time password implementation?基于hmac的一次性密码实现中如何保证客户端和服务器之间的计数器同步?
【发布时间】:2013-03-21 17:27:10
【问题描述】:

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

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

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

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

感谢您提供的任何见解。

【问题讨论】:

    标签: hmac one-time-password


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多