我们正在尝试实现一种基于 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
这工作正常。由于计数器,每个调用都是完全唯一的(一次)。
但是,我们将如何处理计数器的同步?如果客户端生成请求,为下一次调用增加计数器并发送请求,但服务器处于脱机状态并且从未接收到请求,或者存在互联网连接问题并且请求从未通过 - 现在服务器并且客户端与彼此的计数器不同步。
这是“您应该知道是否已提交请求”的情况吗?即我们可以从服务器添加一个响应标头来说明计数器是否已增加,并且只有当它增加时,我们才会在应用程序中增加计数器......但同样可以反过来说 - 我们可以发送一个请求,服务器接收到它,增加它自己的计数器并发送一个响应,但是在服务器处理它的请求时互联网连接已经中断,并且应用程序永远不会收到响应,永远不会增加它的计数器,因此两者都超出了再次同步。
感谢您能给我的任何见解。