0%

第12、13章:认证机制

第12章——基本认证机制

当访问某些需要授权才能访问的资源时,服务器会返回401要求登录认证,web服务器会将受保护的文档组织成一个 安全域(security realm),每个安全域可以有不同的授权用户集。

一个例子

假设web服务器建立了两个安全域,一个用于公司的财务信息,一个用于个人家庭的文档,那么公司的CEO应当能够访问销售额预测资料,但不应该允许CEO访问员工和其家人度假的照片。

下面是一个假想的基本认证质询,它指定了一个域:

HTTP/1.0 401 Unauthorized
WWW-Authenticate:Basic realm=”Family”

域应该有一个描述性字符名,比如 Family(员工个人家庭照片),以帮助用户了解应该使用哪个用户名和密码。

基本认证实例

缺点

基本认证的机制很简单,但是存在以下主要的安全隐患:

  • 基本认证以 username:pwd 的形式将用户名密码拼接起来,并且通过Base-64的加密后通过网络发送用户名和密码,这基本上相当于明文传输(base-64很容易破解)。
  • 即使使用其他更难解密的方式加密,也没有机制防止重放攻击。
  • 没有针对中间节点的防护,头部不被更改,能通过认证,但是报文内容更改了也能造成很大的危害。

第13章——摘要认证

摘要认证试图修复基本认证协议的严重缺陷,它遵循的箴言是“绝不通过网络发送密码”,相对基本认证,它做了如下改进:

  • 永远不以明文在网络上发送密码
  • 可以防止恶意用户捕获并且重放的握手过程
  • 可以选择性地防止对报文内容的篡改
  • 防范其他常见形式的攻击

原理

摘要认证的主要原理是“对信息主体的浓缩”,它认证的主要流程如下:

  1. 客户端请求了某个受保护的文档。
  2. 在客户端能够证明身份前,服务器拒绝提供文档,并向客户端发起质询,询问用户名和摘要形式的密码。
  3. 客户端传递用户名和密码的摘要。服务器知道所有用户的密码,将收到的摘要与自己用密码计算出来的摘要对比,即可校验用户身份真伪。
  4. 如果验证通过,则开始向客户端提供文档。

注意:整个过程都没有在网络上发送密码!而是发送密码的“摘要”或者说是指纹

整个过程图示如下:

摘要认证流程

摘要

摘要是一种单向函数,主要用于将无限的输入值转换为有限的浓缩输出值,有时也将摘要函数称为加密的校验和、单向散列函数或者指纹函数。常见的摘要函数是 MD5 ,会将任意长度的字节序列转换为一个128位的摘要。MD5输出的128位的摘要通常会被写成32个16进制的字符,每个字符表示4位。

重放攻击

使用单向摘要就无需以明文发送密码了,但是别有用心的人还是可以截获摘要,并一遍遍地重放给服务器,进行重放攻击,在这点上,摘要和密码一样好用。

为了防止重放攻击,服务器可以向客户端发送一个称为 随机数(nonce)的特殊令牌,这个数会经常发生变化(根据具体规则来定,可以每次认证都变化),客户端在计算摘要之前要先将这个随机数令牌附加到密码上去。在密码中加入随机数就会使摘要随着随机数的每次变化而变化,没有密码就无法计算出正确的摘要。

摘要认证的握手机制

摘要认证的握手步骤流程如下:

  1. 客户端请求被保护的文档。
  2. 服务器计算出一个随机数,放入质询报文(WWW-Authenticate)中,与服务器支持的算法列表一同发给客户端。
  3. 客户端选择其中一个算法,计算出密码和其他数据的摘要。并将摘要放在认证报文(Authorization)中发回服务器,如果客户端要对服务器进行质询,可以发送客户端的随机数。
  4. 服务器接受摘要、选中的算法以及支撑数据,在本地生成摘要,并与客户端发来的摘要对比验证。如果客户端有对服务器进行质询,就会创建服务端摘要。

摘要认证会话过程优化

预授权

普通的认证方式中,事务结束前,每条请求都要有一次 请求/质询 的循环,如果客户端事先知道下一个随机数是什么,就可以取消这个 请求/质询 循环,这样客户端就可以在服务端发出请求之前,正确地生成Authorization首部了。这样就能减少报文的数量,对性能也有很大的提升,如图:

预授权减少报文数量

此外,还有几种预授权的方式:

  • 服务器预先在Authentication-info成功首部中发送下一个随机数。

    这虽然避免了 请求/质询 循环,但是它也破坏了对同一条服务器的多条请求进行管道化的功能,因为在发布下一条请求之前,一定要收到下一个随机值才行。

  • 服务器允许在一段时间内使用同一个随机数。

    可能会有一定次数的重放攻击的可能性。

  • 客户端和服务器使用同步的、可以预测的随机数生成方法。

报文完整性保护

如果使用了完整性保护(qop=”auth-init”),对应的内容就是对实体主体部分,而不是报文主体部分的散列,对于发送者,要在应用任意传输编码方式之前计算,而对于接收者,则应在去除所有传输编码之后计算。

总结安全隐患和相应解决方案

  • 重放攻击。

    用生成随机数解决,可能可以包括IP地址、时间戳、资源Etag等计算摘要。

  • 多重认证机制。

    比如同时存在基本认证和摘要认证时。可以考虑使用最强认证方案。

  • 首部篡改。

    防范方式:要么端到端加密,要么对首部进行数字签名,最好二者结合。

  • 词典攻击。

    没有好的对策,设置合理的密码过期策略,和难以猜测和破译的密码吧。

  • 恶意代理攻击和中间人攻击。

    没有更好的方法,唯一方式是使用SSL。

  • 选择明文攻击。

    利用摘要词典获取密码明文,或者暴力枚举可能的密码。

  • 存储密码。

    如果摘要认证密码文件被入侵,攻击者就获取到域中所有文件,而无需进行解码了。消除这个问题的方法:(1)加强保护 (2)确保域名在所有域中是唯一的。如果密码文件被入侵,所造成的破坏也局限于某一特定域。

摘要加密没有为内容的安全提供保障,可能可以知道内容是否被篡改,真正安全的事务是通过SSL才能实现。

谢谢你的鼓励