1. 认证

1.1 HTTP 的质询/响应认证框架

HTTP 提供了一个原生的质询/响应(challenge/response)框架,简化了对用户的认证过程。 HTTP 的认证模型如下图所示:



Web 应用程序收到一条 HTTP 的请求报文时,服务器没有按照请求执行动作,而是以一个 "认证质询" 进行响应,要求用户提供一些保密信息来说明他是谁,从而对其进行质询。

用户再次发起请求时,要附上保密证书(用户名和密码)。如果证书不匹配,服务器可以再次质询客户端,或产生一条错误信息。如果证书匹配,就可以正常完成请求了。

1.2 认证协议与首部

HTTP 通过一组可定制的控制首部,为不同的认证协议提供了一个可扩展框架。下面列出的首部格式和内容会随认证协议的不同而发生变化。认证协议也是在 HTTP 认证首部中指定的。

HTTP 定义了两个官方的认证协议:基本认证和摘要认证。

认证的 4 个步骤:

步骤 首部 描述 方法/状态
请求 第一条请求没有认证信息 GET
质询 WWW-Authenticate 服务器用 401 状态拒绝了请求,说明需要用户提供用户名和密码。服务器上可能会分为不同的区域,每个区域都有自己的密码,所以服务器会在 WWW-Authenticate 首部对保护区域进行描述。同样,认证算法也是在 WWW-Authenticate 首部中指定的 401 Unauthorized
授权 Authorization 客户端重新发出请求,但这一次会附加一个 Authorization 首部,用来说明认证算法、用户名和密码 GET
成功 Authentication-Info 如果授权证书是正确的,服务器就会将文档返回。有些授权算法会在可选的 Authentication-Info 首部返回一些与授权会话相关的附加信息 200 OK

如下图示例:

  • 服务器对用户进行质询时,会返回一条 401 Unauthorized 响应,并在 WWW-Authenticate 首部说明如何以及在哪里进行认证。
  • 当客户端授权服务器继续处理时,会重新发送请求,但会在 Authorization 首部附上加密的密码和其他一些认证参数。
  • 授权请求成功完成时,服务器会返回一个正常的状态码(如 200 OK);对高级认证算法来说,可能还会在 Authentication-Info 首部附加一些额外的信息。

1.3 安全域

HTTP 是如何允许服务器为不同的资源使用不同的访问权限的?在上图的 WWW-Authenticate 质询中包含了一个 realm 指令。Web 服务器会将受保护的文档组织成一个安全域(security realm)。每个安全域都可以有不同的授权用户集。

比如,假设 Web 服务器建立了两个安全域:一个用于公司的财务信息,另一个用于个人家庭文档。不同的用户对各个安全域的访问权限是不同的。公司的 CEO 应该能够访问销售额预测资料,但不应该允许他访问员工和其家人度假的照片:



下面是一个假象的基本认证质询,它指定了一个域:

HTTP/1.0 401 Unautiorized
WWW-Authenticate: Basic realm="Corporate Financials"

域应该有一个描述性的字符名,比如 Corporate Financials(公司财务资料),以帮助用户了解应该使用哪个用户名和密码。在安全域的名称中列出服务器主机名也是很有帮助的--如,executive-committee@bigcompany.com。

2. 基本认证

在基本认证中,Web 服务器可以拒绝一个事务,质询客户端,请用户提供有效的用户名和密码。服务器会返回 401 状态码,而不是 200 状态码来初始化认证质询,并用 WWW-Authenticate 响应首部指定要访问的安全域。浏览器收到质询时,会打开一个对话框,请求用户输入这个域的用户名和密码。然后将用户名和密码稍加扰码,再用 Authorization 请求首部回送给服务器。

HTTP 基本认证将(由冒号分隔的)用户名和密码打包在一起,并用 Base-64 编码方式对其进行编码。

2.1 代理认证

中间的代理服务器也可以实现认证功能。有些组织会在用户访问服务器、LAN 或无线网络之前,用代理服务器对其进行认证。可以在代理服务器上对访问策略进行集中管理,因此,通过代理服务器提供对某组织内部资源的统一访问控制是一种很便捷的方式。这个过程的第一步就是通过代理认证(proxy authentication)来识别身份。

代理认证的步骤与 Web 服务器身份验证的步骤相同。但首部和状态码都有所不同。

Web 服务器 代理服务器
Unauthorized status code:401 Unauthorized status code:407
WWW-Authenticate Proxy-Authenticate
Authorization Proxy-Authorization
Authentication-Info Proxy-Authorization-Info

3. 基本认证的安全缺陷

基本认证只能用它来防止非恶意用户无意间进行的访问,或将其与 SSL 这样的加密技术配合使用。

基本认证存在下列安全缺陷:

  1. 基本认证会通过网络发送用户名和密码,这些用户名和密码都是以一种很容易解码的形式表示的。实际上,密码是以明文形式传输的,任何人都可以读取并将其捕获。虽然 Base-64 编码通过隐藏用户名和密码,致使友好的用户不太可能在进行网络观测时无意中看到密码,但 Base-64 编码的用户名和密码可以很轻易地通过反向编码过程进行解码,甚至可以用纸笔在几秒钟内手工对其进行解码。所以经过 Base-64 编码的密码实际上就是 "明文" 传送的。如果有动机的第三方用户有可能会去拦截基本认证发送的用户名和密码,就要通过 SSL 加密信道发送所有的 HTTP 事务,或者使用更安全的认证协议,比如摘要认证。
  2. 即使密码是以更难解码的方式加密的,第三方用户仍然可以捕获被修改过的用户名和密码,并将修改过的用户名和密码一次一次地重放给原始服务器,以获得对服务器的访问权。没有什么措施可用来防止这些重放攻击。
  3. 即使将基本认证用于一些不太重要的应用程序,比如公司内部网络的访问控制或个性化内容的访问,一些不良习惯也会让它变得很危险。很多用户由于受不了大量密码保护的服务,会在这些服务间使用相同的用户名和密码。比如说,某个狡猾的恶徒会从免费的因特网邮件网站捕获明文形式的用户名和密码,然后会发现用同样的用户名和密码还可以访问重要的在线银行网站。
  4. 基本认证没有提供任何针对代理和作为中间人的中间节点的防护措施,它们没有修改认证首部,但却修改了报文的其余部分,这样就严重改变了事务的本质。
  5. 假冒服务器很容易骗过基本认证。如果在用户实际连接到一台恶意服务器或网关的时候,能够让用户相信他连接的是一个受基本认证保护的合法主机,攻击者就可以请求用户输入密码,将其存储起来以备未来使用,然后捏造一条错误信息传送给用户。

最新文章

  1. iOS整体框架类图
  2. SQL*Loader之CASE1
  3. 不同版本strtotime("2016-09-04")输出不同问题
  4. Codeforces Round #262 (Div. 2)
  5. 5-2-2 printf参数从右往左压栈
  6. 瑞柏匡丞_免费app开发是否可行
  7. MFC消息顺序
  8. MAC 命令行工具(Command Line Tools)安装
  9. LogFactory缺包异常
  10. iptables防火墙详解
  11. 蓝桥杯-猜年龄-java
  12. [开源] C# 封装 银海医保的接口
  13. 【window】Windows10下为PHP安装redis扩展
  14. IOS Javascript Date的坑
  15. js 中判断变量是数组还是对象,和判断对象是否为空
  16. docker部署安装
  17. POJ 2752 Seek the Name, Seek the Fame(next数组运用)
  18. React中禁止chrome填充密码表单
  19. UI设计初学者必看,这款设计神器教你快速入门
  20. unity StrangeIoc

热门文章

  1. Django 配置JWT验证
  2. js大数计算之展示
  3. mac下自己实现re-sign.jar对apk进行重签名
  4. 【Zookeeper】实现负载均衡原理
  5. Python处理异常
  6. Flutter——BottomNavigationBar组件(底部导航栏组件)
  7. GNS3 介绍
  8. 多线程 multiprocessing 的几个小例子
  9. python高性能编程方法一
  10. django-rest-framework --- 基础简介