文档介绍:http协议之digest(摘要)认证分类:小知识-技术2013-05-1309:50308人阅读评论(0)收藏举报digest认证httpmd5加密参考网址:#reply其中前面的5个是重要的,而前面2个是最重要的网上下载了一个thttpd的web服务器做为嵌入式的web服务,在完成了所有的功能之后,提出基于web服务httpd协议的所有功能都要进行保护,即进行认证。然后从网上开始找相关的资料,经过几天的时间,终于弄好了。在此不讨论basic认证,因为basic认证过于简单,直接传送的明文。我不理解这个digest单词的含义,也不理解rfc2617文档中digest-challenge的含义,现在还没有转过来呢。首先说明,以下的过程,只是基于我的内容方面的描述,可能不够全面,所以本文只做为普通参考。认证的过程总体上是:客户端请求资源->服务器返回认证标示->客户端发送认证信息->服务器查验认证,如果成功则继续资源传送,否则直接断开连接。服务器返回认证标示的必要内容如下:ealm="xx",qop="auth,auth-int",nonce="xx",opaque="xx"这个部分需要和http的协议头部分一起,即放在第一个空行的前面,其中的双引号也一同传输。在rfc2616文档中还定义了很多的其它域,各域之间都用“,”号隔开,这里用不到,不进行讨论。各域的值中,不允许出现冒号“:”,因为冒号在md5加密时是个连接符。另外所有的值都必需是可见字符,这和http协议的要求相一致。这个部分的内容很严格,如果弄不好,则客户端可能会提示错误,比如“协议冲突”、“拒绝服务”等情形同时返回401的Unauthorized错误。默认是md5加密,而且md5应该是用的最广的,所以对于algorithm域,无需添加。7上写的是一个email类型的字符串,我看这个没有必要意义,所以我就也简单地写了个email形式的字符串qop是认证的(校验)方式,这个比较重要,对后面md5的加密过程有影响,值就按照上面的那样写就行了nonce的值也是一个字符串,如果不严格,可以随机生成一个就行,注意它是个GUID,即唯一的、不重复的。如果严格,则需要包含时间信息、客户端IP信息和其它信息,因为认证过程的时间很短,所以如果服务器收到认证信息后发现这个时间和服务器的时间相去甚远,那说明不正常,直接拒绝,以防止攻击,还有客户端IP,如果这个IP一直这样攻击,则可以在一定时间内发现是该IP的连接则直接断掉。这些严格的做法主要是为了防止攻击。在rfc2617上有狭路为详细的描述。我这里没有考虑这些,只是使用了个简单的字符串opaque是个字符串,它只是透传而已,即客户端还会原样返回过来。实际上,上面的那些域,客户端都还是会原样返回的,但返回时除了以上的那些域之外,还会增加新的内容进来。客户端在收到401错误之后,根据上面的那些信息,需要用户输入用户名和密码,然后返回给服务器如下内容:Authorization:Digestusername="xx",realm="xx",qop="auth",nonce="xx",uri="path",cnonce="xx",nc=00000001,response="xx",opaque="xx"除了qop的值不一样之外,其它存在的那些域的值都是一样的,新增加