security - 使用挖矿防止对websocket的DDOS攻击:这是一个可行的解决方案吗?
问题描述
我正在考虑以下方法是否是完全完全防止我的服务器上的 ddos 的好方法。我的想法是使用相同的加密货币挖掘机制(比特币,使用 sha256 或任何其他哈希)来防止 DDOS。
注意:我不建议挖掘加密货币本身。我建议使用相同的机制来避免Sybil 攻击。
为什么想法看起来很吸引我?因为创建一个挖掘的哈希是昂贵的,但验证它是超级便宜的。它只需要计算一次哈希。
简而言之,采矿意味着什么?这意味着有一个特定的数据块(比如会话 ID 或 JWT 令牌,可以存储在高性能 NoSQL 服务器中的服务器中),并且用户(或加密货币中的矿工)必须创建一个哈希值符合某些条件。例如,如果我们使用 SHA256,我们可以将难度定义为哈希结果的 256 位结果数中前导零的所需数量。更多的零使找到该散列的概率更加困难。
它是如何工作的?:用户将获取会话令牌(由服务器创建),并将其与随机数(使用一次的数字)组合,并在其前端计算哈希(通过 WASM,或使用 javascript)。由于用户无法对 SHA256 进行逆向工程,他所能做的就是不断地一次又一次地更改随机数,直到他找到一个创建满足所需难度的哈希的随机数。
该图显示了在比特币中找到一个块(找到正确的随机数)的概率,其中选择了难度使其达到 10 分钟。改变难度会改变这条曲线并按比例改变它的宽度。
服务器验证需要多长时间?几乎为零。只需计算一次哈希并确保它与给定的难度匹配,并授权用户提出任何匿名请求。请注意,这些都不需要使用用户名和密码进行身份验证。这都是匿名的。经过身份验证的用户不需要这样做,因为他们的凭据可能会被系统禁止。这一切都适用于匿名用户(可能还有攻击者)。
结果:在向服务器发出任何请求之前,用户必须以这种难度计算这个哈希值。一旦用户成功,挖掘的身份验证令牌可以存储在 cookie 中以供用户重复使用。如果用户未能提供所请求的哈希,他的连接请求将被突然拒绝,从而防止使用 sock-puppets 进行 DDOS 攻击。
ASIC抗性:不推荐使用 SHA256,因为有专门的硬件可以非常快速地计算它,从而导致可能的协同攻击。有些哈希值很难在硬件上打印,例如 Scrypt 和 Argon2。
选择难度:难度可以是静态的(我不推荐),也可以是动态的以随着网络负载而变化。当存在高网络负载时,增加了所需的难度。这基本上将充当过滤器并在 DDOS 攻击期间保护网络,并且永远不会影响用户,因为用户通常不会在意等待 10 秒来创建会话。在负载非常高的情况下,用户可以选择计算昂贵的 nonce,或者稍后再回来。托管公司还可以根据随时间推移的难度图表来决定是否需要扩展基础设施。
这是防止 websocket 和类似公共协议上的 DDOS 的合理计划吗?我想在我的服务器上实现这个。
解决方案
由于 DDOS 在多个连接上从多个系统运行,因此如果您只编写一个脚本,该脚本将从服务器请求一个新的 SHA256 哈希,因为每个单独的连接都会阻塞您的服务器,因此很容易抵消。他们不需要逆向工程,只需为请求访问服务器的每个单独连接生成“会话令牌”。
推荐阅读
- c# - 如何从 UTF8 编码的 sql server 获取数据?
- mongodb - 从 4.0 升级到 4.2 后无法访问 MongoDB 数据
- r - 如何在R中长时间使清晰的图形更平滑
- java - 将一些值从一个 ArrayList 复制到另一个 kotlin
- r - 使用索引在数据帧上创建 t 检验循环
- mysql - 即使有索引,我的查询也很慢
- python - 如何用相似的词得到正确的 if 语句?
- c - BFS 上的无限循环
- nativescript - 更新 nativescript 文件夹和文件后未在我的 android 手机中创建
- sql-server - 当另一个索引聚集时,我可以使主键不聚集吗?