HTTP digest 认证

上一编中讲到了HTTP的基本认证,本文继续讲述HTTP的另外一种认证方式-摘要认证。

认证的过程依然是分为4个步骤,只是细节有些区别。

1. 用户请求受保护的资源,例如:

[html]  view plain copy
  1. GET http://192.168.2.1/ HTTP/1.1  
  2. Accept: text/html, application/xhtml+xml, */*  
  3. Accept-Language: zh-CN  
  4. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)  
  5. Accept-Encoding: gzip, deflate  
  6. Connection: Keep-Alive  
  7. Host: 192.168.2.1  

2. 服务端返回401未认证的错误

[html]  view plain copy
  1. HTTP/1.1 401 Unauthorized  
  2. Content-Type: text/html; charset=GB2312  
  3. Date: Wed, 28 Aug 2013 19:28:03 GMT  
  4. Last-Modified: Wed, 28 Aug 2013 19:28:03 GMT  
  5. Accept-Ranges: bytes  
  6. Connection: close  
  7. Cache-Control: no-cache,no-store  
  8. WWW-Authenticate: Digest realm="abcdalom.com", nonce="0123456789abcdef"
  9.   
  10. <HTML>  
  11. <HEAD><TITLE>401 Unauthorized</TITLE></HEAD>  
  12. <BODY BGCOLOR="#FFFFFF" TEXT="#483D8B" LINK="#2020ff" VLINK="#4040cc">  
  13. <H2>401 Unauthorized</H2>  

401错误的HTTP头部中都会带有WWW-Authenticate字段,其中指明了服务端支持的认证方式,一般为Basic(基本认证)和 Digest(摘要认证)两种可选值。在上文的回应中可见,服务端支持的认证方式为摘要认证。在WWW-Authenticate字段中,除了指明使用摘要认证外,还包括了realm和nonce(随机字符串)。


3. 加入用户信息,重新发送请求

需要在HTTP头部中加入Authorization字段,并显示指明认证方式(认证方式可由第2步获取)。摘要信息的计算如下所示:

static int digest_compute(Authentication_t *auth)
{
	char *elem[3], ha1[33], ha2[33];
	char dst[128];
	printf("nonce:%s.\r\n",auth->nonce);
	printf("realm:%s.\r\n",auth->realm);
	printf("uri:%s.\r\n",auth->url);
	printf("method:%s.\r\n",auth->method);
	// MD5(username:realm:password) ,   USERINFODIGEST
	elem[0] = auth->user;
	elem[1] = auth->realm;
	elem[2] = AUTH_DEFAULT_PWD;
	md5_hash( elem, 3, ha1 );
	// MD5(method:url) ,        MURLDIGEST
	elem[0] = auth->method;
	elem[1] = auth->url;
	md5_hash( elem, 2, ha2 );
	// MD5(USERINFODIGEST:nonce:MURLDIGEST)
	elem[0] = ha1;
	elem[1] = auth->nonce;
	elem[2] = ha2;
	md5_hash( elem, 3, dst);
	printf("Digest response: %s\n",dst);
	return TRUE;
}

注:realm和nonce必须使用第2步中获取到的值,method方法要根据实际中使用HTTP方法,例如下面的HTTP请求,采用的方法为“GET"

[html]  view plain copy
  1. GET http://192.168.2.1/ HTTP/1.1  
  2. Accept: text/html, application/xhtml+xml, */*  
  3. Accept-Language: zh-CN  
  4. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)  
  5. Accept-Encoding: gzip, deflate  
  6. Connection: Keep-Alive  
  7. Authorization: Digest username="admin", realm="abcdalom.com", nonce="0123456789abcdef", uri="http://192.168.2.1/", response="xfdsfji32309jfkfsd8923jfjsdif3jdsf" 
  8. Host: 192.168.2.1  

4. 服务端验证用户信息是否合法,如果合法请返回用户请求的资源。否则依然回应401的错误。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值