无论是日常Web开发中,还是面试中,熟练掌握基础的计算机网络知识是非常必要的,说到网络基础,当然绕不开HTTP与HTTPS了,他们的区别,发起请求的过程等等,接下来就由我给你娓娓道来~

HTTP

HTTP(Hyper Text Transfer Protocol,超文本传输协议),主要被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

HTTP的特点

默认采用80作为通讯端口

HTTP是无状态的,即同一个客户端第二次访问同一个服务器上的页面时,服务器无法知道这个客户端曾经访问过,服务器也无法分辨不同的客户端。HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。(如果希望保持状态,可以通过引入cookie和session)

HTTP是无连接的,即限制每次连接只处理一个请求。服务器处理完客户的请求并响应后,就断开连接。采用这种方式可以节省传输时间,同时可以尽快将服务器资源释放出来服务其他的客户端。

HTTP的缺点

窃听风险:

HTTP所封装的信息是明文的,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息
篡改风险:无法证明报文的完整性, 攻击者可能已经截获并对报文进行了修改。
冒充风险:客户端与服务器之间没有任何身份确认的过程,无法保证通信双方的身份,攻击者可以冒充他人身份参与通信。

HTTPS

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),可以理解为HTTP+SSL/TLS, 即 HTTPS是运行在SSL/TLS之上的HTTP协议。HTTPS是可以进行加密传输、报文完整性校验、身份认证的网络协议,比HTTP协议要更加安全。

引用《图解HTTP》中的话来说:HTTP+加密+认证+完整性保护=HTTPS

HTTPS的特点

默认采用443作为通讯端口

所有信息都是加密传播,第三方无法窃听

具有校验机制,一旦被篡改,通信双方会立刻发现

配备身份证书,可防止身份被冒充

HTTPS的缺点

HTTPS的页面响应速度比HTTP要慢,主要是因为HTTPS在HTTP的基础上还需要进行一系列的加解密过程,这个过程会需要一定的时间

HTTPS涉及到的安全算法会消耗 CPU 资源,会增加服务器的负担

使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。(如果全站升HTTPS了,相应的CDN也需要使用HTTPS的,价格也会比HTTP的要贵一些)

HTTPS的原理

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。但同时为了减少耗用的时间,HTTPS 采用共享密钥加密(对称加密)和公开密钥加密(非对称加密)两者并用的混合加密机制。

总的来说就是三步:
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成”对话密钥”。
(3) 双方采用”对话密钥”进行加密通信。

Question & Answer

(1)如何保证公钥不被篡改?

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。

(2)公钥加密计算量太大,如何减少耗用的时间?

每一次对话(session),客户端和服务器端都生成一个”对话密钥”(session key),用它来加密信息。由于”对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”(session key)本身,这样就减少了加密运算的消耗时间。

一起理清几个概念

  1. 对称加密:加密和解密都是使用的同一个密钥(DES、AES-GCM算法等)

  2. 非对称加密:加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,而私钥是保密的。非对称加密算法性能较低,但是安全性比较强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的(RSA、DSA算法等)

  3. 哈希算法:将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆(MD5、SHA-1算法等)

  4. 数字签名:数字签名就是在待传送的信息后面再加上一段内容(待传送的信息经过hash后的值),hash值一般都会加密后(也就是数字签名)再和信息一起发送,以保证这个hash值不被修改,以此证明信息没有被修改过。

  5. 生成”对话密钥”(session key)一共需要三个随机数。

  6. 服务器的公钥和私钥只在加密和解密”对话密钥”(非对称加密)时使用,握手之后的对话使用”对话密钥”(session key)加密(对称加密),不会再使用到服务器的公钥和私钥了。

  7. 服务器公钥(public key)放在服务器的数字证书之中。

SSL握手详细的步骤

1

  1. (ClientHello)客户端向服务器发起HTTPS请求,连接到服务器的443端口。在这一步,客户端主要向服务器提供以下信息。

    客户端支持的协议版本,比如TLS 1.0版

    客户端支持的加密方法,比如RSA公钥加密

    客户端支持的压缩方法

    一个客户端生成的随机数(public random),稍后用于生成”对话密钥”(session key)

  2. (SeverHello)服务器收到客户端请求后,向客户端发出回应,回应包含以下内容
    确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

    确认使用的加密方法,比如RSA公钥加密

    服务器证书(证书中包含了服务器公钥public key)

    一个服务器生成的随机数(server random),稍后用于生成”对话密钥”(session key)

  3. 客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
    如果证书没有问题,客户端就会从证书中取出服务器的公钥(public key)。然后,生成一个随机数,我们将该随机数称之为client key,即客户端密钥。该随机数(client key)用服务器公钥(public key)进行非对称加密,这样客户端密钥(client key)就变成密文了,可以防止被窃听。此时,客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥(client key)发送给服务器。

  4. 服务器收到加密之后的客户端密钥(client key)之后,会用自己的服务器私钥对其进行非对称解密,解密之后的明文就是客户端密钥(client key)。有了它以后,客户端和服务器就同时都有了三个随机数(public random, server random, client key),接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把”会话密钥”(session key)

  5. 之后客户端与服务器的通信都使用”会话密钥”(session key)对需要传输的数据进行对称加解密,这样要传输的数据就变成了密文,第三方无法窃听。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用”会话密钥”(session key)加密了需要传输的内容。

整个握手阶段都不加密(也没法加密),都是明文的。因此,如果有人窃听通信,他可以知道双方选择的加密方法,以及三个随机数中的两个。整个通话的安全,只取决于第三个随机数(client key)能不能被破解。

参考文章:

《图解SSL/TLS协议》http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
《SSL/TLS协议运行机制的概述》http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
《HTTPS理论基础及其在Android中的最佳实践》https://blog.csdn.net/iispring/article/details/51615631