Client Nonce 是否增强了 HTTP Digest Auth 的安全性?

信息安全 验证 http md5 随机数
2021-08-25 08:53:13

据我了解 https://security.stackexchange.com/a/3024/13447的答案,客户端随机数旨在防止攻击者通过重用计算结果来分摊暴力哈希计算的成本

  • 对于多个用户和/或
  • 多台服务器

但是,即使在最简单的摘要式身份验证变体 (qop = none) 中,theusernamerealm(假定每个服务器唯一) 和nonce(不仅仅是每个服务器唯一) 都包含在经过哈希处理的数据中(通常是 MD5)。

这不是已经不可能在用户/服务器之间重复使用预先计算的哈希了吗?

因此,如果https://www.rfc-editor.org/rfc/rfc2617#section-4.9正确,客户端 nonce 只会增加安全性:

众所周知,选择随机数的能力使密码分析更容易[8]。

但是同一部分接着说

然而,目前还没有任何方法可以分析 Digest 使用选择的明文使用的 MD5 单向函数。

这是 1999 年的声明。从那时起,针对 MD5 发布了各种碰撞攻击,但如果我没记错的话,在这种情况下没有任何帮助。

我错过了什么?

更新我想把我们正在谈论的内容准确地说明是有道理的。在摘要式身份验证的最基本形式中,客户端计算并将以下结果发送到服务器:

MD5(MD5(username + ":" + REALM + ":" + password)
    + ":" + NONCE + ":" +
    MD5(http-method) + ":" + uri))

除密码外,所有值也以纯文本形式发送。

为了更清楚,由客户端设置值的变量是小写的,而客户端从服务器检索的变量是大写的(这使得我上面的“领域和随机数”谬误立即显而易见,因为 MITM 可以自由选择这些大写值,假设领域没有被客户检查,从“复杂性”来看,我'在大多数管理员的密码中已经看到,这将是常态,而不是例外)。

顺便说一句,uri 的值应该是一个绝对的 uri,例如http://servername/path?query,因此将是全局唯一的,但是,这取决于客户端的实现,而Opera 以这种方式实现它,我测试的Chrome、IE、Firefox的版本确实如此不是,而只是使用 '/path?query' (因为这违反了https://www.rfc-editor.org/rfc/rfc2617#section-3.2.2.5)。

因此,预计算表是否可以跨服务器重用取决于客户端实现,如果 MITM 可以选择,如果他有预计算表,它当然会更喜欢较弱的浏览器而不是 Opera。

2个回答

该问题中引用的Thomas Pornin 的回答中所述,客户端随机数的目标是防止选择明文攻击,其中攻击者冒充服务器并选择挑战。在这种情况下,攻击者还可以选择领域(因为它来自服务器),因此领域作为响应的一部分被散列的事实并不能完全阻止这种攻击。只有当用户保持警惕并检查领域是否符合预期时,才能防止攻击。

用户名确实有帮助,因为它要求攻击者为每个用户名构建一个预先计算的哈希表,例如彩虹表。问题是用户名不是全局唯一的 - 相同的用户名将存在于许多不同的服务器上。事实上,一些用户名非常常见,很可能出现在大多数服务器上——一个典型的例子是“admin”。

因此,攻击者可以执行以下操作:

  1. 一次:为 username = "admin"、realm = X 和 challenge = Y 构建一个预先计算的哈希表(对 X 和 Y 使用任何值)
  2. 拦截与攻击者想要攻击的任何服务器的连接
  3. 如果有人使用用户名“admin”连接到服务器,则发送 real = X 和 challenge = Y
  4. 在预先计算的哈希表中查找响应以显示密码

客户端随机数可以防止这种攻击;由于攻击者无法控制并且无法预测此随机数,因此攻击者无法构建预先计算的哈希表。

用户名和领域(假设每个服务器唯一)

这是不正确的。领域是服务提供商指定的用于描述保护领域的值,因此它只是一个名称,而不是全局标识符。

在你的第二个引用中,我认为他们指的是 MD5 的“单向性”没有被破坏。找到原像的最有效方法(即从值 Y = MD5(x) 找到 x)需要 2 123.4次操作。

cnonce “是客户端提供的不透明字符串,客户端和服务器都使用它来避免选择明文攻击,提供相互身份验证,并提供一些消息完整性保护。”[ RFC ] 与 nonce 一起,它促进了持续的相互身份验证:客户端对服务器的身份验证,反之亦然。