基本认证:
// (a)客户端:查询
GET /cgi-bin/checkout?cart=17854 HTTP/1.1
// (b)服务器:质询
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Shopping Cart"
// (c)客户端:响应
GET /cgi-bin/checkout?cart=17854 HTTP/1.1
Authorization: Basic YnJpYW4tdG90dHk6T3ch
// (d)服务器:成功,返回信息
HTTP/1.1 200 OK
基本认证的缺陷在于:账号和密码是明文发送,不安全.
摘要认证:
// (a)客户端:查询
GET /cgi-bin/checkout?cart=17854 HTTP/1.1
// (b)服务器:质询
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
realm="Shopping Cart"
qop="auth,auth-int"
nonce="66C4EF58DA7CB956BD04233FBB64E0A4"
// (c)响应
GET /cgi-bin/checkout?cart=17854 HTTP/1.1
Authorization: Digest
username="bri"
realm="Shopping Cart"
nonce="66C4EF58DA7CB956BD04233FBB64E0A4"
uri="/cgi-bin/checkout?cart=17854"
qop="auth"
nc=0000001,
cnonce="CFA9207102EA210FFC1120F6001110D073"
response="E483C94FOB3CA29109A7BA83D10FE519"
// (d)成功
HTTP/1.1 200 OK
Authorization-Info: nextnonce=
"29FE72D109C7EF23841AB914F0C3B831"
qop= 0auth0
rspauth="89F5A4CE6FA932F6C4DA120CEB754290"
cnonce="CFA9207102EA210EA210FFC1120F6001110D073"
....
摘要认证的3个组件:
// *摘要由以下3个组件计算出来:
// 1.由单向散列函数H(d)和摘要KD(s,d)组成的一对函数,其中s表示密码,d表示数据
// 2.一个包含了安全信息的数据块,包括密码,称为A1
// 3.一个包含了请求报文中非保密属性的数据块,称为A2
安全性相关的数据(A1)
// A1是密码和受保护信息的产物,它包含有用户名、密码、保护域和随机数等内容
与报文有关的数据(A2)
// 数据库A2表示的是与报文自身有关的信息,比如URL、请求方法和报文实体的主体部分
// A2有助于防止方法、资源或报文被篡改
摘要认证会话
// 客户端在响应保护空间的WWW-Authenticate质询时(请求账号、密码信息),会启动一个此保护空间的认证会话
// 在客户端收到另一条来自保护空间的任意一台服务器的WWW-Authenticate质询之前,认证会话会一直持续
预授权
// 在普通的认证方式中,事务结束之前,每条请求都要有一次 请求/质询 的循环
// 如果客户端事先知道下一个随机数是什么,就可以取消这个 请求/质询 循环
// 这样客户端就可以在服务器发出请求之前,生成正确的Authorization首部了.
对称认证
// RFC 2617扩展了摘要认证机制,允许客户端对服务器进行认证.
// 通过提供客户端随机数来实现的.
// 它是可选的.
增强保护质量
// 可以在三种摘要首部中提供qop(保护质量)字段:WWW-authenticate、Authorization和Authentication-Info
// 通过qop字段,客户端和服务器可以对不同类型及质量的保护进行协商.
多重质询
// 服务器可以对某个资源发起多重质询.如:服务器不了解客户端的能力,可以既提供基本认证质询,又提供摘要认证质询
// 客户端在面对多重质询时,必须以它所支持的最强的质询机制来应答
差错处理
// 在摘要认证中,如果某个指令或其值使用不当,或者缺少某个必要指令,就应该使用响应400 Bad Request
// 如果请求的摘要不匹配,就应该记录一次登录失败.某客户端连续多次失败可能说明有攻击者正在猜测密码
保护空间
// 阈值,与被访问服务器的标准根URL结合在一起,定义了保护空间
// 通过域可以将服务器上的受保护资源划分为一组保护空间,每个空间都有自己的认证机制 和/或 授权数据库
参考《HTTP权威指南》P308~P318