我正在实施REST API身份验证系统。
我基本上使用本网站解释的方法:
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
基本上它使用请求体来创建哈希,将其与实际请求一起发送到服务器,服务器重新创建并比较它,以及什么不是......
我不打算详细解释。重要的是我正在使用时间戳以防止“重播攻击”。
从网站上引用,它解释道:
将当前服务器的时间戳与客户端发送的时间戳进行比较。确保两个时间戳之间的差异在可接受的时间限制内(可能是5-15分钟),以阻止重播攻击。
我现在面临的问题是如果客户端的时钟设置被修改,可能会导致意外的API身份验证失败,因为时间戳因客户端和服务器而异。
有没有办法解决这个问题?我是否必须放弃使用时间戳?
如果有人能帮我解决这个时间戳问题,或者我可以阻止重播攻击的任何其他方式,我将非常感激。
注意:我知道向客户端发布一个nonce是一种防止“重放攻击”的好方法,但我想把它作为我的最后手段,因为创建一个实现成本nonce-issuing-API和管理nonce的后端太大了。
答案 0 :(得分:2)
将服务器的时间戳与客户端发送的时间戳进行比较时,它不必是客户端时间戳,而是服务器发送给客户端的前一个时间戳。 你永远不能依赖客户自己的时间戳,因为它可能是任何东西,或者它可能在世界的另一端。
当客户端第一次连接到服务器时,服务器可以自己回复时间戳并存储在客户端上,下次客户端必须发送最后一个时间戳。
答案 1 :(得分:0)
我认为您希望时间戳为UTC时间,因为更新的文章表明了这一点。
答案 2 :(得分:0)
Store your times as UTC, which is the number of seconds since the unix epoch.
使用时间和日期格式显示您的时间字段以反映用户的时区