HTTP与HTTPS详解

做者 l AhuntSunhtml

来源(公众号) l 泰斗贤若如web

转载(公众号) l 大数据和人工智能技术面试


HTTP与HTTPS详解

1.HTTP

为何有的网站域名是http开头而有的网站是https开头呢?算法

HTTP是一种超文本传输协定,HTTPS : 就是HTTP + Security安全

那是否是HTTP就是不安全的呢?服务器

是的 HTTP是不安全的;从HTTP的规定上来看整个传输的过程都是明文传输的。HTTP包在服务器发出到客户端的过程当中至关于“裸奔”,被拦截后可对数据包进行解析并读取就能够获得该发送请求里面的任何数据。微信

运用抓包工具,抓取请求数据包能够看见:
网络


Hypertext Transfer Protocol”(超文本传输协定)就是HTTP协议。能够看到这是一个GET请求:其中GET请求的地址,Host等请求头的具体信息所有均可以看到。
甚至能够知道 Cookie的信息(通常存储用户的会话信息,截取后去模仿用户的登陆状况,就能够去请求用户的登陆数据;若是能够在中间层抓取某一个网站的全部请求和返回的数据,就彻底能够拿到用户在这个网站上的全部数据),这是很危险的。

这是请求的返回:
并发

依然能够看到全部的头信息。
因此HTTP自己是没有安全属性的,它是一个明文传输的过程,一旦被截取就有可能致使信息泄露,故推荐不要把重要信息用HTTP明文传输(信用卡密码等)app

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”开头。

本文做者:AhuntSun
原文连接:https://www.cnblogs.com/AhuntSun-blog/p/12025393.html

本文经做者AhuntSun受权在泰斗贤若如公众号发布,欢迎你们转载,转载请注明文章出处,按规矩转载

- 完 -

推荐阅读

【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。

答疑 | boolean类型占几个字节?


扫描上方二维码回复 课程
便可得到JAVA全栈教程合集 
30+课程掌握 95% 的开发技能

  以为有用,请点在看   

本文分享自微信公众号 - 大数据和人工智能技术(Big_Data-AI)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索