纵有疾风起
人生不言弃

HTTP认证模式

HTTP认证模式 (2015-05-05 09:29:47)
转载

分类: Windows编程
http://www.adeploy.com/2012/08/17/http-auth-schemes/#more-93008
前言

最近在研究curl和httpclient,用到了HTTP认证相关的知识。

但是搜索之后发现,网上居然没有很全面的HTTP认证模式的介绍,尤其是中文的文章。

因此结合MS的Understanding HTTP Authentication和HttpClient Tutorial翻译加个人理解写了一篇。
一、简介

本篇博文简介了几种HTTP认证模式。文章内容要求读者对HTTP请求、响应的基本结构,HTTP状态码和HTTP协议头有一定的了解。

请参考Linux下cURL使用教程之二:HTTP协议概述。
二、HTTP访问认证框架

HTTP协议(RFC2616)定义了一个简单的访问认证模式框架。此框架假设有若干页面(被保护资源,也称作realm,区域),只能被特定的人访问,这些人可以在服务器要求时提供凭证。

当客户端如浏览器访问一个位于保护区域(protected realm)中的页面时,服务器返回包含401未认证状态码和www认证头(WWW-Authenticate header
field)的响应。返回的认证头中必须含有至少一个适用于请求页面的认证要求(challenge)。

然后客户端发起第二次请求,此次请求在请求头中包含了试用于服务器认证要求的认证头域。

如果服务器接受了客户端提供的凭证,它将返回客户端请求的页面。否则,服务端会返回另一个401未认证响应以提示客户端认证失败。

具体认证响应头和请求头的内容取决于认证的方式。RFC2616中定义了两种广泛使用的认证模式:

HTTP基本认证(HTTP Basic authentication)和HTTP摘要认证(HTTP Digest authentication)。

此外常用的还有NTLM、SPNEGO(HTTP协商认证,HTTP Negotiate authentication,是其一种)和Kerberos认证方式。
三、认证模式

1、基本认证Basic Access Authentication

基本认证是基于用户名密码的。

服务端的401响应中包含一个认证要求(authentication challenge),此认证要求中含有“Basic”关键字和一个用以表明访问的被保护资源名称的“名称=值”对,如下:

WWW-Authenticate: Basic realm=”Protected page”

如果你使用的浏览器,浏览器在接收到401响应时,将会弹出窗口让你输入用户名密码,然后发送认证请求。认证请求中同样包含”Basic”关键字,此外还有Base64编码后的用户名密码,如下:

Authorization: Basic QWRlcGxveSdzIGJsb2c=

服务器将用户名密码解码后比对,成功匹配后即认证成功。

因为Base64不算是一种加密方法:无密钥的可逆加密,任何人都可解密(百度搜索一下”在线解码“一大堆)。因此基本认证被认为是明文传输,安全性不好。极易出现密码被窃听和重放攻击等安全性问题。

如果资源需要更高强度的保护,请使用其他认证方法。

2、摘要认证HTTP Digest authentication

摘要认证被设计用来弥补基本认证的缺点。摘要认证基于请求-响应(challenge-response)模式,而且使用了哈希加密算法(常用为MD5),从而某些程度上解决了基本认证安全性的问题。

服务器返回的初始401响应的www认证头(WWW-Authenticate header)中多出了一个称为nonce的随机数的字段。服务端保证每个401响应中的nonce值唯一。如:

Authorization: Digest username=”admin”, realm=”HiPER”

接下来的客户端响应中将包含由用户名、密码、nonce和其他信息组成的数据的哈希值(如使用MD5加密)。所有被加密的数据服务端也具有,因此服务端执行同样加密过程。如果二者一直则认证成功。

因为如MD5等哈希加密算法是不可逆的,因此用户名密码明文无法被窃听破解。因为服务器对同一个nonce的请求只接受一次客户端请求,从而能避免重放攻击。

但是,digest的安全性也有缺点:

1)只有密码密码被加密,而客户端最终请求的被保护资源是明文传送的,可被窃听

2)客户端无法确认服务端的正确身份,缺少对服务端的认证方式

3)近年来,随着计算机性能的提高等因素,传统高强度加密算法的破解已成可能。而MD5更是已有破解方法。

更多安全性问题请参考RFC2617。

3、NTML

NTML由微软开发,使用于Windows平台。被认为是比摘要认证更安全的认证方式。

它使用Windows凭证(Windows credentials)来传递认证数据,而不是使用未编码的用户名密码。

NTML要求服务器与客户端做出多次数据交换,服务器和所有其中的代理都必须支持永久连接(persistent connections)才能完成认证。

4、Kerberos

服务器与客户端通过第三方的Kerberos服务器完成认证。具体请参见百度百科条目和维基百科条目。

Kerberose相比NTML有很大改善:速度快,而且允许相互认证、认证代理和简单的信任关系。参考KERBEROS vs NTLM。

5、SPNEGO

全称是Simple and Protected GSS-API Negotiation,是微软提供的一种使用GSS-API认证机制的安全协议,用于使Webserver共享Windows Credentials,它扩展了Kerberos(一种网络认证协议)。

SPNEGO适用于客户端需要认证,但是客户端服务端都不清楚对方支持什么认证协议的场合。

SPENGO其实是一种”伪认证机制“(pseudo-mechanism),用以协商出真正的认证机制。

最常见的是微软的HTTP协商认证扩展(HTTP Negotiate authentication extension),协商的最终机制在NTML和Kerberos中选择。Kerberos因其优点优先使用。

百度词条对此认证的解释是不够准确的,准确的解释可以参考维基百科条目。
四、认证方式选择

选择何种认证方式取决于资源要被保护的程度。不需要保护的资源使用基本认证方式。因为认证会导致更多的数据传输,可能影响用户体验。

认证方式最弱的是基本认证,最强的是协商认证。服务端在WWW-Authentication提供自己支持的认证方式,供客户端任意选择。
五、参考

RFC2616-HTTP协议

RFC2617-HTTP认证:基本认证和摘要认证

RFC1321-MD5摘要加密逻辑

原文链接:https://blog.csdn.net/living_ren/article/details/79409504

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

未经允许不得转载:起风网 » HTTP认证模式
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录