概述
最近对http很感兴趣,于是开始看《http权威指南》。别人都说这本书有点老了,而且内容太多。我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做,还告诉你为什么这么做。于是我把学到的知识点记录下来,供以后开发时参考,相信对其他人也有用。
摘要认证
1.安全使用基本认证的唯一方式是将其与SSL配合使用。
2.摘要认证相比基本认证的改进:
- 永远不会以明文方式在网络上发送密码。
- 可以防止恶意用户捕获并重放认证的握手过程。
- 可以有选择地防止对报文内容的篡改。
- 防范其他几种常见的攻击方式。
3.摘要认证的基本原理是,客户端不会发送密码,而是会发送一个“指纹”或密码的“摘要”,这是密码的不可逆扰码。客户端和服务器都知道这个密码,因此服务器可以验证所提供的摘要是否与密码相匹配。只拿到摘要的话,除了将所有的密码都拿来试试之外,没有其他方法可以找出摘要是来自哪个密码。
4.摘要是“对信息主体的浓缩”。摘要是一种单向函数,主要用于将无限的输入值转换为有限的浓缩输出值。常见的摘要函数MD5,会将任意长度的字节序列转换为一个128位的摘要。对这些摘要来说,最重要的是如果不知道密码的话,要想正确地猜出发送给服务器的摘要将是非常困难的。
5.摘要函数有时也被称为加密的校验和、单向散列函数或指纹函数。
6.为了防止黑客截获摘要来进行转发,服务器可以向客户端发送一个称为随机数的特殊令牌,这个数会经常发生变化(可能是每毫秒,或者是每次认证都变化)。客户端在计算摘要之前要先将这个随机数令牌附加到密码上去。随机数是在www-Authenticate质询中从服务器传送给客户端的。
7.摘要认证的三步握手机制:
- 服务器会计算一个随机数,放在www-Authenticate质询报文中,发给客户端。
- 客户端选择一个算法,计算出密码和其它数据的摘要,放在一条Authentication报文中发回服务器,如果客户端要对服务器进行认证,可以发送客户端随机数。
- 服务器接受摘要、选中的算法以及支撑数据,计算出与客户端相同的摘要,然后将它与本地生成的摘要进行比较,验证是否匹配。
8.预授权:在普通的认证方式中,事务结束之前,每条请求都要有一次请求/质询的循环。但是如果客户端事先知道下一个随机数是什么,就可以取消这个请求/质询循环,这样客户端就可以在服务器发出请求之前,生成正确的Authorization首部了。如果客户端能在服务器要求它计算Authorization首部之前就将其计算出来,就可以预先将Authorization首部发送给服务器,而不用进行请求/质询了。
9.由于摘要认证使用了随机数技术来破坏重放攻击,所以对摘要认证来说,预授权要稍微复杂一些,主要有以下三种方式:
- 服务器预先在Authentication-Info成功首部中发送下一个随机数;(破坏了管道化,因为在发布下一条请求之前,一定要收到下一个随机值才行)
- 服务器允许在一小段时间内使用同一个随机数;(降低了安全性,但是可以控制这个时间,在安全与时间中找到平衡。)
- 客户端和服务器使用同步的、可预测的随机数生成算法。(通过共享的密钥,生成第三方无法轻易预测的、相同的随机数序列)
10.对称认证:RFC 2617扩展了摘要认证机制,允许客户端对服务器进行认证。这是通过提供客户端随机值来实现的,服务器会根据它对共享保密信息的正确了解生成正确的响应摘要,然后服务器在Authorization-info首部中将此摘要返回给客户端。
11.在摘要认证中,质询的www-Authenticate:domain字段对保护空间作了更精确的定义。
12.安全性考虑:
- 首部篡改。
- 重放攻击。
- 多重认证攻击。
- 词典攻击。
- 恶意代理攻击和中间人攻击。
- 选择明文攻击。(预先计算的词典攻击和批量暴力型攻击)
- 储存密码被入侵。
13.防止选择明文攻击的一种方法就是配置客户端使用可选的cnonce指令,这样响应就是基于客户端的判断产生的,而不是服务器提供的随机数(这个随机数可能会被攻击者入侵)产生的。