1. 首部篡改
- 为了提供一个简单明了的防首部篡改系统,要么就得进行端到端的加密,要么就得对首部进行数字签名——最好是两者的结合。
- 摘要认证的重点在于提供一种防篡改认证机制,但并不一定要将这种保护扩展到数据上去。具有一定保护级别的首部只有 WWW-Authenticate 和 Authorization。
2. 重放攻击
- 重放攻击指的就是有人将从某个事务中窃取的认证证书用于另一个事务。尽管对 GET 请求来说这也是个问题,但为 POST 和 PUT 请求提供一种简单的方式来避免重放攻击才是非常必要的。在传输表单数据的同时,成功重放原先用过的证书会引发严重的安全问题。
- 因此,为了使服务器能够接受“重放的”证书,还必须重复发送随机数。缓解这个问题的方法之一就是让服务器产生的随机数包含(如前所述)根据客户端 IP 地址、时间戳、资源 Etag 和私有服务器密钥算出的摘要。这样,IP 地址和一个短小超时值的组合就会给攻击者造成很大的障碍。
- 这种解决方案有一个很重要的缺陷。我们之前讨论过,用客户端 IP 地址来创建随机数会破坏经过代理集群的传输。在这类传输中。来自单个用户的多条请求可能会穿过不同的代理。而且,IP 欺骗也并不难实现。
- 一种可以完全避免重放攻击的方法就是为每个事务都使用一个唯一的随机数。在这种实现方式中,服务器会为每个事务发布唯一的随机数和一个超时值。发布的随机数只对指定的事务有效,而且只在超时值的持续区间内有效。这种方式会增加服务器的负担,但这种负担可忽略不计。
3. 多重认证机制
- 服务器支持多重认证机制(比如基本认证和摘要认证)时,通常会在 WWW-Authenticate 首部提供选项。由于没有要求客户端选择功能最强的认证机制,所以得到的认证效果就和功能最弱的认证方案差不多。
- 要避免出现这个问题,最直接的方法就是让客户端总是去选择可用认证方案中功能最强的那个。如果无法实现(因为大部分人使用的都是商业化客户端),唯一的选择就是使用一个只维护最强认证方案的代理服务器。但只有在已知所有客户端都支持所选认证方案的区域中才能采用这种方式——比如,在公司网络中。
4. 词典攻击
- 词典攻击是典型的密码猜测型攻击方式。恶意用户对某个事务进行窃听,并对随机数/响应对使用标准的密码猜测程序。如果用户使用的是相对比较简单的密码,而且服务器使用的也是简单的随机数,它很可能会找到匹配项。
- 如果没有密码过期策略,只要有足够的时间和破解密码所需的一次性费用,就很容易搜集到足够多的密码,造成实质性的破坏。
- 除了使用复杂的相对难以破译的密码和合适的密码过期策略之外,确实没有什么好的方法可以解决这个问题。
5. 恶意代理攻击和中间人攻击
- 现在很多因特网流量都会在这个或那个地方流经某个代理。随着重定向技术和拦截代理的出现,用户甚至都意识不到他的请求穿过了某个代理。如果这些代理中有一个是恶意的或者容易被入侵的,就会使客户端置于中间人攻击之下。
- 这种攻击可以采用窃听的形式,也可以删除提供的所有选项,用最薄弱的认证策略(比如基本认证)来取代现有的认证机制,对其进行修改。
- 入侵受信代理的方式之一就是使用其扩展接口。有时代理会提供复杂的编程接口,可以为这类代理编写一个扩展(比如,plug-in)来拦截流量并对其进行修改。不过,数据中心和代理自身提供的安全性使得通过恶意 plug-in 进行中间人攻击的可能性变得很渺茫。
- 没有什么好办法可以解决这个问题。可行的解决方案包括由客户端提供与认证功能有关的可见线索,对客户端进行配置使其总是使用可用认证策略中功能最强的那一种,等等。但即使使用的是最强大的认证策略,客户端仍然很容易被窃听。防止这些攻击唯一简便的方式就是使用 SSL。
6. 选择明文攻击
- 使用摘要认证的客户端会用服务器提供的随机数来生成响应。但如果中间有一个被入侵的或恶意的代理在拦截流量(或者有个恶意的原始服务器),就可以很容易地为客户端的响应计算提供随机数。使用已知密钥来计算响应可以简化响应的密码分析过程。这种方式被称为选择明文攻击(chosen plaintext attack)。选择明文攻击有以下几种变体形式:
- 预先计算的词典攻击
这是词典攻击和选择明文攻击的组合。首先,发起攻击的服务器会用预先确定的随机数和常见密码的变化形式产生一组响应,创建一个词典。一旦有了规模可观的词典,攻击服务器或代理就可以完成对流量的封锁,向客户端发送预先确定的随机数。攻击者从客户端得到一个响应时,会搜索生成的词典,寻找匹配项。如果有匹配项,攻击者就捕获了这个用户的密码。 - 批量暴力型攻击
批量暴力型攻击的不同之处在于计算密码的方式。它没有试图去匹配预先计算出来的摘要,而是用一组机器枚举了指定空间内所有可能的密码。随着机器运行速度变得越来越快,暴力型攻击的可行性也变得越来越强了。
- 预先计算的词典攻击
- 总之,这些攻击所造成的威胁是很容易应对的。防止这些攻击的一种方法就是配置客户端使用可选的 cnonce 指令,这样响应就是基于客户端的判断产生的,而不是用服务器提供的随机数(这个随机数可能会被攻击者入侵)产生的。通过这种方法,再结合一些强制使用合理强密码的策略,以及一个好的密码过期策略,就可以完全消除选择明文攻击的威胁。
7. 存储密码
- 摘要认证机制将对比用户的响应与服务器内部存储的内容——通常就是用户名和H(A1) 元组对,其中 H(A1) 是从用户名、域和密码的摘要中导出的。
- 与 Unix 机器中传统的密码文件不同,如果摘要认证密码文件被入侵了,攻击者马上就能够使用域中所有文件,不需要再进行解码了。
- 消除这个问题的方法包括:
- 就像密码文件中包含的是明文密码一样来保护它;
- 确保域名在所有域中是唯一的。这样,如果密码文件被入侵,所造成的破坏也只局限于一个特定的域中。包含主机和 domain 的全路径域名就可以满足这个要求。
尽管摘要认证提供的解决方案比基本认证要强壮且安全得多,但它并没有为内容的安 全提供任何保证——真正安全的事务只有通过 SSL 才能实现,我们将在下一章介绍。