如果您的服务器使用 bcrypt,您是否应该关心 DoS 攻击?

信息安全 拒绝服务 bcrypt
2021-08-16 13:09:13

(我刚刚在“cryptography SE”上问了这个问题,并被建议在这里问)

编辑我刚刚意识到我的问题主要是一个骗局:防止对慢散列函数的拒绝服务攻击?

如果有人选择 bcrypt,服务器是不是特别容易受到试图最大化 CPU 的 DoS 攻击?

例如,如果我们使用一个网络服务器:即使它有一个巨大的网络带宽,它看起来像用 HTTP POST 登录请求远程敲击服务器可能会给 CPU 带来困难。

如果服务器没有对任何看起来像单台机器/ IP 的东西进行速率限制,那么强制服务器进行大量计算也不会太难。

这是否值得担心(例如,您是否需要添加某种特殊的限速防火墙,专门考虑“远程 bcrypt 攻击”)或者我只是在这里偏执?

3个回答

bcrypt 很慢,这肯定会增加简单的 DoS 攻击的风险,但有多种方法可以在客户端进入 bcrypt 步骤之前对其进行速率限制:

  • 跟踪 IP 地址并忽略任何尝试过快登录的人(可能首先在验证之前暂停一段时间,然后逐步进入黑名单 IP)。
  • 将登录尝试放入优先级队列,并根据最近对特定 IP 地址的登录尝试失败次数设置优先级。这将使您的服务器负载过重,但合法用户应该能够进入。
  • 添加验证码验证码很烦人,因此只有在您检测到正在进行的攻击或者您从单个 IP 地址获得过多尝试时才需要这样做。
  • 作为登录过程的一部分,让客户端的机器做一些昂贵的事情,比如破解一个短散列或找到一个小数的质因数。这样做的好处是使用不同的 IP 无济于事,但这意味着需要 JavaScript 才能登录。
  • 检测用户何时尝试从新位置登录并向他们发送电子邮件。在 IP 地址通过身份验证之前,甚至不必费心尝试检查密码。这样做的缺点是,如果攻击者有足够多的 IP 地址可供使用,他们可能会惹恼(并吓跑)您的用户。

如果服务器没有对任何看起来像单台机器/ IP 的东西进行速率限制,那么强制服务器进行大量计算也不会太难。

DoS 对任何服务都是一种风险。它需要的处理越多,越重要的速率限制是我们谈论的是散列密码还是进行数据库查询。

在考虑多少轮时,请考虑如何在处理身份验证负载和保持系统可用之间进行权衡。请参阅我的另一个答案,参考确定要使用多少个 bcrypt 轮次

在我的脑海中,我相信在使用现代机器上的所有 CPU 之前,您会用完套接字或端口。如果您没有将机器的 time_wait 调整为较低的值,端口将会耗尽。