HTTP与HTTPS
1.HTTP
为什么有的网站域名是http开头而有的网站是https开头呢?
HTTP是一种超文本传输协定,HTTPS : 就是HTTP + Security。那是不是HTTP就是不安全的呢?
是的 HTTP是不安全的;从HTTP的规定上来看整个传输的过程都是明文传输的。HTTP包在服务器发出到客户端的过程中相当于“裸奔”,被拦截后可对数据包进行解析并读取就可以得到该发送请求里面的任何数据。
运用抓包工具,抓取请求数据包可以看见:
”Hypertext Transfer Protocol”(超文本传输协定)就是HTTP协议。可以看到这是一个GET请求:其中GET请求的地址,Host等请求头的具体信息全部都可以看到。
甚至可以知道Cookie的信息(一般存储用户的会话信息,截取后去模仿用户的登录情况,就可以去请求用户的登录数据;如果可以在中间层抓取某一个网站的所有请求和返回的数据,就完全可以拿到用户在这个网站上的所有数据),这是很危险的。
这是请求的返回:
依然可以看到所有的头信息。
所以HTTP本身是没有安全属性的,它是一个明文传输的过程,一旦被截取就有可能导致信息泄露,故推荐不要把重要信息用HTTP明文传输(信用卡密码等)
2. HTTPS
是加了安全属性的HTTP,它有公钥和私钥的概念,传输过程是安全的。
- 私钥:只放在服务器上,只有服务器可以使用。
- 公钥:(服务端证书)放在互联网上,所有人都可以拿到的一串加密的字符串,它是用来加密传输信息的。
当使用用公钥加密的数据传输到服务器之后,只有服务器通过私钥进行解密才能把公钥加密过的数据解密出来。传输过程中任何人都拿不到私钥,因为私钥只放在服务器上。
这样即使HTTP请求数据包被截取了,没有私钥也不能解密包中的数据。这样数据传输过程就变得安全了。(抓包软件抓到的数据也无法解密)
公钥和私钥主要用于TCP进行“握手”时进行的数据传输,握手的时候公钥和私钥传输的内容实际上是一个加密字符串。在后续数据传输的过程中两边使用这个加密字符串进行数据的加密传输。
只有客户端和服务器端两边知道这个加密字符串,并可以通过该字符串对加密的数据进行解密。在这个过程中中间人即使截取了数据包也是没有办法对数据进行解密的。
3.HTTPS“四次握手”的过程图解
HTTP的“三次握手”过程是非常简单的,仅仅是用来确认网络是否连通。HTTPS的“四次握手”过程会相对复杂一点,因为需要有加密传输的过程,并且客户端和服务器之间还需要确定最后数据传输时真正使用的秘钥。
(1)在传输的过程中,客户端先生成一个随机数(客户端随机数),然后传输到服务器端,中间会带上客户端这边支持的加密套件(存在许多不同的加密方法)
(2)服务器端拿到这个随机数之后先存着,服务器端也生成一个随机数(客户端随机数),这个随机数会伴随着公钥(服务器端证书),一起传输给客户端。
(3)客户端通过服务器端传过来的公钥(服务端证书)生成一个新的随机数(预主秘钥),总共有三个随机数。生成的第三个随机数(预主密钥)用公钥加密之后再传输到服务器端。
在这个过程中由于客户端使用了公钥对数据进行加密,即使中间人截取到了数据包没有私钥便无法对数据进行解密,只有服务器端有私钥才可以对数据进行解密。
(4)然后服务器端通过私钥解密拿到了预主秘钥(就是第三个随机数),然后客户端和服务器端同时对这三个随机数进行算法操作生成一个主密钥。
这里的算法会涉及到一个加密套件,因为最终服务器端会选择一个客户端发送过来的加密套件,然后两边同时使用这个加密套件对三个随机数进行一个算法的操作才会生成一个主密钥。
有了这个主密钥之后,两边传输的数据都通过这个主密钥进行加密。由于两边主密钥是一样的所以两边都能够对加密的数据进行机密,得到真正的数据。而中间人因为没办法知道主密钥,即使截取了数据包也没有办法对数据进行解密。
所以这中间的数据传输就是安全的。
4.HTTPSS数据传输演示
这是对一个用HTTPS加密的网站进行的数据抓取:
我们看到在”123 Application Data”中,抓包工具是没有办法显示出这个请求的地址的。看到的只有一个”Secure Sockets Layer”(安全套接层),里面有一个加密的内容,加密的内容因为没有主密钥所以无法进行解密。
故中间的抓取工具没有办法显示任何实际传输的数据,只能看到请求发起的ip和传输目标的ip。实际传输的数据只有客户端和服务器端通过主密钥解密才能得到。
再来看看HTTPS的“四次握手”
(1)首先客户端会发起一个”Client Hello”,可以看到这边传输了一个”Random”:客户端随机数(第一个随机数)。中间有一个”Cipher Suites”选项:
这是客户端这边支持的加密套件,连同客户端随机数一并发送给服务器端。
(2)客户端发送之后服务器端会返回一个”Server Hello”数据,其中包含了一个”Random”:服务器端随机数(第二个随机数),还包含了服务器端选择的一个”Cipher Suites”:这就是刚才客户端列出来的多种”Cipher Suites”中服务器认为最后的一种。客户端和服务器端最终生成主密钥的过程就会用到这个加密套件。
(3)然后服务器端还会继续发送一个返回,这个返回会告诉客户端,服务器端的公钥(服务端证书)是怎么样的:
(4)客户端拿到这个公钥(服务端证书)之后,运用这个公钥对”服务器端随机数”进行加密得到预主秘钥,再用公钥对预主秘钥进行加密并发送到服务器端:
可以看到这个数据是显示不出来的,“handshake Protocol:Encrypted Handshake Message”(握手协议:加密握手消息),表示是加密过的数据。然后服务器端拿到之后通过私钥解密才能真正拿到预主秘钥。
随后两边使用服务器端挑选出来的加密套件(Cipher Suites)同时对:客户端随机数、服务器端随机数和预主秘钥这三个随机数进行算法操作,最终两边都得到了主密钥。之后通过主密钥对数据进行加密传输,整个过程就是安全的。
这就是HTTPS能保证安全的原理。
与HTTP中TCP的“三次握手”不同,HTTPS需要进行“四次握手”,并且在客户端和服务器端传输的数据也比HTTP多,同时消耗也比HTTP大,但是HTTPS是安全的。现在只有部分网站使用HTTPS协议,但是将来所有的网站都会使用HTTPS,这是大势所趋。
而且网站使用HTTP/2协议的前提就是域名要以”https”开头。