Java EE(19)——网络原理——应用层HTTPS协议
前言
上篇博文介绍了HTTP协议(Java EE(18)——网络原理——应用层HTTP协议),这篇篇博文在了解HTTP协议的基础上再介绍HTTPS协议
1.什么是HTTPS协议?
HTTPS协议是一种通过计算机网络进行安全通信的协议。它是HTTP协议的安全版本,在HTTP协议的基础上加入SSL/TLS加密层来实现数据的安全传输,在传输层的默认端口号是443。HTTP该有的特性HTTPS也有
2.理解加密
2.1概念
加密是将明文(可直接理解的信息)转换为密文(不可直接理解的信息)的过程,以保证信息的机密性、完整性和真实性。在加密和解密的过程中,就需要额外的数据来辅助,这样的数据就叫做密钥。下面举个例子来直观的感受一下加密和解密的过程:
在《火烧圆明园》影视剧中,有这么一个场景:有人要尝试干掉慈禧太后,恭亲王奕想递个折子给慈禧太后通风报信,由于慈溪太后身边耳目太多,所以恭亲王就使用了一些手段来加密折子。
加密过程如下
恭亲王还递了一张纸,这张纸上面挖了几个小孔
将这张纸盖在原折子上面,就是恭亲王要说的话:当心肃顺,端华,戴恒。
以上过程中:明文就是折子上的内容,密文就是纸盖住后折子上的内容,密钥是挖了小孔的纸
2.2常见的加密方式
加密一般分为对称加密和非对称加密
2.2.1对称加密
对称加密:加密和解密使用相同的密钥
使用异或操作就可以实现一个简单的对称加密:
设置明文为1234,密钥为8888。通过密钥加密后的密文是1234^8888=9834,当密文到达接收方后,再用密钥进行
解密,9834^8888=1234,把密文还原
当然实际情况中的对称加密算法肯定比单纯的异或操作复杂很多
使用对称加密来传输数据:
这样传输数据貌似没问题,即使黑客抓取到了密文也无法解密。但问题是,客户端和服务器之间的密钥如何约定,毕竟一个服务器对应多个客户端,每个客户端都需要单独的密钥(如果所有客户端都使用同一个密钥,一旦被破解,损失就大了)。
所以,在客户端和服务器正式通信之前,客户端需要生成一个密钥并告诉给服务器,服务器保存对应客户端的密钥即可
以上加密传输有一个巨大漏洞,密钥是明文传输的,一旦被黑客获取到,那么后面的加密请求和相应就形同虚设。为了解决上述问题,就引入了非对称加密
2.2.2非对称加密
非对称加密:加密和解密使用一对公钥和私钥。可以用公钥加密,私钥解密,也可以用私钥加密,公钥解密。公钥可以对外公开,而私钥必须保密
使用非对称加密来传输数据:
大体流程:由服务器生成一对公钥(用于加密)和私钥(用于解密),服务器将公钥传输给客户端。客户端生成一个对称密钥,用公钥加密后传输给服务器,服务器接收到对称密钥后返回响应给客户端。从此以后客户端和服务器通信都使用对称密钥来进行加密
为什么不一直使用非对称加密?
因为非对称加密的成本远远高于对称加密,传输少量数据还可以胜任,但客户端和
服务器之间往往需要传输大量数据,如果一直使用非对称加密会大大降低传输效率
上述操作通过非对称加密能够安全地将对称密钥交给服务器,这个过程中黑客即便进行抓包也无法获取到真正的密钥。但即便通过非对称加密,黑客还是有办法进行破解,那就是中间人攻击问题
2.3中间人攻击问题
服务器生成一对公钥A和私钥A,服务器将公钥A发送给客户端。此时黑客也生成一对公钥B和私钥B,在公钥A经过黑客的路由器时,黑客将公钥A替换成公钥B并发送给客户端。客户端使用公钥B将对称密钥加密后发送给服务器,黑客拥有私钥B,所以能够获取到对称密钥,将对称密钥用公钥A加密后发送给服务器。服务器一看,对称密钥是用公钥A加密的,也不会察觉到问题,返回响应给客户端。从这一刻开始,客户端和服务器都拿到了对称密钥(当然黑客也拿到了,只是客户端和服务器不知道对称密钥已经泄露
),此后通过对称加密来通信,但在黑客面前形同虚设。
仔细分析上述黑客的操作,黑客至始至终都没有拿到私钥A,但获取到了对称密钥
问题在于服务器和客户端无法感知到中间被黑客动了手脚。所以单纯的使用非对称加密,还需要保证以下两个条件:
-
客户端获取到的公钥是服务器传过来的公钥
-
客户端能识别当前这个公钥是不是黑客伪造的
为了解决上述问题,就引入了证书机制
2.4证书
2.4.1证书包含的重要信息
1.证书的颁发机构
2.证书持有者(服务器)的公钥
3.证书有效时间
4.证书持有者的信息
5.数字签名(被公证机构的私钥加密)
2.4.2证书引入流程
- 服务器生成公钥A和私钥A
- 服务器向第三方公证机构申请证书
- 证书(包含公钥A)申请成功后返回给服务器
- 服务器向客户端发送证书
- 客户端拿到证书,将证书中的数据进行哈希计算,得到hash1,再使用公证机构的公钥解密数字签名得到hash2,对比hash1和hash2以验证证书合法性
- 客户端验证成功后使用公钥A加密对称密钥并发送给服务器
- 服务器拿到对称密钥后返回响应给客户端,确定此后通信通过对称密钥来加密
问题1:黑客能拿到证书中的公钥A吗?
答案:是可以的,证书的侧重点是防修改
问题2:黑客能修改证书数据吗?
答案:不能。一旦修改客户端计算出的hash值和解密数字签名得到的hash值不一样
问题3:黑客能伪造证书发给客户端吗?
答案:不能。客户端内置了公证机构的公钥,该公钥无法解密黑客的伪证书,客户端也能发现问题
2.5HTTPS加密过程中涉及到的三组密钥
第一组(非对称加密):用于校验证书是否被篡改,服务器持有私钥(在申请证书时获得),客户端持有公钥(操作系统中包含了可信任的CA机构有哪些,同时包含了对应的公钥)。服务器在客户端请求时,返回携带签名的证书,客户端通过公钥对证书进行验证,保证证书的合法性
第二组(非对称加密):服务器生成的公钥(包含在证书里)和私钥(仅服务器持有),护送客户端的对称密钥到达服务器
第三组(对称加密):客户端和服务器后续通信都使用该密钥加密