一、摘要认证的改进
1.用摘要保护密码
客户端不发送密码,而是发送一个摘要,服务端只需验证这个摘要是否和密码相匹配
2.单向摘要
a.摘要是一种单向函数,将无限的输入值转化为有限的
b.常见的摘要为MD5:
将任意长度的字节序列转换为一个128位的摘要;
MD5的128位摘要通常会被写成32个十六进制的字符,每个字符4位
3.用随机数防止重放攻击
a.黑客可以截获摘要对服务器无限制的重发攻击
b.可以将随机数添加到密码中,然后再根据具有随机数的密码生成摘要,这样每次生成的
摘要都不相同,可以防止重放攻击
4.摘要认证的握手机制
![](https://img-my.csdn.net/uploads/201302/15/1360902451_4054.png)
(1).服务器计算出一个随机数
(2).服务器将此随机数放在www-Authenticate中,随算法列表一起发往客户端
(3).客户端选择一个算法,计算出密码和其他数据摘要
(4).客户端将摘要放在一条Authorization响应中发往服务端
(5).服务器根据客户端发送的响应计算出相同的摘要,然后服务器将本地生成的摘要与网络
传送过来的摘要进行比较,验证是否匹配
二、摘要计算
1.摘要算法的输入数据
a.由单向散列函数H(d)和摘要KD(s,d)组成的一对函数,s为密码,d为数据
b.一个包含安全信息的数据块,称为A1
c.一个包含请求报文中非保密属性的数据块,成为A2
2.算法H(d)和KD(s,d)
H(<data>) = MD5(<data>)
KD(<secret>,<data>) = H(concatenate<secret>:<data>)
3.与安全相关的数据(A1)
密码和受保护信息的产物,包含用户名、密码、保护域、随机数
MD5
为每条请求运行单向散列函数,A1是由冒号连接起来的用户名、域、密码
MD5-sess
只在第一次www-Authenticate握手时运行一次散列函数
算法对A1的定义
![](https://img-my.csdn.net/uploads/201302/15/1360902467_2085.png)
ps:nonce为当前随机数;cnonce为客户端随机数
4.与报文有关的数据(A2)
包括URL、请求方法、报文实体,有助于防止方法、资源或报文被篡改
根据保护质量(qop),为A2提供两种策略:
a.只包含HTTP请求方法和URL,默认
b.添加报文实体,当qop="auth-init"时使用
算法对A2的定义
![](https://img-my.csdn.net/uploads/201302/15/1360902488_3644.png)
ps:request-method为请求方法;uri-directive-value为请求URI
5.摘要认证会话
客户端响应对保护空间的WWW-Authenticate质询时,会启动一个此保护空间的认证对话
6.预授权
摘要认证:
a.服务器预先在Authentication-Info首部中发送下一个随机数
b.服务器允许在一小段时间内使用同一个随机数
c.客户端和服务器使用同步的、可预测的随机数生成算法
7.随机数的选择
BASE64(time-stamp H(time-stamp ":" ETag ":" private-key))
time-stamp:服务器产生的时间戳
ETag:与所请求实体有关的ETag首部
private-key:只有服务器知道的数据
8.对称认证
客户端对服务器的认证
三、增强保护质量(报文完整性检查)
在三种摘要首部中提供qop字段:
WWW-Authenticate
Authorization
Authentication-Info
1.报文完整性保护(qop="auth-init")
四、应该考虑的实际问题
1.多重质询
服务器可以对某个资源发起多重质询,即既提供基本认证,又提供摘要认证
2.差错处理
认证服务器一定要确保URI指令指定的资源与请求行中指定的资源相同,否则返回400 BadRequest错误
3.保护空间
.域值与被访问服务器的标准根URL结合在一起定义了保护空间
.保护空间确定了可以自动应用证书的区域
.在基本认证中,客户端会假设请求URI中或其下的所有路径都与当前的质询处处于同
一个保护空间
.在摘要认证中,质询的WWW-Authenticate:domain字段对保护空间做了更精确的定义
4.重写URI
代理可以改变URI语法而不改变实际指向的资源来重写URI
由于摘要认证需要检查URI的完整性, 故URI一经修改会破坏摘要
5.缓存
共享缓存收到Authorization首部的请求并且转接那条请求产生的响应时,当响应中提供了
Cache-Control:must-revalidate和Cache-Control:public时才会将此响应作为任何其他
请求的应答使用
Cache-Control:must-revalidate:
缓存可以在应答后续请求时使用响应的实体部分,但是后续请求应该和原始服务器进行
验证
Cache-Control:public:
对任意后继请求都可以使用响应实体
五、安全性考虑
1.首部篡改
防篡改机制:
端到端加密与首部进行数字加密
2.重放攻击
3.多重认证机制
4.词典攻击
密码猜测估计
5.恶意代理攻击和中间人攻击
6.选择明文攻击
预先计算的词典攻击
批量暴力型攻击
7.存储密码