使用挖掘来防止对websocket的DDOS攻击:这是一个可行的解决方案吗?

时间:2018-05-29 21:12:18

标签: security networking hash websocket ddos

我正在考虑以下方式是否是完全彻底防止服务器上的ddos的好方法。我的想法是使用相同的加密货币挖掘机制(比特币,使用sha256或任何其他哈希)来防止DDOS。

注意:我并不建议挖掘加密货币本身。我建议使用相同的机制来避免Sybil attacks

为什么这个想法对我很有吸引力?因为创建一个挖掘的哈希很昂贵,但验证它是非常便宜的。它只需要计算一次哈希值。

简而言之,挖掘是什么意思?这意味着有一个特定的数据块(比如会话ID或JWT令牌,可以存储在服务器中)一个高性能的NoSQL服务器),用户(或加密货币的矿工)必须创建一个符合某些标准的哈希。例如,如果我们使用SHA256,我们可以将难度定义为散列中256位结果数中所需的前导零数。更多的零使得查找哈希的概率更加困难。

它是如何工作的?:用户将获取会话令牌(由服务器创建),并将其与nonce(使用一次的数字)组合,并计算他们前端的哈希值(通过WASM,或者使用javascript)。由于用户无法对SHA256进行逆向工程,他所能做的就是不断更新nonce,一次又一次,直到找到一个创建满足所需难度的哈希的nonce。

enter image description here

该图显示了在比特币中找到一个块(找到正确的随机数)的概率,其中选择难度为10分钟。改变难度将改变这条曲线并按比例改变其宽度。

服务器验证需要多长时间?实际上为零。只需计算一次哈希并确保它与给定的难度相匹配,并授权用户发出任何匿名请求。请注意,这些都不需要使用用户名和密码进行身份验证。这都是匿名的。经过身份验证的用户不需要这样做,因为他们的凭据可以被禁止进入系统。这一切都是针对匿名用户(可能还有攻击者)。

结果:在向服务器发出任何请求之前,用户必须使用此难度计算此哈希值。一旦用户成功,就可以将挖掘的认证令牌存储在cookie中以供用户重用。如果用户未能提供所请求的哈希,则他的连接请求将被突然拒绝,从而防止使用袜子木偶进行DDOS攻击。

ASIC阻力:建议不要使用SHA256,因为可以非常快速地计算它的专用硬件会导致可能的协同攻击。有些哈希很难在硬件上打印,例如Scrypt和Argon2。

选择难度:难度可以是静态的(我不建议),也可以动态地随网络负载而变化。当存在高网络负载时,增加了所需的难度。这基本上将充当过滤器并在DDOS攻击期间保护网络,并且永远不会影响用户,因为用户通常不会等待10秒钟来创建会话。如果负载非常高,用户可以选择计算昂贵的随机数,也可以稍后再回来。托管公司还可以根据难度图表确定是否需要扩展基础架构。

这是一个在websocket和类似的公共协议上防止DDOS的合理计划吗?我想在我的服务器上实现它。

2 个答案:

答案 0 :(得分:0)

由于DDOS在多个连接上的多个系统上运行,因此如果您只编写一个脚本,从服务器请求每个连接的新SHA256哈希会阻塞您的服务器,则很容易抵消。他们不需要进行逆向工程,而只需生成会话令牌'对于请求访问服务器的每个单独连接。

答案 1 :(得分:0)

它应该以某种方式工作并防止简单的攻击。但是你可以通过在不同的请求上请求动态哈希难度来改进它。

例如,你有2个页面,一个显示db中具有特定记录的数据(通过使用主键),第二个执行困难搜索,有时在db中没有必要的索引来快速搜索,或者页面显示很多结果攻击者想要DDOS第二页并尽可能慢地进行搜索。

您可以为第一页设置低难度,为第二页设置高。主要想法可能是:如果要在服务器上占用x CPU时间,请花费c * x的CPU时间。

如果您只请求哈希一次,攻击者可以使用单个cookie计算必要的nonce并进行数百万次请求。