繁体   English   中英

防止请求重放攻击

[英]Preventing request replay attack

我有一个简单的 REST API 并防止请求重放攻击。 我在请求中添加了一个 UTC 时间戳,如果秒差不超过 60 秒,则允许请求。

此 API 由 Android 和 iOS 应用程序使用。 将应用程序投入生产后,我们意识到大多数用户的时间和时区不准确,这使他们无法使用该应用程序。

如何改善缓解?

无论手机的时间和时区如何,我都有机会获得 UTC 时间吗?

您不应依赖设备发送的时间戳,因为它可能很容易被篡改。

如果(且仅当)您能够识别来自同一用户或设备的请求,那么您可以使用服务器上的时间戳并执行相同的缓解策略,但这次您有一个统一的时间度量。 (您需要在每个用户或每个设备的基础上保存“最后”访问时间戳。)

A way to identify an user or a device can be that of creating a hash of (eg time of first run + IP address +...) the first time of use, and send that along the REST API request all the subsequent times. 如果用户需要登录,那么您可以将此值与用户信息一起保存; 否则,您可以类似地“识别”设备。

编辑:此编辑根据您的评论添加了以前不清楚的信息

我想检查请求的发起时间和服务器上的接收时间是否不应该有很大的间隔(比如超过 1 分钟)。*

换句话说,您希望根据请求的生成时间(不超过 60 秒)使请求无效。 如果现在我正确地解释它,那么这个想法很可能是客户的请求需要不到 60 秒的时间来回答,所以假设太旧的消息很可能已经被正确地消费了——它可能是一个回复攻击。

不幸的是,您的解决方案只会(可预测地)减少攻击者可用于执行回复攻击的消息空间,因此即使使用同步时间戳,也远不能阻止 此外,如果消息可以被篡改,即攻击者可以用更新的时间戳更新旧消息,那么缓解措施将完全无效

无论如何,如果您的目的不是防止回复攻击,而是简单地丢弃过期消息,那么您可以通过提供两个 REST API 来实现您的目标:

  1. 一个用于“准备”(您甚至不需要收集回复)
  2. 另一个用于实际的“请求”

并且都具有客户端的时间戳和相同的请求标识符

因此,您将在服务器端看到两对 timestamp-requestID: (t,ID)(t',ID) 这将允许您简单地区分时间戳t' - t ,这与他们设置的时移或时区无关 您还可以在服务器端对请求进行计时,以丢弃与其相应“准备”相关的“请求”到达太晚。

此外,为了提高安全性,您可以让客户端 App 对消息(包括时间戳和请求 ID)进行签名以保证完整性 - 消息不会在没有注意到的情况下被篡改,因此您可以依赖发送到 API 的时间戳。 一种方法是使用公钥加密,但要注意如何分发公钥。 (这样可以限制攻击者只回复最近的请求)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM