摘要认证步骤:
1. 客户端访问一个受http摘要认证保护的资源。
2. 服务器返回401状态以及nonce等信息,要求客户端进行认证。
HTTP/1.1 401 Unauthorized
WWW-Authenticate:Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
3. 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为MD5算法)的摘要信息返回给服务器。
认证必须的五个情报:
・ realm : 响应中包含信息
・ nonce : 响应中包含信息
・ username : 用户名
・ digest-uri : 请求的URI
・ response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串。
Authorization:Digest
username="Mufasa", ← 客户端已知信息
realm="testrealm@host.com", ← 服务器端质询响应信息
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", ← 服务器端质询响应信息
uri="/dir/index.html", ← 客户端已知信息
qop=auth, ← 服务器端质询响应信息
nc=00000001, ← 客户端计算出的信息(请求计数器)
cnonce="0a4f113b", ← 客户端计算出的客户端nonce
response="6629fae49393a05397450978507c4ef1", ← 最终的摘要信息 ha3
opaque="5ccc069c403ebaf9f0171e9517f40e41" ← 服务器端质询响应信息
4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。
特记事项:
1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。
2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身。
3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。
4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。
※ nonce:随机字符串,每次返回401响应的时候都会返回一个不同的nonce。
※ nounce:随机字符串,每个请求都得到一个不同的nounce。
※ MD5(Message Digest algorithm 5,信息摘要算法)
① 用户名:realm:密码 ⇒ ha1
② HTTP方法:URI ⇒ ha2
③ ha1:nonce:nc:cnonce:qop:ha2 ⇒ ha3
---------------------------------------
补充参数说明:
客户端在后续提交请求时,
重复用服务器密码随机数(nonce)
每次产生新的客户端密码随机数(cnonce)
计数器(nc)++ (请求计数器每次都增加1)
然后依 保护质量(qop)类型,确定response 值
重复用服务器密码随机数(nonce)
每次产生新的客户端密码随机数(cnonce)
计数器(nc)++ (请求计数器每次都增加1)
然后依 保护质量(qop)类型,确定response 值
服务端收到后,依qop类型,用同样的算法,算出值与客户端带过来的response值对比。
nonce过期处理:
当服务端密码随机数nonce过期时,
返回 401,并在认证头中添加stale=TRUE
// ":"作为各个参数的分割符
HA1 : md5("username:realm:pwd")
HA2 : md5("GET:/xx/xx/index.html")
qop:为"auth"或"auth-int"
Response = md5("HA1:nonce:nc:cnonce:qop:HA2")
qop:未指定
Response = md5("HA1:nonce:HA2")
--------------------
参考资料
http://blog.csdn.net/jesse881025/article/details/43669625