常见面试题:HTTPS协议和HTTP协议有什么区别?HTTPS如何实现安全的?

By LongLuo

面试时,经常会遇到一道题,说说HTTPS

HTTP的缺点:

通信使用明文(不加密),内容可能会被窃听

不验证通信方的身份,因此有可能遭遇伪装

无法证明报文的完整性,所以有可能已遭篡改

来说说当初设计HTTPS是为了满足哪些需求?

很多介绍HTTPS的文章一上来就给你讲实现细节。其中谈到“WHY型问题”的重要性。如果一上来就丢给你一大堆协议细节,你充其量只能知道WHAT和HOW,无法理解WHY。俺在前一个章节讲了“背景知识”,在这个章节讲了“需求”,这就有助于你理解:当初【为什么】要设计成这样?——这就是 WHY 型的问题。

兼容性

因为是先有HTTP再有 HTTPS。所以,HTTPS 的设计者肯定要考虑到对原有HTTP的兼容性。

这里所说的兼容性包括很多方面。比如已有的 Web 应用要尽可能无缝地迁移到 HTTPS;比如对浏览器厂商而言,改动要尽可能小;…

基于“兼容性”方面的考虑,很容易得出如下几个结论:

  1. HTTPS还是要基于TCP来传输(如果改为UDP作传输层,无论是Web服务端还是浏览器客户端,都要大改——动静太大,伤筋动骨)

  2. 单独使用一个新的协议,把HTTP协议包裹起来(所谓的“HTTP over SSL”,实际上是在原有的HTTP数据外面加了一层SSL的封装。HTTP协议原有的GET、POST之类的机制,基本上原封不动)

打个比方:如果原来的HTTP是塑料水管,容易被戳破;那么如今新设计的HTTPS就像是在原有的塑料水管之外,再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。

可扩展性

前面说了,HTTPS 相当于是“HTTP over SSL”。

如果SSL这个协议在“可扩展性”方面的设计足够牛逼,那么它除了能跟HTTP搭配,还能够跟其它的应用层协议搭配。岂不美哉?

现在看来,当初设计SSL的人确实比较牛。如今的SSL/TLS可以跟很多常用的应用层协议(比如:FTP、SMTP、POP、Telnet)搭配,来强化这些应用层协议的安全性。

接着刚才打的比方:如果把SSL/TLS视作一根用来加固的金属管,它不仅可以用来加固输水的管道,还可以用来加固输煤气的管道。

保密性(防泄密)

HTTPS需要做到足够好的保密性。

说到保密性,首先要能够对抗“嗅探”(圈内行话叫Sniffer)。所谓的“嗅探”,通俗而言就是监视你的网络传输流量。如果你使用【明文】的HTTP上网,那么监视者通过嗅探,就知道你在访问哪些网站的哪些页面。

嗅探是最低级的攻击手法。除了嗅探,HTTPS还需要能对抗其它一些稍微高级的攻击手法——比如“重放攻击”(后面讲协议原理的时候,会再聊)。

完整性(防篡改)

除了“保密性”,还有一个同样重要的目标是“确保完整性”。关于“完整性”这个概念,在之前的博文《扫盲文件完整性校验——关于散列值和数字签名》中大致提过。健忘的同学再去温习一下。

在发明 HTTPS 之前,由于HTTP是明文的,不但容易被嗅探,还容易被篡改。

举个例子:
比如咱们天朝的网络运营商(ISP)都比较流氓,经常有网友抱怨说访问某网站(本来是没有广告的),竟然会跳出很多中国电信的广告。为啥会这样捏?因为你的网络流量需要经过ISP的线路才能到达公网。如果你使用的是明文的HTTP,ISP很容易就可以在你访问的页面中植入广告。

所以,当初设计HTTPS的时候,还有一个需求是“确保HTTP协议的内容【不】被篡改”。

真实性(防假冒)

在谈到HTTPS的需求时,“真实性”经常被忽略。其实“真实性”的重要程度【不亚于】前面的“保密性”和“完整性”。

举个例子:

你因为使用网银,需要访问该网银的Web站点。那么,你如何确保你访问的网站确实是你想访问的网站?

有些天真的同学会说:通过看网址里面的域名,来确保。为啥说这样的同学是“天真的”?因为DNS系统本身是不可靠的(尤其是在设计SSL的那个年代,连DNSSEC都还没发明)。由于DNS的不可靠(存在“域名欺骗”和“域名劫持”),你看到的网址里面的域名【未必】是真实滴!

(不了解“域名欺骗”和“域名劫持”的同学,可以参见俺之前写的《扫盲DNS原理,兼谈“域名劫持”和“域名欺骗/域名污染”》)

所以,HTTPS协议必须有某种机制来确保“真实性”的需求(至于如何确保,后面会细聊)。

性能

再来说最后一个需求——性能。

引入HTTPS之后,不能导致性能变得太差。否则的话,谁还愿意用?

为了确保性能,SSL的设计者至少要考虑如下几点:

  1. 如何选择加密算法(对称加密 or 非对称加密)?
  2. 如何兼顾HTTP采用的【短连接】TCP 方式?

(再次提醒:SSL是在1995年之前开始设计滴。那是Web的远古时代——HTTP协议版本还只是1.0;默认使用【短连接】的TCP方式;默认【不】启用Keep-Alive)

小结

以上就是设计 SSL 协议时,必须兼顾的各种需求。后面聊协议的实现时,俺会拿SSL协议的特点跟前面的需求作对照。看看这些需求是如何被逐一满足滴。