详解摘要认证

1. 什么是摘要认证


摘要认证与基础认证的工作原理很相似,用户先发出一个没有认证证书的请求,Web服务器回复一个带有WWW-Authenticate头的响应,指明访问所请求的资源需要证书。但是和基础认证发送以Base 64编码的用户名和密码不同,在摘要认证中服务器让客户端选一个随机数(称作”nonce“),然后浏览器使用一个单向的加密函数生成一个消息摘要(message digest),该摘要是关于用户名、密码、给定的nonce值、HTTP方法,以及所请求的URL。


2. 摘要认证算法


摘要认证规范最早定义在RFC 2069中,RFC 2069定义了由服务器生成随机数来维护安全性的摘要认证架构,认证结果是采用下列方法得出的:

HA1=MD5(username:realm:password)
HA2=MD5(method:digestURI)
response=MD5(HA1:nonce:HA2)


后来,RFC 2617引入一些可选的增强安全的方法代替了RFC 2069,这些增强的方法包括质量保护(QOP),客户端自增加计数器和客户端生成的随机数。这些可选参数提高了摘要认证的安全性,如可防止明文***。


如果算法指令是“MD5”或者未指定,HA1算法如下:

HA1=MD5(username:realm:password)


如果算法指令是“MD5-sess”,HA1算法

HA1=MD5(MD5(username:realm:password):nonce:cnonce)


如果质量保护指令是“auth”或未指定,HA2算法是

HA2=MD5(method:digestURI)


如果质量保护指定是“auth-int”,HA2算法是

HA2=MD5(method:digestURI:MD5(entityBody))


如果质量保护指定是“auth”或者“auth-int”,响应结果算法是

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


如果质量保护指令未指定,响应结果算法是

response=MD5(HA1:nonce:HA2)


3. MD5安全问题对摘要认证的影响


虽然MD5是可逆的,被认为是不安全的,但是在HTTP摘要认证过程中使用MD5算法中引入了一些随机数,使得数据的可逆性的难度大大提高,所以使用MD5是安全的。但如果用户的密码过于简单,通过字典或排序查找算法破解难度就大大降低了,因此不建议使用过于简单的密码。


RFC2617 的安全增强的主要方式:


发起请求的时候,服务器会生成一个密码随机数(nonce)(而这个随机数只有每次"401"相应后才会更新),为了防止***者可以简单的使用同样的认证信息发起老的请求,于是,在后续的请求中就有一个随机数计数器(cnonce),而且每次请求必须必前一次使用的打.这样,服务器每次生成新的随机数都会记录下来,计数器增加.在RESPONSE 码中我们可以看出计数器的值会导致不同的值,这样就可以拒绝掉任何错误的请求.


4. 摘要认证流程


  • 客户端请求一个需要认证的页面,但是不提供用户名密码

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

  • 浏览器会向用户提示认证域(realm)(通常是所访问的计算机或系统的描述),并且提示用户名和密码。

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

  • 服务器接受了认证并且返回了请求页面。如果用户名非法和/或密码不正确,服务器将返回"401"响应代码,然后客户端会再次提示用户输入用户名及密码。


5.一段摘要加密报文示例


有兴趣的用户可以根据摘要加密算法进行计算。

Authorization: 

Digest username="admin",     //用户名

realm="favourite digest realm",   //用户认证提示

nonce="1478047635099:8f32add4b6aaef23649ca330b25c64be",  //随机数

uri="/hello",  //请求地址

response="778110c2b5d0215e0d7640a6baa069a0",   //加密后的值

opaque="B2E49B2542089EE534695CA7742FB588",  

qop=auth,   //质量保护

nc=00000001,   //客户端自增加随机数计数器

cnonce="8664dcaabed7e083" //客户端的随机数


HA1=MD5("admin:favourite digest realm:password");

HA2=MD5("GET:"+uri);

response = MD5(HA1:nonce:nc:cnonce:qop:HA2)



你可能感兴趣的:(详解摘要认证)