详解摘要认证
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解摘要认证相关的知识,希望对你有一定的参考价值。
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)
本文出自 “这个人的IT世界” 博客,请务必保留此出处http://favccxx.blog.51cto.com/2890523/1878505
以上是关于详解摘要认证的主要内容,如果未能解决你的问题,请参考以下文章
http协议之digest(摘要)认证,详细讲解并附Java SpringBoot源码