图解HTTP--第七章--确保web安全的https
[TOC]
在HTTP协议中有可能存在信息窃听或身份伪装等安全问题。使用HTTPS通信机制可以有效地防止这些问题。
7.1 http的缺点
HTTP主要有以下这些不足:
- 通信使用明文(不加密),内容可能会被窃听;
- 不验明通信方的身份,因此有可能遭遇伪装;
- 无法验明报文的完整性,所以有可能已遭篡改;
7.1.1 通信使用明文可能会被窃听
由于HTTP本身不具备加密的功能,所以也无法做到对通信整体(使用HTTP协议通信的请求和响应的内容)进行加密。即HTTP报文使用明文(未经过加密的报文)方式发送。
在目前防止窃听保护信息的对策中,最为普及的是加密技术。加密的对象有如下几个:
- 通信的加密:HTTP协议中没有加密机制,但可以通过和SSL(安全套接层)或TLS(安全层传输协议)的组合使用,加密HTTP的通信内容。用SSL建立安全通信线路后,就可以在这条线路上进行HTTP通信了;
- 内容的加密:可以对HTTP协议传输的内容本身加密,即把HTTP报文里所含的内容进行加密处理。需要客户端和服务器端同时具备加密和解密机制。该方式不同于SSL或TLS将整个通信线路加密处理,所以内容仍有被篡改的风险。
7.1.2 不验明通信方的身份就可能遭遇伪装
HTTP协议中的请求和响应不会对通信方进行确认,也就存在“服务器是否就是发送请求URI真正指定的主机,返回的响应是否真的返回到了实际提出请求的客户端”等问题。
在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的IP地址和端口号没有被Web服务器设定限制访问的前提下)。HTTP协议的视线本身非常简单,无论是谁发送过来的请求都会被返回响应,因此不确认通信方,会存在以下各种隐患:
- 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web服务器;
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端;
- 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限;
- 无法判定请求是来自何方、出自谁手;
- 即使是无意义的请求也会照单全收。无法组织海量请求下的DoS(拒绝服务攻击)攻击;
虽然使用HTTP协议无法确定通信方,凡如果使用SSL则可以。SSL不仅提供加密处理,而且还使用一种被称为证书的手段,可用于确定方。证书是值得信任的第三方机构颁发的,用以证明服务器和客户端是实际存在的。
7.1.3 无法证明报文完整性,可能已遭篡改
所谓完整性是指信息的准确度。若无法证明其完整性,通常也就意味着无法判断信息是否准确。由于HTTP协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。换句话说,没有任何方法确认,发送的请求/响应和接收到的请求/响应是前后相同的。
请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击。
虽然有使用HTTP协议确定报文完整性的方法,但事实上并不便捷可靠。其中常用的是MD5和SHA-1等散列值校验的方法,以及用过来确认文件的数字签名方法。可惜的是,用这些方法也依然无法百分百保证确认结果正确。因为MD5本身被改写的话,用户是没有办法意识到的。
为了有效防止这个问题,可以使用HTTPS。SSL提供认证和加密处理及摘要功能。仅靠HTTP确保完整性是非常困难的,因此通过和其他协议组合使用来解决这个问题。
7.2 http + 加密 + 认证 + 完整性保护 = https
7.2.1 HTTP加上加密处理和认证以及完整性保护后即是HTTPS
为了解决HTTP通信不安全的问题,需要在HTTP上再加入加密处理和认证等机制。我们把添加了加密及认证机制的HTTP称为HTTPS。
7.2.2 HTTPS是身披SSL外壳的HTTP
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。
7.2.3 相互交换密钥的公开密钥加密技术
SSL采用一种叫做公开密钥加密的加密处理方式。近代的加密方法中加密算法时公开的,而密钥却是保密的。通过这种方式得以保持加密方法的安全性。加密和解密都会用到密钥,没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。如果密钥被攻击者获得,那加密也就失去了意义。
加密和解密通用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密。但是,以共享密钥方式加密时必须将密钥也发给对方,可是怎样才能安全地转交是个问题。公开密钥加密方式很好地解决了共享密钥加密的困难。
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。所以应充分利用两者各自的优势,将多种方法组合起来用于通信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。