HTTP摘要认证

典型的认证过程

  • 客户端请求一个须要认证的页面,可是不提供[用户名]和[密码]。一般这是因为用户简单的输入了一个地址或者在页面中点击了某个[超连接]。html

  • 服务器返回[401] "Unauthorized" 响应代码,并提供认证域(realm),以及一个随机生成的、只使用一次的数值,称为[密码随机数 nonce]。c++

  • 此时,浏览器会向用户提示认证域(realm)(一般是所访问的计算机或系统的描述),而且提示用户名和密码。用户此时能够选择取消。算法

  • 一旦提供了用户名和密码,客户端会从新发送一样的请求,可是添加了一个认证头包括了响应代码。shell

  • 在这个例子中,服务器接受了认证而且返回了请求页面。若是用户名非法和/或密码不正确,服务器将返回"401"响应代码,而后客户端会再次提示用户输入用户名及密码。浏览器

  • 客户端请求 (无认证)服务器

GET /dir/index.html HTTP/1.0
Host: localhost
复制代码
  • 服务器响应
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",
                        qop="auth,auth-int",
                        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                        opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
  <HEAD>
    <TITLE>Error</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
  </HEAD>
  <BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>
复制代码
  • 客户端请求 (用户名 "Mufasa", 密码 "Circle Of Life")
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
                     realm="testrealm@host.com",
                     nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                     uri="/dir/index.html",
                     qop=auth,
                     nc=00000001,
                     cnonce="0a4f113b",
                     response="6629fae49393a05397450978507c4ef1",
                     opaque="5ccc069c403ebaf9f0171e9517f40e41"
复制代码
  • 服务器响应
HTTP/1.0 200 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984
复制代码

response生成的规则

qop: “质量保护”, 认证响应由下列组成(HA一、HA二、A一、及A2为字符串变量的名称):网站

HA1 = MD5(A1)= MD5(username:realm:password)

​ 若是 qop 值为“auth”或未指定,那么 HA2 为:spa

HA2 = MD5(A2)= MD5(method:disgestURI)

​ 若是 qop 值为“auth-int”,那么 HA2 为:code

HA2 = MD5(A2)= MD5(method:disgestURI:MD5(entityBody))

若是 qop 值为“auth”或“auth-int”,那么以下计算 response:cdn

response = MD5(HA1:nonce:nonceCount:clientNonce:qop:HA2)

若是 qop 未指定,那么以下计算 response:

response = MD5(HA1:nonce:HA2)

计算的示例:

以下所述,response 值由三步计算而成。当多个数值合并的时候,使用[冒号]做为分割符。

  1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
  2. 对HTTP方法以及[URI]的摘要的合并值计算 MD5 哈希值,例如,"GET""/dir/index.html",结果称为 HA2。
  3. 对 HA一、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的 response 值。
HA1 = MD5( "Mufasa:testrealm@host.com:Circle Of Life" )
       = 939e7578ed9e3c518a452acee763bce9

   HA2 = MD5( "GET:/dir/index.html" )
       = 39aff3a2bab6126f332b942af96d3366

   Response = MD5("939e7578ed9e3c518a452acee763bce9:dcd98b7102dd2f0e8b11d0f600bfb0c093:00000001:0a4f113b:auth:39aff3a2bab6126f332b942af96d3366" )
            = 6629fae49393a05397450978507c4ef1
复制代码

此时客户端能够提交一个新的请求,重复使用服务器密码随机数(nonce)(服务器仅在每次“401”响应后发行新的nonce),可是提供新的客户端密码随机数(cnonce)。在后续的请求中,十六进制请求计数器(nc)必须比前一次使用的时候要大,不然攻击者能够简单的使用一样的认证信息[重放]老的请求。由服务器来确保在每一个发出的密码随机数nonce时,计数器是在增长的,并拒绝掉任何错误的请求。显然,改变HTTP方法和/或计数器数值都会致使不一样的 response 值。

WWW-Authenticate 响应头参数说明

username: 用户名(网站定义)
password: 密码
realm:&emsp;服务器返回的realm,通常是域名
method: 请求的方法
nonce: 服务器发给客户端的随机的字符串
nc(nonceCount):请求的次数,用于标记,计数,防止重放攻击
cnonce(clinetNonce): 客户端发送给服务器的随机字符串
qop: 保护质量参数,通常是auth,或auth-int,这会影响摘要的算法
uri: 请求的uri(只是path)
response:&emsp;客户端根据算法算出的摘要值
复制代码

opaque:由服务器指定的字符串,客户端在后续指向同一个受保护区间的请求中应该在 Authorization 头中原样返回,建议使用 base64 或者 16 进制数。

相关文章
相关标签/搜索