Authentication 具有时间戳和异步客户端的请求身份验证最佳实践

Authentication 具有时间戳和异步客户端的请求身份验证最佳实践,authentication,asynchronous,go,Authentication,Asynchronous,Go,我有一个用Go编写的restfulapi。我想验证每个请求。为此,服务器和客户端共享一个秘密 为了验证对/foo/bar/的GET请求,客户端向url添加一个带有时间戳的nonce参数,/foo/bar/?nonce=1389932199128265,然后向url添加带有密码的数据的hmac。它给出了类似于/foo/bar/?nonce=1389932199128265&hmac=hd7nd7s9s702j 为了验证传入请求的有效性,服务器验证在时间戳之后没有来自客户端的请求到达,并且hmac有

我有一个用Go编写的restfulapi。我想验证每个请求。为此,服务器和客户端共享一个秘密

为了验证对
/foo/bar/
的GET请求,客户端向url添加一个带有时间戳的nonce参数,
/foo/bar/?nonce=1389932199128265
,然后向url添加带有密码的数据的hmac。它给出了类似于
/foo/bar/?nonce=1389932199128265&hmac=hd7nd7s9s702j

为了验证传入请求的有效性,服务器验证在时间戳之后没有来自客户端的请求到达,并且hmac有效

我相信这是验证请求的常用方法。例如,mtgox使用类似的过程

我遇到的问题是,我的客户机可能同时需要一个URL列表[url1,…urln]。在这种情况下,无法保证客户端发送的第一个请求将首先到达服务器。实际上,请求的任何排列都将导致403个错误

我的第一个问题很简单:这真的是个问题吗?请求订单是否可能在运输过程中发生变化

第二,验证没有403错误发生是否完全取决于客户机

有更好的方法吗


非常感谢

是的,这是你会遇到的一个真正的问题。你能做的是允许一个最大的n个无序的请求(我选择了5个,当我实现这一点时),并且保留一些从客户端接收的最后请求ID的列表,以确保在那个窗口内没有重放请求。@ NojyaaGliFER你会认为丢弃GET上的时间不是一个坏的做法,而是在POST上使用它。(和其他动词)?这是我现在正在考虑的一个解决方案。这实际上取决于您的需要。我通常构建的API对GET和post的作用相同,但我确实为不同的调用设置了不同的身份验证级别。如果您放宽时间要求,允许客户端请求中的时间戳在服务器的tim前后1分钟内,该怎么办e?在提供大量无序请求的情况下,这仍然会使用蛮力强制密码来进行重播攻击,这几乎是不可行的。事实上,我不想强制客户端使用实时戳。在每次请求时增加一个整数就足够了。这是对抗应答攻击的技术。作为解决方案,我将使用将我的api分为两个安全级别。低安全级别不需要时间戳。高安全级别是。在我的情况下,将使用分隔。但这只是因为它在我的api结构中有意义