13.1 简介
-
什么是摘要认证
- 是一种HTTP认证协议
-
为什么会出现摘要认证
- 修复基本认证中存在的问题
-
摘要认证的优势
- 不会以明文的方式在网络上发送密码
- 可以防止重放攻击
- 可以防止报文被篡改
-
摘要认证的不足
- 相比公钥认证机制还是弱了点
- 大部分信息还是明文传输
13.1.1 工作原理
- 客户端发起请求
- 服务器响应401
- 随机数
- 劫持的摘要算法列表
- WWW-Authentcate: digest
- 客户端发送密码的摘要
- 选择一个算法加密密码
- 如果要验证服务器,还要发一个随机数
- Authorization
- 服务器验证摘要,并返回数据
- 根据客户端的数据计算摘要
- 对比2边算的摘要是否相同
13.1.2 摘要
-
什么是摘要
- 对信息主体的浓缩
- 是一种单向函数
- 用于把无限的输入值置换成有限长度的输出值
-
常见的摘要函数
- MD5
- SHA
13.1.3 重放攻击
-
什么是重放攻击
- 坏人拦截了摘要
- 用摘要重复发起请求
-
如何避免重放攻击
- 每次响应服务器发送一个随机码给客户端
- 客户端用随机码+官能计算摘要
-
为什么随机码可以避免重放攻击
- 随机码每次都会变
- 导致每次请求摘要都会变
- 坏人拿到的摘要只能用一次
13.2 算法
13.2.1 摘要算法的组成部分
- 散列函数
H(d)KD(s,d)- 一般使用MD5
- 安全信息
A1- 用户名user
- 密码password
- 需要授权才能访问的域名列表realm
- 随机数nonce
- 非保密信息
A2- URI
- 请求方法
- 报文主体
13.2.2 保护质量qop
-
什么是保护质量
- 就是设置摘要算法的安全等级
-
保护质量的2个取值
- auth也是默认值
- auth-int需要进行完整性验证
-
保护质量的缺点
- 因为要对额外的数据加密
- 会影响传输速度
-
设置qop=auth-int的注意事项
- 要对报文主体进行散列计算
- 服务器要在传输编码之前进行计算
- 客户端要在传输解码后进行计算
13.2.3 摘要算法
- A1的组成部分
- user : realm : password
- A2的组成部分
- qop为auth时
- method : uri
- qop为auth-int时
- method : uri : MD5(entity-body)
- qop为auth时
MD5(
MD5(A1)
:
<nonce>
:
<nc>
:
<cnonce>
:
<qop>
:
MD5(A2)
)
13.2.3 预授权
-
什么是预授权
- 服务器在响应时,把下一次的加密随机数也发给客户端
-
为什么需要预授权
- 每次请求都要走一个13.1.1中的验证循环比较浪费时间
- 通过预授权在后面的请求中,就可以省略第2步了
-
生成随机数的3种方式
- 直接生成一个随机数响应给客户端
- 破坏了管道化功能
- 因为每次请求都是不同的随机数
- 所以只能一个接一个的发请求
- 同个随机数可重用多次
- 可以进行管道化,用了几次之后再换
- 但是可能会被重放攻击
- 尽量把重用次数和有效时间设短一点
- 同步生成随机数
- 客户端和服务器用相对的算法生成随机数
- 直接生成一个随机数响应给客户端
13.2.4 生成随机数的最佳实践
- 随机数由哪些部分构成
- 时间戳
- 响应实体的ETag
- 一个私钥
13.2.5 对称认证
-
什么是对称认证
- 客户端也需要对服务器进行认证
- 服务器在的响应时,要把生成的摘要放在Authorization-Info里面
-
什么情况下使用对称认证
- 服务器提供了qop时就执行认证
- 没提供时可以不用
13.3 存在的问题
- 首部篡改
- 只保护了密码
- 其他首部都没有被保护起来
- 重放攻击
- 为了防止重放攻击
- 每次都要生成新的随机码,会加大服务器压力
- 多重认证机制
- 服务器在质询时,会提供多种认证方式包括基本认证,摘要认证等
- 如果客户端不支持摘要认证,就会选择基本认证
- 但这个缺点和摘要认证有毛关系啊,为什么要放这儿来介绍
- 词典攻击
- 拦截者会对摘要进行暴力破解
- 如果密码和随机数都比较简单的话,很容易猜出来
- 并且这个没办法避免
- 中间人攻击
- 中间人直接把服务器401质询修改成最简单的基本认证
- 客户端就会直接发送密码了
- 选择明文攻击
- 应该也算是中间人攻击
- 中间人把随机数换成自己的
- 然后再接收客户端的请求,拿出摘要来猜密码
- 因为知道了随机数,再猜密码就简单些了
- 存储密码
- 即服务器上存储的密码被盗了,一切都玩完
- 要为同一用户生成N多密码,不同的密码可以访问不同的网址,这样即使被盗了密码,损失相对较小