摘要认证

摘要认证的改进

主要进行以下改进

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

摘要认证不是最安全的协议,摘要认证并不能满足安全HTTP事务的很多需求。对这些需求来说,使用传输层安全TLS和安全HTTP协议更为合适

用摘要保护密码

摘要认证的箴言是“绝不通过网络发送密码”,客户端不会发送密码,而是会发送一个“指纹“或密码的”摘要“

而服务器也是知道这个摘要的,就可以判断用户身份

摘要认证

单向摘要

摘要是对信息主体的浓缩,摘要是一种单向函数,主要用于将无限的输入转换为有限的浓缩输出值。

常见的摘要函数MD5,会将任意长度的字节序列转化为一个128位的摘要,也就有2的128次方种的输出值

如果不知道密码的话,要想正确地猜出发送给服务器的摘要将非常困难,同样,有摘要要猜出密码也很难

用随机数防止重放攻击

仅仅隐藏密码并不能避免危险,因为即使不知道密码,别有用心的人也可以截取摘要,并一遍遍地重放给服务器

为了防止此类重放攻击的发生,服务器可以向客户端发送一个称为随机数的特殊令牌,这个数会经常发生变化

客户端在计算摘要之前要先将这个随机数令牌附加到密码上去

摘要认证的握手机制

  • 服务器产生随机数,放在质询报文种,与服务器所支持的算法列表一同发往客户端
  • 客户端选择一个算法,计算出密码和其他数据的摘要,将摘要放在一条Authoration报文中发回服务器。如果客户端要对服务器进行认证,可以发送客户端随机数
  • 服务器接收摘要、选中的算法以及支撑数据,计算出与客户端相同的摘要,然后服务器将本地生成的摘要与传过来的进行比较,验证其是否匹配,如果客户端反过来质询,就会创建客户端摘要。服务器可以预先将下一个随机数计算出来提前传递给客户端,这样下一次客户端就可以预先发送正确的摘要了

摘要的计算

摘要算法的输入数据

  • 由单向散列函数H(d)和摘要KD(s,d)组成的一对函数,其中s表示密码,d表示数据
  • 一个包含了安全信息的数据块,包括密码,称为A1
  • 一个包含了请求报文中非保密属性的数据块,称为A2

H和KD处理两块数据A1和A2,产生摘要

算法H(d)和KD(s,d)

摘要认证支持对各种摘要算法的选择。RFC 2617建议的两种算法为MD5和MD5-sess,默认算法为MD5

与安全性相关的数据(A1)

被称为A1的数据块是密码和受保护信息的产物,它包含有用户名、密码、保护域和随机数等内容

A1只涉及安全信息,与底层报文自身无关

与报文有关的数据(A2)

数据块A2表示的是与报文自身有关的信息,比如URL、请求方法和报文实体的主体部分。

A2有助于防止方法、资源或者报文被篡改

保护质量有两种策略

  • 第一种只包含HTTP请求方法和URL,当qop=”auth”时使用这个默认策略
  • 第二种添加了报文实体的主体部分,以提供一定程度的报文完整性检测。qop = “auth-int”时使用

摘要认证会话

客户端响应对保护空间的WWW-Authenticate质询时,会启动一个此保护空间的认证会话,在客户端收到另一台服务器质询之前,认证会话会一直持续并纪录相关信息

随机数过期时,服务器也可以选择接收其中的信息,也可以返回一个带有新随机数的401响应,让客户端重试这条请求,指定这个响应为stale=true,可以避免重新输入用户名和密码

预授权

预授权能减少报文的数量,如果客户端事先知道下一个随机数是什么,就可以直接生成下一轮信息而不用再请求质询

预授权

几种预授权方式

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

    破坏了对同一台服务器的多条请求进行管道化的功能,在发布下一条请求之前,一定要收到下一个随机值

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

    使攻击者更容易实行重放攻击,降低了安全性,但是在可控范围内

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

    采用时间同步的随机数生成算法,根据共享的密钥,生成第三方无法轻易预测的、相同的随机数序列

应该要考虑的问题

多重质询

服务器可以对某个资源发起多重质询,比如,可以向客户端要求提供基本认证质询,有要求提供摘要认证质询

客户端面对多重质询时,必须以它支持的最强的质询机制来应答

差错处理

在摘要认证中,如果某个指令或其值使用不当,或缺少某个必要指令,就应该使用响应”400 Bad Request”

如果请求的摘要不匹配,就应该纪录一次登录失败,某客户端连续多次失败可能说明有攻击者在猜测密码

重写URI

代理可以通过改变URI语法,而不改变所描述的实际资源的方式来重写URI,这可能会破坏摘要认证

安全性考虑

首部篡改

要么进行端到端加密,要么对首部进行数字签名——最好是两者的结合

重放攻击

像前面提到的产生变化的随机数计算出摘要给攻击者带来障碍,但是依然存在一个重要的缺陷

用客户端IP地址来创建随机数会破坏经过代理集群的传输。在这类传输中,来自单个用户的多条请求可能会穿过不同的代理。而且IP欺骗也不难实现

可以完全避免的方法是为每个事务都使用一个唯一的随机数,只对指定的事务有效,只在超时值的持续区间内有效

这种方式会增加服务器的负担,但这种负担可以忽略不计

多重认证机制

直接让客户端总是选择可用认证方案中功能最强的那个,或者用一个只维护最强认证方案的代理服务器

词典攻击

典型的密码猜测型攻击方式。恶意用户对某个事务进行监听,并试图破解

除了使用相对难以破译的密码和合适的密码过期策略之外,没有什么好的方法可以解决这个问题

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

采用窃听的形式,用最薄弱的认证策略来取代现有的认证机制,对其进行修改,比如使用扩展接口

防止这种攻击的唯一简便的方式是使用SSL

选择明文攻击

中间有一个被入侵的或恶意的代理在拦截流量,就可以容易地为客户端地响应计算提供随机数

  • 预先计算的词典攻击

    发起攻击的服务器用预先确定的随机数和常见密码的变化形式产生一组响应,创建一个词典,随着词典规模的扩大,就有可能能够提前搜索到匹配项,就捕获了这个用户的密码

  • 批量暴力型攻击

    用一组机器枚举指定空间内所有可能的密码

防止策略:配置客户端使用可选的cnonce指令,这样响应就是基于客户端的判断产生的,再结合一些强制使用合理强密码的策略以及一个好的密码过期策略,就可以完全消除选择明文攻击的威胁

存储密码

如果摘要认证密码文件被入侵了,攻击者马上就能够使用域种所有文件,不需要再解码了

解决方式:

  • 增强保护力度
  • 确保域名在所在域中是唯一的。

摘要认证
https://blog-theta-ten.vercel.app/2021/09/05/摘要认证/
作者
Chen
发布于
2021年9月5日
许可协议