HTTPS

1.什么是HTTPS

HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层

HTTP协议的内容都是按照文本的方式明文传输。这就导致了在传输过程中出现一些被篡改、被盗取信息的情况。

1.1臭名昭著的“运营商劫持”

我们是否记得报头中有Referer这个键值对,它表示此链接是从哪个网页跳转跳转过来的。如下面我使用搜狗引擎搜索“贪玩蓝月”,我们能抓到这样的包:

HTTPS_第1张图片

表示我们从搜狗转到了这个网站。这个时候搜狗厂商就能从贪玩蓝月哪里收取一定的广告费。

但是在2014~2016会经常发生运营商劫持的事件,运营商的相关设备收到这个请求后,会把Referer这个键值对的值改为自家产品的搜索引擎,而其他搜索引擎就赚不到钱。运营商为什么这样做?就是利益。

HTTPS_第2张图片

这还是没有损害网民的利益,毕竟最终跳转的还是相同的目的地址。但是如果有黑客在你需要下载其他软件的时候,把地址改为病毒或者流氓软件的下载地址就可非常可怕了。

这时候我们需要对发出的请求进行加密,以防止第三方的篡改。

2.“加密”是什么

加密就是把 明文(要传输的信息)进行一系列变换,生成密文

解密就是把 密文 再进行一系列变换,还原成 明文

在这个加密和解密的过程中,我们往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据称为 密钥(正确读音Mì yuè,但是很多人读作mi yao第四声,是错误,但我们在别人读这个的时候知道是什么)

在83版的《火烧圆明园》,有人要谋反干掉慈禧太后。恭亲王奕䜣给慈溪太后递了个折子。折子的内容只是和慈溪太后聊了些家常,但是又套上的一个挖了洞的纸,套在原来的折子上就变成了另外的意思。

密文:奏折全文

明文:套上带孔的纸看到的内容(当心肃顺, 端华, 戴恒)

密钥:挖了洞的纸

HTTPS_第3张图片

加密解密到如今已经发展成一个独立的学科:密码学。

而密码学的奠基人,也正是计算机科学的祖师爷之一:艾伦·麦席森·图灵

HTTPS_第4张图片


3.HTTPS的工作过程

既要保证数据的安全,我们就要对数据进行加密

我们使用的加密方式有两种:对称机密 非对称加密

3.1引入对称加密

对称加密:就是通过一个“密钥”,我们可以对响应的信息进行加密,同时又可以对响应的信息进行解密。

一个简单的对称加密,按位异或

假设明文a = 1234,密钥key = 8888

我们加密a ^ key = 9834,其中9834就是我们得到的密文

然后对方收到信息以后,9834 ^ key = 1234

这就是加密和解密的过程。

但是HTTPS并不是简单的按位异或,但是这能很好的解释:对称加密/对称密钥

假设我们在传输的时候,服务器和客户端都已经得到了对称密钥。

客户端将要发送的信息进行加密传输,由于黑客并没有对称密钥获得得信息只是密文,看到的就是无意义的数据,服务端拥有密钥将很快的解密,并进行响应对响应得信息进行加密, 密文2的信息黑客同样无法解密,将发送给客户端,客户端拥有密钥,将对信息进行解密。

HTTPS_第5张图片

引入对称密钥后,虽然黑客获得了信息,但是却是无意义的数据。

通俗的栗子】

我们假设这个过程是发送信封和收信封的过程。

不使用对称加密:我们直接把信封给了不正经的送信员,他在中途的时候可以拆开看看,然后再次封装起来,送给我们的收信人。

使用对称加密:发信人和送信人都有一个相同的保险箱和钥匙。发信人把信封放入保险箱锁好,交给快递员。快递员由于保险箱的存在将无法偷看里面的信息,便继续往下发送。收信人收到保险箱后,就开锁看信。并使用类似方法进行回信。

HTTPS_第6张图片

关于如何获得对称密钥?

每个对称密钥都是客户端自己随机产生,并发送给服务端(中间也有加密,我们先不考虑),服务器会记录这个对称密钥,用于和此客户端交流。因为密钥是客户端随机产生的,所以每个客户端跟服务进行数据传输使用的是不同的密钥。

但是如果我们发送这个对称密钥的时候,黑客截取到这个对称密钥,我们的信息还是变成不安全的了。我们要如何安全的传输这个对称密钥呢,这就要看接下来的内容了。

3.2引入非对称加密

非对称加密,要用到两个钥匙,一个叫“公钥”,一个叫“私钥”。

公钥和私钥是成对出现的,

  • 我们通过公钥加密,必须通过私钥解密;
  • 我们通过私钥加密,必须通过公钥解密。

公钥和私钥的区别】公钥就是明文传输的客户端的内容,客户端会使用它加密对称密钥。私钥就是服务端自己保留的。服务端产生的一对非对称密钥,谁做私钥,谁做公钥是没有区别的,区分的关键就是哪个是服务器保留的,哪个是服务器发送给客户端的。

我们引入非对称密钥后,请求就变成了这样:

  • 客户端请求建立连接,并发送给了服务端;
  • 服务器收到请求后,产生一对非堆成密钥,并将公钥明文传输,此时黑客和客户端都能收到公钥;
  • 客户端收到公钥后,将对称密钥使用公钥1进行加密得到密文1;
  • 黑客收到了密文1,由于没有私钥,就无法解密,就将密文传给服务端;
  • 服务端收到密文1后,进行解密,就得到了客户端产生的对称密钥1。双方就可以使用对称密钥进行数据传输。

HTTPS_第7张图片

通俗的栗子】

我们需要收信人和发信人都使用相同的保险箱和钥匙,但是这个保险箱只有发信人有,我们将如何送给收信人呢?

  • 发信人写了封信,要求与收信人建立连接;
  • 收信人收到后,将自己独有的保险箱(这里只有保险箱没有钥匙),交给了不正经的快递员;
  • 发信人收到保险箱后,将双方交流需要使用保险箱2和钥匙2都放入其中,发送收信人,由于不正经的收信员没有保险箱1的钥匙,就无法拿到里面的密钥;
  • 收信人收到后就可以使用保险箱2和钥匙2进行双方的交流。HTTPS_第8张图片

对称密钥和非对称密钥的优劣

对称密钥】加密和解密速度快

非对称密钥】加密和解密速度慢,但是由于私钥没有在网络中传输,是安全的。

非对称密钥更加安全的原因】

我们发送信息的时候,只把公钥进行了网络传输,这个公钥,只是用来加密的,是没有解密功能的。同时私钥一直是服务器持有,没有经过网络传输,所以是安全的。

但是我们这样做就真的安全了吗?

3.3中间人攻击

HTTPS_第9张图片

  • 首先客户端发送给服务端,要求建立连接;
  • 服务端收到以后,产生非对称密钥(公钥1,私钥1),并发送公钥1;
  • 黑客收到公钥1的时候截胡,并停止发送给客户端,也产生一对非对称密钥(公钥2,私钥2),并发送公钥2给客户端。
  • 客户端收到公钥2的时候把信息使用公钥2进行加密,并发送给服务端;
  • 黑客截取到密文1后,使用私钥2进行解密,获取对称密钥,并把对称密钥使用公钥1进行加密,发给服务器;
  • 服务器收到密文2以后,使用私钥1进行解密,获得对称密钥,并开始进行交流。
  • 此时由于黑客获得了对称密钥,双方之间的通信还是会被看到,这里黑客的重点是欺骗客户端,网络上传输的是服务端产生的公钥以及欺骗服务器网络上传输的是客户端传输的数据。但其实都是黑客篡改的数据。

通俗的栗子

  • 首先送信人写了封信,要求建立连接;
  • 收信人收到后,把保险箱1交给不正经的送信员,并把钥匙1自己保留;
  • 不正经的送信员收到保险箱1后,把它替换成自己的保险箱2,并发送,钥匙2自己留下;
  • 送信人收到后,认为这是收信人发送的保险箱,就把以后交流的密钥放在里面,锁好并交给不正经的送信员;
  • 送信员收到后,使用钥匙2开锁,查看里面的密钥,并把密钥放入保险箱1锁好,送给收信人;
  • 收信人收到后,是已经锁好保险箱1,认为这就是收信人送来的,并开锁,查看密钥,进行之后的交流。 

HTTPS_第10张图片

就真的没有破解这种困境的方法了吗?我们看以下的内容。

3.4引入证书

解决中间人攻击的关键在于:让客户端相信这是服务器发来的公钥。

在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书

这个证书包含了刚才提要的公钥,也包含了网站的身份信息。这些证书包含了以下的信息:

  • 证书发布机构
  • 证书有效期
  • 公钥
  • 证书所有者
  • 签名
  • .........

相关机构会对证书的内容/属性等相关内容进行计算得到一个哈希值,并放入证书中,使用机构自己的非对称密钥进行加密签名。由于每个计算机内部都内置了这公钥可以用来解密,从而验证证书的真实性。

当客户端获取到这个证书以后,会对证书进行校验(防止证书是伪造的)

  • 判定证书的有效期是否过期
  • 判定证书的发布机构是否受信任(操作系统中已经内置了受信任的证书发布机构)
  • 验证证书是否被篡改:从系统中拿到该证书发布机构的公钥,对签名解密,得到一个hash值(称为数据摘要),设为hash1,然后计算整个证书的hash值,设为hash2,对比hash1和hash2是否相等,如果相等,则说明是没有篡改过的。

完整的过程】

HTTPS_第11张图片

  •  首先服务器会产生一对非对称密钥(公钥2,私钥2),并填写网站的相关信息,向相关机构申请证书;
  • 相关机构收到这个信息后,就颁发证书(证书内包含:公钥2,证书所有者,证书发布机构,密钥等),并对证书的内容使用自己的私钥1进行加密。发给服务器
  • 客户端开始请求建立连接,发送信息刚给服务器;
  • 服务器收到后,向客户端发送证书;
  • 黑客捕获到这个证书,由于有签名的存在,是无法改变里面的内容的,就意味着无法像中间人攻击一样,伪造公钥(如果黑客使用电脑自带的公钥1对证书进行解密,并篡改,由于没有私钥1,是无法重新加密的,这个是客户端不承认的),无奈只有继续发送;
  • 客户端收到这个证书以后,使用电脑自带的公钥1对签名进行解密,并对内容进行响应的计算,看它是否和签名相同,如果不相同,说明被篡改了,如果相同,就使用证书中的公钥2对以后交流使用的对称密钥进行加密,并发送;
  • 由于黑客并没有私钥2,无法对该信息进行解密,只有让加密过的对称密钥继续发送;
  • 服务器收到以后,使用私钥2进行机密,获得对称密钥,并进行以后的交流。

这里的关键是黑客无法仿造证书,同时客户端会验证证书的真实性,使得正确的公钥2发送给客户端。

你可能感兴趣的:(javaEE初级,HTTP,笔记,https,网络,网络协议)