我正在从一个应用程序到另一个应用程序进行API调用。我处理授权通过传递md5
版共享的秘密+时间戳...如何通过可靠的时间戳传递API令牌
$token = md5($secret . time());
然后在API端点,我检查这样的请求的真实性...
if (md5($shared_secret . time()) == $token)
...do stuff
这工作。但它不如我想要的那么可靠。我怀疑这是由于网络延迟(或者我的速度慢的本地主机服务器)导致时间戳一秒钟左右不匹配。
我通过删除时间戳的最后一位数字,以一种懒惰的方式解决了这个问题,从而为我的缓存服务器创建了长达10秒的窗口来进行呼叫。不过,我对此并不满意,因为如果这次电话会在第9秒的末尾落下,我会再次遇到相同的问题(发送####### 49!=在##处收到###### 50)。
必须有更好的方法来做到这一点。它是什么?
你是完全正确的。我忘了发送纯文本的时间戳!这正是我过去做过的事情,我只是简单地忘记了。我很想知道更多关于你对MAC和md5的看法。为什么MD5是一个糟糕的选择? (顺便说一下,我使用PHP) – emersonthis
[扩展长度攻击](https://en.wikipedia.org/wiki/Length_extension_attack)是这个问题的构造问题。例如,根据时间格式和/或接收者解释时间的灵活程度,攻击者可能能够使用令牌在未来创建新的令牌,并通过接收者的验证。 PHP有一个[HMAC实现](http://php.net/manual/en/function.hash-hmac.php)。 HMAC在与md5一起使用时被认为是安全的,但除非你有特别的理由使用md5,否则我建议sha256。 – Michael
PHP HMAC非常值得了解。但是,我不是100%确定如何将其应用于我的情况,因为我没有发送任何加密数据。只是共享的秘密+时间戳。那么这个'hmac('md5','foobar',$ secret)是一个比简单的'md5($ secret)'更好的标志吗?或者也许它们是等价的,'hmac'的优点是可以使用sha256吗? – emersonthis