一、什么是HTTP基本认证
客户端(桌面应用程序)通过HTTP协议跟Web服务器交互, 客户端一般不会使用cookie, 而是把 "用户名+冒号+密码"用BASE64编码的字符串放在http request 中的header Authorization中发送给服务端, 这种方式叫HTTP基本认证(Basic Authentication)
二、HTTP认证原理
1.认证原理
a) 客户端请求了某个受保护文档。
b) 在客户端能够证明其知道密码从而确认其身份之前,服务器拒绝提供文档。服务器向客户端发起质询,询问用户名和摘要形式的密码。
c) 客户端传递了密码的摘要,证明它是知道密码的。服务器知道所有用户的秘密,因此可以将客户提供的摘要与服务器自己计算得到的摘要进行比较,以验证用户是否知道密码。另一方在不知道密码的情况下,很难伪造出正确的摘要。
d) 服务器将客户端提供的摘要与服务器内部计算出的摘要进行对比。如果匹配,就说明客户端知道密码(或者很幸运地猜中了!)。可以设置摘要函数,使其产生很多数字,让人不可能幸运地猜中摘要。服务器进行了匹配验证之后,会将文档提供给客户端——整个过程都没有在网络上发送密码。
2.握手机制
(1) 服务器计算出一个随机数。
(2) 服务器将这个随机数放在 WWW-Authenticate 质询报文中,与服务器所支持的算法列表一同发往客户端。
(3) 客户端选择一个算法,计算出密码和其他数据的摘要。
(4) 客户端将摘要放在一条 Authorization 报文中发回服务器。如果客户端要对服务器进行认证,可以发送客户端随机数。
(5) 服务器接收摘要、选中的算法以及支撑数据,计算出与客户端相同的摘要。然后服务器将本地生成的摘要与网络传送过来的摘要进行比较,验证是否匹配。如果客户端反过来用客户端随机数对服务器进行质询,就会创建客户端摘要。服务器可以预先将下一个随机数计算出来,提前将其传递给客户端,这样下一次客户端就可以预先发送正确的摘要了。
三、HTTP认证过程
第一步: 客户端发送http request 给服务器。
第二步: 因为request中没有包含Authorization header, 服务器会返回一个401 Unauthozied 给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息。
第三步:客户端把用户名和密码用BASE64编码后,放在Authorization header中发送给服务器, 认证成功。
第四步:服务器将Authorization header中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端。
第五步:使用Fiddler Inspectors 下的Auth 选项卡,可以很方便的看到用户名和密码。
四、HTTP基本认证和HTTPS
把 "用户名+冒号+密码" 用BASE64编码后的string虽然用肉眼看不出来, 但用程序很容易解密,上图可以看到Fiddler就直接给解密了。 所以这样的http request 在网络上,如果用HTTP传输是很不安全的。 一般都是会用HTTPS传输, HTTPS是加密的, 所以比较安全.
五、HTTP OAuth认证及其他认证
OAuth 对于Http来说,就是放在Authorization header中的不是用户名密码, 而是一个token.
微软的Skydrive 就是使用这样的方式, 如下图
其他认证:除了基本认证(Basic Authentication), 还有摘要认证 digest authentication, WSSE(WS-Security)认证。
六、基本认证的安全缺陷
1.基本认证通过网络发送用户名和密码,虽然进行base-64编码可以隐藏用户名和密码,但是很容易通过反向编码过程进行解码。
2.即使密码以更加难以解码的方式加密,第三方用户仍然可以捕获被修改过的用户名和密码,并通过重放攻击获取服务器的访问权限。
3.很多用户会将不同的服务使用相同的用户名和密码,基本认证直接发送用户名和密码,会对一些重要的服务(比如在线银行网站)造成威胁。
4.基本认证没有提供任何针对代理和中间人节点的防护措施,他们没有修改认证首部,但却修改了报文的其余部分,这样就严重的改变了事务的本质。
5.假冒服务器很容易骗过基本认证。如果在用户实际链接到一台恶意服务器或者网关的时候,能够让用户相信他链接的是一个受基本认证保护的合法主机,攻击者就可以请求用户输入密码。
6.IIS中站点默认开启匿名身份验证,并可以直接访问
资料来源1.hehffyy 2.测试部落-萌猫君