第一篇:HTTP协议学习心得体会
HTTP协议学习心得体会
HTTP(HyperText Transfer Protocol)
====================================
是TCP/IP协议集中的一个应用层协议,用于定义浏览器和Web服务器之间交换数据的过程以及数据本身的格式。现在被广泛使用的是HTTP1.1,相对于1.0,1.1的最大特点是支持持续连接。
基于HTTP1.0协议的客户机与服务器的信息交换过程包括四个步骤:建立连接;发送请求信息;回送响应信息;关闭连接。
通信过程总是通过浏览器发送请求来启动的,Web服务器则是被动地对这些请求作出响应。HTTP协议是无状态的。
HTTP1.1与HTTP1.0的比较
------
HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接。服务器不跟踪每个客户机,也不记录过去的请求。为了克服HTTP1.0的这个缺陷,HTTP1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。HTTP1.1还允许客户端不用等待上一次请求结果返回,就可以发送下一次请求,但服务器端必须按照接受到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。
HTTP1.1还增加了host请求头字段,用于明确表示访问服务器上的哪个web站点,可以在一个IP地址和端口号上使用不同的主机名来创建多个虚拟web站点。HTTP1.1还有keep-alive请求头来支持持续连接。
HTTP消息的格式
-----------------------
一个完整的请求消息包括:一个请求行,若干消息头,以及实体内容,其中消息头和实体内容都是可选的。消息头和实体内容之间要用空行隔开。浏览器使用GET方式的请求消息可以放松不含实体内容的请求消息。只有使用POST, PUT, DELETE方式的请求消息中才可以包含实体内容。
Hypertext Transfer Protocol
GET / HTTP/1.1rn
Request Method: GET
Request URI: /
Request Version: HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap,application/x-shockwave-flash, application/vnd.ms-excel, application/vn
Accept-Language: zh-cnrn
UA-CPU: x86rn
Accept-Encoding: gzip, deflatern
User-Agent: Mozilla/4.0(compatible;MSIE 7.0;Windows NT 6.0;SLCC1;.NET CLR
2.0.50727;.NET CLR 3.0.04506)rn
Connection: Keep-Alivern
rn
一个完整的响应消息包括:一个状态行,若干消息头,以及实体内容。同样,消息头和实体内容都是可选的。消息头和实体内容之间要用空行隔开。消息响应的实体内容就是网页文档的内容。
Hypertext Transfer Protocol
HTTP/1.1 200 OKrn
Request Version: HTTP/1.1
Response Code: 200
Cache-Control: privatern
Content-Type: text/html;charset=UTF-8rn
Set-Cookie:
PREF=ID=7f53f6f0b1511417:NW=1:TM=1205568884:LM=1205568884:S=zHreYqNC-Z3rmOc6;expires=Mon, 15-Mar-2010 08:14:44 GMT;path=/;domain=.google.cnrn
Content-Encoding: gziprn
Server: gwsrn
Transfer-Encoding: chunkedrn
Date: Sat, 15 Mar 2008 08:14:44 GMTrn
rn
HTTP chunked response
Data chunk(1025 octets)
Chunk size: 1025 octets
Data(1025 bytes)
HTTP消息头
----------------
HTTP请求和响应都使用消息头来描述HTTP消息本身的信息,可以实现HTTP客户机与服务器之间的条件请求和应答。
消息头可以分为:通用消息头,请求头,响应头,实体头四类。
请求行与状态行
-----------------------
请求消息的请求行包括三个部分:请求方式,资源路径,以及使用的HTTP版本。如:GET /
HTTP/1.1rn。
响应消息的状态行包括三个部分:HTTP协议的版本号,一个表示成功或者失败的整数代码(状态码)和对状态码进行描述的文本信息。如:HTTP/1.1 200 OKrn。
使用GET和POST方式传递参数
-------------
在URL地址后面可以附加一些参数,每个参数由参数名和参数值组成,例如:当使用GET方式提交表单内容时,浏览器将各个表单字段元素及其数据按照URL参数的格式附加在请求行中的资源路径后面。使用GET方式传送的数据量有限制,一般在1KB以下。
当使用POST方式提交表单内容时,浏览器将个表单字段元素及其数据作为HTTP消息的实体内容发送给服务器。因此数据量可以比GET方式大的多。使用POST方式时,还必须将Content-Type消息头设置为“application/x-www-form-urlencoded”,将Content-length消息头设置为实体内容的长度。
响应状态码
---------------
1.100~199: 成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程。
2.200~299: 成功接受请求并已完成整个处理过程。
3.300~399: 为完成请求,客户端需要进一步细化请求。
4.400~499: 客户端的请求有错误。
5.500~599: 服务器段出现错误。
通用信息头
==============
即能用于请求消息,也能用于响应消息,包括一些与被传输的实体内容没有关系的常用消息头字段。
1.Cache-Control
2.Connection
3.Date
4.Pragma
5.Trailer
6.Transfer-Encoding
7.Upgrade
8.Via
9.Warning
Cache-Control
--------------------
如果位于请求消息头,用于通知位于客户机和服务之间的代理服务器如何使用已缓存的页面,可以取值为:no-cache, no-store, max-age, max-stale, min-fresh, no-transform, only-if-cached等。
如果位于响应消息头,用于通知客户机和代理服务器如何缓存该页面,可以取值为:public, private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, max-age, s-maxage等。
Connection
---------------
用于指定处理完本次请求/响应后,客户端与服务器是否还要继续保持连接。如果为Keep-Alive,则保持连接,如果为close,则关闭。HTTP1.1默认采用持久连接。
Date
---------
表示HTTP消息产生的当前时间。服务器回送的正常响应消息中,应该总是设置Date头字段。如果客户机发送的请求消息中包含有实体内容,也要设置Date。
Pragma
------------
只能固定为no-cache.Trailer
-----------
一些头字段可以放置在整个HTTP消息的尾部。
Transfer-Encoding
---------------------
指定传输编码方式,目前标准的设置值只有chunked,用于把整个消息分成一连串的分段后进行传输。
Upgrade
------------
允许客户机指定它所支持并希望将当前协议切换到的通信协议。
Via
-----
用于指定HTTP消息所途径的中介代理服务器名称和所使用的协议。
请求头
=========
客户端可以接受的数据类型,压缩方法,语言,以及发出请求的超链接所属页面的URL地址等信息。Accept:指出客户端程序能够处理的MIME类型。
Accept-Charset:用于指出客户端程序可以使用的字符集。
Accept-Encoding:客户机能够进行解码的数据编码方式。
Accept-Language:指定客户机期望服务器返回哪个国家语言的文档。
Authorization:两种认证方式BASIC,和DIGEST.Except:
From:
Host: 指定资源所在的主机号和端口号。HTTP1.1中每个请求消息中都必须包含Host请求字段。If-Match:
If-Modified-Since:
If-None-Match:
If-Range
If-Unmodified-Since
Max-Forwards:
Proxy-Authorization:
Range:
Referer: 当单击另一个网页上的超链接时发出的请求在Referer字段中指定URL。
TE:
User-Agent:
响应头
==========
Accept-Range, Age, Etag,Location: 用于通知客户机应当到哪个新的地址去获取文档。状态码为300~399的响应消息都应该使用Location字段将新的文档地址告诉客户机,以便客户机自动重新连接到新地址并检索新文档。使用Location头的HTTP消息不应该有实体内容。所以,HTTP消息头中不能同时出现Location和Content-Type这两个头字段。
Proxy-Authenticate,Retry-After, Server, Vary, WWW-Authenticate。
实体头
========
是实体内容的元信息,描述了实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。
Allow: 指定客户端请求的资源所支持的请求方法(如GET,POST等)。
Content-Encoding: 指定实体内容的压缩编码方式。
Content-Language:
Content-Length: 用于表示实体内容的长度(字节数),浏览器与Web服务器之间使用持久连接时,这个字段在非Chunked传输编码的响应消息中是必不可少的。
Content-Location: 指定响应消息中所封装的实体内容的实际位置路径。
Content-MD5, Content-Range, Content-Type
Expires: 指定当前文档应该在什么时候被认为过期,浏览器到哪个时候以后不能再继续使用本地缓存,而是在有需要时应该像服务器发出新的请求访问。
Last-Modified:文档的最后更改时间。
扩展头
========
现在流行的浏览器实际上都支持Cookie,Set-Cookie,Refresh和Content-Disposition等几个常用的扩展头字段。
Refresh: 告诉浏览器多少秒后自动刷新页面。
第二篇:http协议介绍(模版)
(二)召开会议
民主生活会上,班子成员要紧紧围绕主题和征求到的意见建议,认真开展党性分析,深入查找问题,实事求是开展批评与自我批评。顺序为先班子、后个人,先主要负责人、后其他班子成员。党组织书记要对班子成员的发言逐个进行评议,班子成员之间也要互相进行评议,帮助查找存在的问题,提出改进的意见建议。
(三)会后工作。
领导班子要针对群众普遍关心、反映强烈和民主生活会上查找出来的问题,提出切实有效的整改措施,明确具体责任人和整改时限。班子成员也要制定和落实个人整改措施。本次民主生活会形成的整改措施和干部群众对上次民主生活会形成的整改落实情况的满意度,会后要在一定范围向干部群众通报,确保整改措施落到实处。会后6天内上报民主生活会情况报告,报告要附有会前征求到的干部群众意见材料、会后制定的整改措施。
六、会议要求
(一)召开民主生活会,提前10天向街道党工委报告,主动接受指导和监督。
(二)制定落实整改措施。民主生活会后,办公室、党员领导领导干部要根据民主生活会情况,进一步查找问题,逐项研究,深入分析,制定出切实可行的整改措施和方案。同时要把学习贯彻党的十七大精神同同履行岗位职责结合起来,切实转变作风,做好本职工作,提高工作效率和和工作水平,发挥好党员领导干部表率带动作用。
(三)上报民主生活会情况。召开民主生活会的情况、原始记录、会前征求意见、整改措施和方案及上次民主生活会整改措施落实情况,要及时上报街道党工委备案。
第三篇:常用的HTTP协议状态码
常用的HTTP协议状态码
200Standard response for successful HTTP requests.301This and all future requests should be directed to the given.403forbidden request(matches a deny filter)=> HTTP 403
Not Found,服务器找不到请求的页面。
Internal Server Error(内部服务器错误)
A generic error message, given when no more specific message is suitable.502the server returned an invalid or incomplete response => HTTP 502
Service Unavailable(服务当前不可用),可能因为超载或停机维护。
The server is currently unavailable(because it is overloaded or down for maintenance).504the server failed to reply in time => HTTP 504
-The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.更多:
一些常见HTTP状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 常见HTTP状态码大全
1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。
代码 说明
http状态码 100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
http状态码 101(切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx(成功)
表示成功处理了请求的状态代码。代码 说明
http状态码 200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
http状态码 201(已创建)请求成功并且服务器创建了新的资源。http状态码 202(已接受)服务器已接受请求,但尚未处理。
http状态码 203(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。
http状态码 204(无内容)服务器成功处理了请求,但没有返回任何内容。http状态码 205(重置内容)服务器成功处理了请求,但没有返回任何内容。http状态码 206(部分内容)服务器成功处理了部分 GET 请求。3xx(重定向)
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。代码 说明
http状态码 300(多种选择)针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择。http状态码 301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。http状态码 302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
http状态码 303(查看其他位置)请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
http状态码 304(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。http状态码 305(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
http状态码 307(临时重定向)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
代码 说明
http状态码 400(错误请求)服务器不理解请求的语法。
http状态码 401(未授权)请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
http状态码 403(禁止)服务器拒绝请求。
http状态码 404(未找到)服务器找不到请求的网页。http状态码 405(方法禁用)禁用请求中指定的方法。
http状态码 406(不接受)无法使用请求的内容特性响应请求的网页。http状态码 407(需要代理授权)此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
http状态码 408(请求超时)服务器等候请求时发生超时。
http状态码 409(冲突)服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
http状态码 410(已删除)如果请求的资源已永久删除,服务器就会返回此响应。
http状态码 411(需要有效长度)服务器不接受不含有效内容长度标头字段的请求。
http状态码 412(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。
http状态码 413(请求实体过大)服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
http状态码 414(请求的 URI 过长)请求的 URI(通常为网址)过长,服务器无法处理。
http状态码 415(不支持的媒体类型)请求的格式不受请求页面的支持。http状态码 416(请求范围不符合要求)如果页面无法提供请求的范围,则服务器会返回此状态代码。
http状态码 417(未满足期望值)服务器未满足”期望”请求标头字段的要求。
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
代码 说明
http状态码 500(服务器内部错误)服务器遇到错误,无法完成请求。http状态码 501(尚未实施)服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。http状态码 502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。
http状态码 503(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
http状态码 504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。
http状态码 505(HTTP 版本不受支持)服务器不支持请求中所用的 HTTP 协议版本
第四篇:HTTP协议以及Python开发技巧
TTPYTHONhttp协议的相关知识应该都很清楚,这里简单回顾下其流程。首先HTTP底层是利用TCP进行通讯的;其次,HTTP本身协议是面向无连接的:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
Python采用httplib库进行HTTP通讯,用法很简单:
import httplib #导入httplib库
conn = httplib.HTTPConnection(“10.197.32.136”,8080)#建立http链接,只需要IP地址和端口
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str,{})#发送url请求
response = conn.getresponse()#获取返回信息
conn.close()#关闭链接
request函数是非阻塞函数,也就是说,它向服务器发送了url请求之后,可以正常运行之后的任务。
getresponse函数是阻塞函数,如果没有收到服务器的返回信息,程序将无法继续。
close函数在任何地方都可以调用,因此,如果无需服务器返回信息,则可以在发送请求之后就关闭链接。
Httplib无法连续发送两个request,例如:
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str1,{})conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str2,{})
程序将会抛异常,并且关闭。因为http协议本身一次链接只支持一个request,在收到response或者关闭才能开启下一次链接。所以,正常的程序应该是:
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str1,{})
conn.close()
或者:
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str1,{})
response = conn.getresponse()
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str2,{})conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str2,{})
第五篇:http头文件分析心得体会
http头文件分析心得体会
一、http简介
HTTP即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(“,结果称为 HA2。
3、对HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的
response 值。
因为服务器拥有与客户端同样的信息,因此服务器可以进行同样的计算,以验证客户端提交的 response 值的正确性。在上面给出的例子中,结果是如下计算的。
(MD5()表示用于计算MD5哈希值的函数;“”表示接下一行;引号并不参与计算)
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值。
服务器应当记住最近所生成的服务器密码随机数nonce的值。也可以在发行每一个密码随机数nonce后,记住过一段时间让它们过期。如果客户端使用了一个过期的值,服务器应该响应“401”状态号,并且在认证头中添加stale=TRUE,表明客户端应当使用新提供的服务器密码随机数nonce重发请求,而不必提示用户其它用户名和口令。
服务器不需要保存任何过期的密码随机数,它可以简单的认为所有不认识的数值都是过期的。服务器也可以只允许每一个服务器密码随机数nonce使用一次,当然,这样就会迫使客户端在发送每个请求的时候重复认证过程。需要注意的是,在生成后立刻过期服务器密码随机数nonce是不行的,因为客户端将没有任何机会来使用这个nonce。
语法:
challenge
= ”Digest“ digest-challenge
digest-challenge = 1#(realm | [ domain ] | nonce |
[ opaque ] |[ stale ] | [ algorithm ] |
[ qop-options ] | [auth-param])
domain
= ”domain“ ”=“ <”> URI(1*SP URI)<“>
URI
= absoluteURI | abs_path
nonce
= ”nonce“ ”=“ nonce-value
nonce-value
= quoted-string
opaque
= ”opaque“ ”=“ quoted-string
stale
= ”stale“ ”=“(”true“ | ”false“)
algorithm
= ”algorithm“ ”=“(”MD5“ | ”MD5-sess“ |
token)
qop-options
= ”qop“ ”=“ <”> 1#qop-value <“>
qop-value
= ”auth“ | ”auth-int“ | token
realm:让客户知道使用哪个用户名和密码的字符串。不同的领域可能密码不一样。至少告诉用户是什么主机做认证,他可能会提示用哪个用户名登录,类似一个Email。
domain:一个URI列表,指示要保护的域。可能是一个列表。提示用户这些URI采用一样的认证。如果为空或忽略则为整个服务器。nonce:随机字符串,每次401都不一样。跟算法有关。算法类似Base64加密:time-stamp H(time-stamp ”:“ ETag ”:“ private-key)。time-stamp为服务器时钟,ETag为请求的Etag头。private-key为服务器知道的一个值。
opaque:服务器产生的由客户下去请求时原样返回。最好是Base64串或十六进制字符串。
auth-param:为扩展用的,现阶段忽略。
其他域请参考RFC2617。
授权头语法:
credentials
= ”Digest“ digest-response
digest-response = 1#(username | realm | nonce | digest-uri
| response | [ algorithm ] | [cnonce] |
[opaque] | [message-qop] |
[nonce-count] | [auth-param])
username
= ”username“ ”=“ username-value
username-value = quoted-string
digest-uri
= ”uri“ ”=“ digest-uri-value
digest-uri-value = request-uri;As specified by HTTP/1.1
message-qop
= ”qop“ ”=“ qop-value
cnonce
= ”cnonce“ ”=“ cnonce-value
cnonce-value
= nonce-value
nonce-count
= ”nc“ ”=“ nc-value
nc-value
= 8LHEX
response
= ”response“ ”=“ request-digest
request-digest = <”> 32LHEX <“>
LHEX
= ”0“ | ”1“ | ”2“ | ”3“ |
”4“ | ”5“ | ”6“ | ”7“ |
”8“ | ”9“ | ”a“ | ”b“ |
”c“ | ”d“ | ”e“ | ”f“
response:加密后的密码
digest-uri:拷贝Request-Line,用于Proxy cnonce:如果qop设置,才设置,用于双向认证,防止攻击。
nonce-count:如果服务器看到同样的计数,就是一次重放。
示例:
401响应:
HTTP/1.1 401 Unauthorized
www.xiexiebang.comonce=”0a4f113b“,response=”6629fae49393a05397450978507c4ef1“,opaque=”5ccc069c403ebaf9f0171e9517f40e41"
一,用摘要保护密码
摘要认证的一个改进之处是用摘要代替密码的传输,遵循的基本原则是“绝对不通过网络发送明文密码”,而是发送一个密码的摘要信息,并且这摘要信息是不可逆 的,即无法通
过摘要信息反推出密码信息。而服务器本身是存储这个密码的(实际上,服务器只需知道密码的摘要即可),而客户端和服务器本身都知道这个密码。这样的话,服 务器可以读取客户端的摘要和本身知道的密码进行同样计算得出的摘要进行比较,若匹配,则验证通过。
摘要是对信息主体的浓缩,摘要是一种单向函数,主要用于将无限的输入值转为有限的浓缩输出值,如MD5,则是将任意长度的字节系列转换为一个128位的摘要。MD5输出的128位的摘要通常会写出32个十六进制的字符,每个字符表示4个bit。
二,用随机数防止重放攻击
使用单向摘要就无需以明文形式发送密码了,可以只发送密码的摘要,并且可以确信,没有哪个恶意用户能轻易的从摘要中解码出原始密码。
但是,摘要被截获也可能跟密码一起好用,为了防止重放攻击的发送,服务器可以向客户端发送一个称为随机数nonce的特殊令牌,这个数会经常发生变化(可 能是每毫秒,或者每次认证都发生变化,具体由服务器控制),客户端在计算摘要之前要先将这个随机数附加到密码上去。这样,在密码中加入随机数就会使得摘要 随着随机数的每次变化而变化,记录下的密码摘要只对特定的随机数有效,而没有密码的话,攻击者就无法计算出正确的摘要,这样就可以防止重放攻击的发生。
摘要认证要求使用随机数,随机数是在www.xiexiebang.comonce。如下例子:
GET/cgi-bin/checkout?a=b HTTP/1.1 Authorization: Digest username=”tenfyguo”
realm=”test realm”
nonce=” 66C4EF58DA7CB956BD04233FBB64E0A4” //服务器端的随机数一起带回
uri=”/cgi-bin/checkout?a=b” //必须跟请求行一致
qop=”auth” //保护质量参数
nc=0000001
cnonce=”xxxxx234132543strwerr65sgdrftdfytryts” //客户端随机数,用于对称校验
response=” ABC4EF58DA7CB956BD04345FBB64E0A4”//最终摘要
3,服务接受摘要,选择算法以及掌握的数据,重新计算新的摘要跟客户端传输的摘要进行比较,验证是否匹配,若客户端反过来用客户端随机数对服务器进行质询,就 会创建客户端摘要,服务可以预先将下一个随机数计算出来,提前传递给客户端,通过Authentication-Info发送下一个随机数。如下例子:
HTTP/1.1 200 OK Authorization-Info:nextnonce=” 88C4EF58DA7CB956BD04233FBB64E0A4”
qop=”auth”
rspauth=”23543534DfasetwerwgDTerGDTERERRE”
cnonce=” xxxxx234132543strwerr65sgdrftdfytryts”
四,摘要的计算
在说明如何计算摘要之前,先说明参加摘要计算的信息块。信息块主要有两种:
1,表示与安全相关的数据的A1。
A1中的数据时密码和受保护信息的产物,它包括用户名,密码,保护域和随机数等内容,A1只涉及安全信息,与底层报文自身无关。
若算法是:MD5 则A1= 若算法是:MD5-sess 则A1=MD5( ): 2,表示与报文相关的数据的A2.A2表示是与报文自身相关的信息,比如URL,请求反复和报文实体的主体部分,A2加入摘要计算主要目的是有助于防止反复,资源或者报文被篡改。 若qop未定义或者auth: A2= 下面定义摘要的计算规则: 若qop没有定义: 摘要response=MD5(MD5(A1): 若qop为auth: 摘要response=MD5(MD5(A1): 若qop为auth-int: 摘要response= MD5(MD5(A1): 五,随机数的生成 RFC2617建议采用这个假想的随机数公式: nonce = BASE64(time-stamp MD5(time-stamp “:” ETag “:” private-key))其中: time-stamp是服务器产生的时间戳或者其他不会重复的序列号,ETag是与所请求实体有关的HTTP ETag首部的值,priviate-key是只有服务器知道的数据。 这样,服务器就可以收到客户端的认证首部之后重新计算散列部分,如果结果与那个首部的随机数不符,或者是时间戳的值不够新,就可以拒绝请求,服务器可以通过这种方式来限制随机数的有效持续时间。 包括了ETag可以防止对已经更新资源版本的重放请求。注意:在随机数中包含客户端IP,服务器好像就可以限制原来获取此随机数的客户端重用这个随 机数了,但这会破坏代理集群的工作,使用代理集群时候,来自单个用户的多条请求通常会经过不同的代理进行传输,而且IP地址欺骗实现起来也不复杂。