防止重播 REST url 的重播攻击

Posted

技术标签:

【中文标题】防止重播 REST url 的重播攻击【英文标题】:Preventing replay REST url's replay attack 【发布时间】:2016-08-25 10:34:25 【问题描述】:

我有 spring security 自定义 rest 过滤器,它使用以下逻辑验证客户端请求。

标题字段

    标题中的日期 hmac 散列签名

身体

    hmac 加密数据

ios 客户端使用 POST 发出此请求,但我已过期 服务器中的时间设置为 15 秒。

现在的问题是,如果有人使用像 Charles 或 别的东西,如果他碰巧把断点放在 url 和 在 15 秒内触发相同的事件,nonce 将有效且服务器 第二次处理请求。我怎样才能防止这种情况发生 正在发生。在这种情况下,nonce 是行不通的。

无论是什么方法,如果黑客得到最终的 url 即将被解雇,他可能会多次解雇 随机数到期前的时间......

如何防止这种情况发生?

谁能帮我找到最好的 Spring Security 实现?

另外,HTTPS 是否默认保护我们免受重放攻击?我们需要 ssl客户端验证(在构建中具有der格式证书 并使用服务器证书验证这一点)以使重放攻击与 https 一起工作 ?还是默认在 https 中可用?

也就是说,我正在使用 AFNetworking,我们是否需要使用 SSL 固定以利用 https 重放攻击?还是没有它会起作用 ssl 固定?

【问题讨论】:

【参考方案1】:

如果您使用 HTTPS 调用 REST API,则在网络级别使用 the protocol protects you from replay attacks。这意味着有人无法记录某些加密流量并成功重放。

但是,如果您正在寻找一种方法来防止合法客户端多次发出相同的请求,您将需要发出这些请求 idempotent 或在您的业务逻辑中实施重放机制。您可以使用nonce 来做到这一点。 nonce 不会过期,但只能在单个事务中使用。

【讨论】:

我正在使用 https 和 iOS AFNetworking SDK 来触发请求。 nginx 服务器配置为仅接受 HTTPS 连接。但是仅仅在客户端将http更改为https,并不能提供网络安全吗?客户端必须进行握手/ssl 验证以提供 ssl 加密,进而提供安全权利?因为我面临问题,黑客正在使用 CHARLES 调试器并不断触发重复请求。早些时候我在标题中进行了 hmac 加密,而正文没有加密。现在我为正文添加了 AES 加密,在标头中添加了 hmac 加密,并使用时间戳生成了 nonce。 在 120 秒后过期。我唯一不清楚的是,仅将 http 更改为 https 即可提供安全性(或)我是否需要使用 AFNetworking 的 SSL Pinning 选项进行客户端 ssl 验证?。 MvdD,您提到随机数(仅使用一次的数字)不会过期。随机数本身是通过将时间戳设置为某些秒/分钟甚至几小时来生成的。因此,如果我得到最终的 url,并且如果我在 nonce 到期之前触发它,我可以播放重放攻击权(这里不包括 https)? 不确定我是否理解。在这里查看生成随机数:codereview.stackexchange.com/a/106880 我找不到在服务器端生成弹簧安全随机数以及如何从客户端处理随机数 url 的工作示例。如果我能得到一个工作示例,那将非常有帮助。

以上是关于防止重播 REST url 的重播攻击的主要内容,如果未能解决你的问题,请参考以下文章

API接口防止参数篡改和重放攻击

Java编程:API接口防止重放攻击(重复攻击)

Exchange 2013/2016延迟副本重播管理(Reply Log Manager)

网络安全-重放攻击及其防御

如何防止 Django Rest 中的暴力攻击 + 使用 Django Rest Throttling

如何使用 Java 防止 XSS 攻击或 Rest API JSON 中的不可信数据?