我正在从一个应用程序到另一个应用程序进行API调用。我通过传递md5ed共享密钥+时间戳来处理授权…
$ token = md5($ secret.time());然后在API端点,我检查…
使用现时代替?将nonce保存到DB或某个持久存储中以确保不使用相同的存储。
与你的“第9个问题”相反,你有一个类似的问题,秒### ... 0到### ... 9当你切掉尾随的0到9时,它们会散列到相同的值。这将允许重放10秒的时间框架。
这似乎是保证/检查真实性的更多问题。
您必须将明文和散列文本一起发送给服务器以进行检查,但这似乎比时间戳方法好一些。
无论哪种方式,仅使用这两个参数,您只需检查它不是重复请求,而不是验证任何内容。
使用时间戳不是正确的方法,因为跨系统的时间不可靠。也许你可以使用消息的长度/哈希作为参数。遗憾的是,它不会阻止攻击者播放。
如果我错了,请纠正我,但似乎你正在处理身份验证(即发件人是他们所说的人),而不是授权。我建议您使用SSL / TLS来保护传输,以了解传输是否正在被代理。
考虑使用 token = time || MAC(time, shared_secret) 在哪里||是串联,MAC是一种消息认证算法,如HMAC,它接受一个秘密密钥和一些数据,并产生一个认证标签。在服务器端,检查MAC是否有效,时间(以明文收到)是否在可接受的窗口内。
token = time || MAC(time, shared_secret)
这比您当前的解决方案更安全(md5使得MAC很差)并且还解决了您的窗口问题。
请注意,此方案容易受到您允许的错误窗口内的重放攻击(例如,同一令牌可能会在一秒窗口中发送十次,并且服务器无法告知)。