HTTP的缺点
- 通信明文可能被窃听
- 不验证通信方的身份,可能被伪装
- 无法验证报文的完整性,可能被篡改
1.窃听
HTTP本身不具有加密功能
TCP/IP是可能被窃听的网络。虽说通信经过加密,但加密处理后的报文信息本身还是会被看到
窃听相同段上的通信并非难事。只需收集互联网上流动的数据包就可以了,对于收集到的数据包,可以交给抓包(Packet Capture)和嗅探器工具(Sniffer)
如抓包工具Wireshark
加密处理防止被窃听:
加密对象可以有:
- 通信的加密:可以通过SSL(Secure socket layer)和TLS(Transport layer security)组合使用
用SSL建立安全通信线路后,就可以在这条线路上进行HTTP通信了。与SSL组合使用的HTTP称为HTTPS(HTTP Secure) - 内容加密:对HTTP报文主体进行加密处理
- 不验证通信方的身份就可能遭遇伪装
任何人都可以发起请求,服务器只接收到请求,不管对方是谁都会范围一个响应。仅限于发送端的IP地址和端口号没被web服务器设定限定访问的前提下
HTTP协议下的隐患 - 无法确定请求发送至目标的web服务器是否按真实意图返回响应的那台服务器,有可能是已伪装的服务器
- 无法确定响应返回到的客户端是否是按照真实意图接受的那个客户端,有可能是伪装的客户端
- 无法确定通信的对方是否有访问权限,因为某些web服务器上保存着重要信息,只想发给特定用户通信的权限
- 无法判定请求是出自何方,谁手
- 即使是无意义的请求也会照单全收,无法阻止海量请求下的DOS攻击(Denial of Service)
虽然HTTP协议无法确定通信方,但SSL却可以。其不仅提供加密处理,而且使用了一种被称为证书的手段,可用于确定通信方。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度是异常困难的事情。只要能确认通信方的证书,即可判断对方真实意图
无法确认报文的完整性
发出的请求/响应和接受到的内容是否遭到篡改,是绝对无法确认的。中间人攻击(man-in-the-middle attack)
如何防止篡改
用MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名
提供文件下载的网站会提供PGP(pretty good privacy)创建的数字签名,以及MD5算法生成的散列值。PGP是用来证明创建文件的数字签名,MD5是单向函数生成的散列值。不管使用哪种方法,都需要操纵客户端的本人亲自检查验证下载的文件是否就是原来服务器上的文件。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
SSL采用公开密钥加密(public-key cryptography)的加密处理方式
如果密钥被获取,那加密也失去了意义
加密和解密同用一个密钥的方式被称为共享密钥加密(Common key crypto system),
公开密钥加密方式解决了共享密钥的苦难
公开密钥加密使用一种非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。私有密钥不可知,而公开密钥则可以随意发布
这样,发送密文的一方使用对方的公开密钥急性加密,对方收到消息后,在使用自己的私有密钥进行解密。这样不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走
HTTPS采用混合加密机制
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥能够安全交换,那有可能会考虑仅使用公开密钥加密来通信。但公开密钥加密和共享密钥加密相比,处理速度要慢。所以应在交换密钥环节使用公开密钥加密方式,之后建立通信交换报文阶段使用共享密钥加密方式
证明公开密钥正确性的证书
无法证明公开密钥本身就是货真价实的公开密钥。或许公开密钥在传输途中已经被攻击者替换了
可以使用数字证书认证机构(CA,certificate authority)和其相关机关颁发的公开密钥证书
可证明组织真实性的EV SSL证书:确认对方服务器背后运营的企业是否真实存在。在Web网页浏览器地址处的背景色是绿色的。
用以确认客户端的客户端证书:
- 客户端证书要付费购买。现状是,安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。例如银行的网上银行
- 客户端证书只能用来证明客户端实际存在,而不能证明用户本人的真实有效性
为什么不一直使用SSL,HTTPS
因为HTTPS要做通信双方的报文加密解密过程,会占用CPU和内存等硬件资源。因此非敏感通信使用HTTP,而敏感通信则使用HTTPS。尤其是那种访问量巨大的网站。