Skip to main content

4. Security Considerations (安全考虑)

4.1 Authentication of Clients using Basic Authentication (使用基本认证的客户端认证)

基本认证方案不是安全的用户认证方法,也不以任何方式保护以明文形式通过物理网络传输的实体。HTTP不阻止采用额外的认证方案和加密机制来提高安全性,或向基本认证添加增强功能(例如使用一次性密码的方案)。

基本认证最严重的缺陷是它导致用户密码以本质上的明文形式通过物理网络传输。摘要认证 (Digest Authentication) 试图解决的正是这个问题。

由于基本认证涉及密码的明文传输,因此不应该 (SHOULD NOT) 使用它(没有增强功能)来保护敏感或有价值的信息。

基本认证的一个常见用途是用于识别目的——要求用户提供用户名和密码作为识别手段,例如,用于收集服务器上的准确使用统计信息。以这种方式使用时,如果对受保护文档的非法访问不是主要关注点,则很容易认为使用它没有危险。只有当服务器向用户发放用户名和密码,特别是不允许用户选择自己的密码时,这才是正确的。危险在于天真的用户经常重复使用单个密码以避免维护多个密码的任务。

如果服务器允许用户选择自己的密码,那么威胁不仅是对服务器上文档的未授权访问,还包括对用户使用相同密码保护的其他系统上任何其他资源的未授权访问。此外,在服务器的密码数据库中,许多密码也可能是用户在其他站点的密码。因此,如果不以安全方式维护此信息,此类系统的所有者或管理员可能会使系统的所有用户面临对所有这些站点的未授权访问的风险。

基本认证还容易受到伪造服务器的欺骗。如果可以使用户相信他正在连接到包含受基本认证保护的信息的主机,而实际上他正在连接到敌对服务器或网关,那么攻击者可以请求密码,将其存储以供以后使用,并伪装错误。这种类型的攻击对于摘要认证是不可能的。服务器实现者应该 (SHOULD) 防范网关或CGI脚本进行此类伪造的可能性。特别是,服务器简单地将连接转交给网关是非常危险的。该网关然后可以使用持久连接机制与客户端进行多个事务,同时以客户端无法检测的方式冒充原始服务器。

4.2 Authentication of Clients using Digest Authentication (使用摘要认证的客户端认证)

与基于公钥的机制相比,摘要认证不提供强认证机制。

然而,它明显强于(例如)已被提议用于LDAP [10]、POP和IMAP(参见RFC 2195 [9])的CRAM-MD5。它旨在取代更弱且更危险的基本机制。

摘要认证除了保护实际密码外,不提供保密性保护。请求和响应的所有其余部分都可供窃听者使用。

摘要认证仅为任一方向的消息提供有限的完整性保护。如果使用qop=auth-int机制,则用于计算WWW-Authenticate和Authorization头字段response指令值的消息部分(参见上面的第3.2节)受到保护。大多数头字段及其值可以作为中间人攻击的一部分被修改。

摘要认证无法满足许多安全HTTP事务的需求。对于这些需求,TLS或SHTTP是更合适的协议。特别是,摘要认证不能用于任何需要保密性保护的事务。尽管如此,摘要认证对于许多功能仍然既有用又合适。任何目前使用基本认证的服务都应该尽快切换到摘要认证。

4.3 Limited Use Nonce Values (有限使用的Nonce值)

摘要方案使用服务器指定的nonce来生成request-digest值(如上面第3.2.2.1节所述)。如第3.2.1节中的示例nonce所示,服务器可以自由构造nonce,使其只能从特定客户端、特定资源、有限时间段或使用次数或任何其他限制使用。这样做可以加强对例如重放攻击(参见4.5)的保护。但是,应该注意的是,为生成和检查nonce选择的方法也会影响性能和资源。例如,服务器可以选择通过维护每个最近发出的nonce是否已返回的记录,并在每个响应的Authentication-Info头字段中发送next-nonce指令,来允许每个nonce值仅使用一次。这可以防止即使是立即的重放攻击,但检查nonce值的成本很高,也许更重要的是会导致任何管道请求的认证失败(大概返回过期的nonce指示)。类似地,合并特定于请求的元素(例如资源的Etag值)会将nonce的使用限制为该资源的该版本,并且也会破坏管道。因此,对于具有副作用的方法这样做可能很有用,但对于没有副作用的方法可能会有不可接受的性能影响。

4.4 Comparison of Digest with Basic Authentication (摘要认证与基本认证的比较)

摘要认证和基本认证都处于安全强度范围的弱端。但是两者之间的比较指出了用摘要取代基本认证的实用性,甚至必要性。

对于使用这些协议的事务类型,最大的威胁是网络窃听。这种类型的事务可能涉及,例如,在线访问其使用仅限于付费订阅者的数据库。使用基本认证,窃听者可以获得用户的密码。这不仅允许他访问数据库中的任何内容,而且通常更糟糕的是,将允许访问用户使用相同密码保护的任何其他内容。

相比之下,使用摘要认证,窃听者只能访问所讨论的事务,而不能访问用户的密码。窃听者获得的信息将允许重放攻击,但仅限于对同一文档的请求,甚至这也可能受到服务器对nonce的选择的限制。

4.5 Replay Attacks (重放攻击)

对摘要认证的重放攻击对于简单的GET请求通常是毫无意义的,因为窃听者已经看到了他可以通过重放获得的唯一文档。这是因为所请求文档的URI在客户端请求中被摘要,服务器只会交付该文档。相比之下,在基本认证下,一旦窃听者拥有用户的密码,该密码保护的任何文档都对他开放。

因此,出于某些目的,有必要防止重放攻击。良好的摘要实现可以通过各种方式做到这一点。服务器创建的"nonce"值取决于实现,但如果它包含客户端IP、时间戳、资源ETag和私有服务器密钥的摘要(如上所述),那么重放攻击就不简单了。攻击者必须说服服务器请求来自虚假IP地址,并且必须使服务器将文档交付到与它认为正在发送文档的地址不同的IP地址。攻击只能在时间戳过期之前的时间段内成功。在nonce中摘要客户端IP和时间戳允许在事务之间不维护状态的实现。

对于不能容忍重放攻击可能性的应用程序,服务器可以使用一次性nonce值,这些值不会被第二次使用所接受。这需要服务器记住哪些nonce值已被使用的开销,直到nonce时间戳过期。

4.6 Weakness Created by Multiple Authentication Schemes (多个认证方案造成的弱点)

当服务器在WWW-Authenticate头中提供多个认证方案时,客户端应选择最强的方案。但是,如果攻击者可以修改响应以删除较强的方案,则客户端可能被迫使用较弱的方案。

4.7 Online dictionary attacks (在线字典攻击)

如果服务器不限制认证尝试的速率,攻击者可以尝试大量密码来猜测正确的密码。服务器应该 (SHOULD) 限制来自单个IP地址的失败认证尝试的速率。

4.8 Man in the Middle (中间人攻击)

摘要认证容易受到中间人攻击。攻击者可以拦截客户端和服务器之间的通信,并修改或替换消息。使用TLS或其他传输层安全机制可以防止此类攻击。

4.9 Chosen plaintext attacks (选择明文攻击)

摘要认证容易受到选择明文攻击。攻击者可以选择特定的URI并观察生成的摘要,从而可能获得有关密码的信息。

4.10 Precomputed dictionary attacks (预计算字典攻击)

如果攻击者可以访问服务器的密码文件,他可以预先计算常见密码的摘要,然后将这些摘要与文件中的摘要进行比较。使用盐值 (Salt) 可以使这种攻击更加困难。

4.11 Batch brute force attacks (批量暴力攻击)

如果攻击者可以捕获多个认证交换,他可以离线尝试暴力破解密码。使用强密码和限制nonce的有效期可以减轻这种风险。

4.12 Spoofing by Counterfeit Servers (伪造服务器的欺骗)

客户端应该 (SHOULD) 验证服务器的身份,以防止连接到伪造服务器。使用TLS与服务器证书验证可以防止此类攻击。

4.13 Storing passwords (存储密码)

服务器不应该 (SHOULD NOT) 以明文形式存储密码。相反,应该存储密码的哈希值。对于摘要认证,服务器可以存储H(username:realm:password),这允许验证客户端而无需存储明文密码。

4.14 Summary (总结)

摘要认证提供了比基本认证更好的安全性,但它不是完整的安全解决方案。对于需要强安全性的应用程序,应该使用TLS或其他更强的安全机制。尽管如此,摘要认证对于许多应用程序来说是一个实用且有用的改进。