【发布时间】: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。我们可以从服务器添加一个响应标头来说明计数器是否已增加,并且只有在它增加的情况下,我们才会在应用程序中增加计数器...但同样可以说另一个绕路 - 我们可以发送一个请求,服务器接收到它,增加它自己的计数器并发送一个响应,但是在服务器处理它的请求时互联网连接已经中断,应用程序永远不会收到响应,永远不会增加它的计数器和因此两者又不同步了。
感谢您提供的任何见解。
【问题讨论】: