客户端散列可以降低慢速散列的拒绝服务风险吗?

信息安全 密码 哈希 bcrypt
2021-08-19 01:37:25

在存储您需要验证(但不用作明文)的用户密码时,当前的技术状态是:

  1. 哈希密码
  2. 使用盐
  3. 使用慢散列函数 - bcrypt、scrypt 等。

这提供了对窃取密码数据库的攻击者的最佳保护。它不能解决网络钓鱼、恶意软件、密码重复使用等其他问题。

但是还有一个问题:慢散列函数可能允许拒绝服务攻击。单个请求会消耗大量 CPU,这使得并发请求数量相对较少的 DOS 成为可能,从而难以使用 IP 节流等防御措施。

鉴于 JavaScript 在浏览器中性能的提高,现在在浏览器中执行此操作可能是有意义的。我在这里假设该站点使用 SSL,因此 JavaScript 是安全交付的。如果您不使用 SSL,那么使用慢速散列函数不太可能成为您的优先事项。bcrypt至少有一个JavaScript 实现但是以简单的方式使用它会引入两个问题:

  1. 客户端需要从服务器获取盐。这会在登录时引入延迟,除非小心,否则可能会显示特定用户帐户是否存在。
  2. 如果散列纯粹在客户端完成,那么存储散列的好处就失去了。窃取密码哈希的攻击者可以简单地使用哈希登录。

但是,我认为这两个问题都有可以接受的解决方案:

  1. salt 可以生成为 hash(server_salt + user_name) - 其中 server_salt 是一个随机数,对服务器来说是唯一的,公共的,对所有用户都是一样的。生成的哈希似乎具有盐所需的属性。
  2. 服务器应该对它接收到的散列执行一个单一的、快速的散列操作。例如:服务器存储 SHA-256(bcrypt(salt, password))。客户端发送 bcrypt(salt, password) 然后服务器应用 SHA-256 并检查哈希。这不允许攻击者进行快速离线暴力攻击。他们可以进行 SHA-256(密码)的快速暴力破解,因为密码的熵有限 - 2^50 或 2^60 左右。但是 128 位 bcrypt(salt, password) 具有熵或 2^128,因此他们不能轻易地暴力破解它。

那么,这是一种合理且安全的方法吗?

我知道“不要推出自己的加密货币”的一般建议。但是,在这种情况下,我试图解决现成的加密无法解决的问题。对于一些基本的可信度,约翰史蒂文(该领域公认的专家)已经从“简要”分析中得到了积极的结果。

2个回答

使用服务器名+用户名作为盐(或其哈希)并不理想,因为它会在您更改密码时导致盐重用(因为您保留您的姓名并且仍然与同一服务器通信)。另一种方法是从服务器获取盐作为准备步骤;这意味着额外的客户端-服务器往返,也意味着服务器会发现更难隐藏给定的用户名是否存在(但在实践中并不重要)。

您所描述的是一个众所周知的想法,通常称为server Relief,它可以以您描述的方式应用于任何密码散列函数:

  • 客户端获取(或计算)盐。
  • 客户端计算慢速加盐哈希值V并将其作为密码发送。
  • 服务器为一些快速哈希函数h存储h(V),并使用它来验证来自客户端的V值。

这是安全的。主要缺点是缓慢的散列会以客户端的速度进行,因此可能必须降低迭代次数,如果客户端计算能力较弱,可能会大大降低——就像涉及 Javascript 的任何事情一样。如果系统必须在不太新的智能手机上使用浏览器,那么迭代次数必须比在服务器上可以完成的次数少 10 到 100 倍,这意味着对暴力破解的抵抗力相应降低(在如果攻击者窃取存储在服务器上的哈希值)。

所以这是一个权衡:由于繁忙的服务器卸载在客户端上工作,它可以使用更高的迭代次数而不会淹没在负载下;但是由于客户端很弱,因此必须降低迭代次数,通常比由于卸载而增加的次数要多得多;这意味着建设是不值得的。通常。


当然,如果客户端计算能力很强,例如这是游戏机上的本地代码应用程序,那么服务器缓解是一个好主意,看起来就像你描述的那样。

另一种可能性是将工作卸载到另一个第三方系统,例如其他客户端(已经连接):如果散列函数包含必要的数学结构,这可以安全地完成。这种卸载称为委托据我所知,委托仅由一个名为Makwa的密码散列函数提供(参见规范),它是当前密码散列竞赛的候选者之一。

我认为这种方法最大的担忧在于,它将您确定重要的安全程序从您的服务器转移到用户的 Web 浏览器上。虽然通常一切都应该按预期工作,但在将密码发送给您之前,您没有真正的方法来验证密码是否真的用 bcrypt 进行了哈希处理。因此,如果客户端 JavaScript 发生更改,您的服务器上可能仍然只有“123456”的 SHA256 哈希值。

当然,您可以检查从客户端发送的数据的格式,以确保它看起来像是用 bcrypt 散列的,但您不确定您想要的操作是否已完成。

这不是一个理想的安全模型,但尽管如此,我认为对该系统的威胁仍然是相当可控的。你会领先于那些不使用普通 MD5 散列或散列的网站。