javaEE 初阶 — HTTPS 协议

HTTPS


HTTPS 也是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层(SSL)。
HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。


这就导致出现了臭名昭著的 运营商劫持

什么是运营商劫持


比如说我现在要下载一个软件,如果是未被劫持的情况,点击下载按钮, 就会弹出这个软件的下载链接。
但是如果遇到了 运营商劫持,此时点击下载按钮,就会弹出一个其它软件的下载链接。

由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器, 交换机等),
那么运营商的网络设备就可以解析出你传输的数据内容并进行篡改。
点击 “下载按钮”,其实就是在给服务器发送了一个 HTTP 请求,获取到的 HTTP 响应其实就包含了该 APP的下载链接。
运营商劫持之后,就发现这个请求是要下载该app,那么就自动的把交给用户的响应给篡改成其它软件的下载地址了。



这主要还是由于导致运营商进行的劫持。


如何解决讨厌的运营商劫持?

答案就是 加密,HTTPS 就是在 HTTP 的基础上进行了加密,进一步的来保证用户的信息安全~

什么是加密


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

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


在一部《利刃出鞘》这部电影当中,有着这样一个镜头,父亲通过密文的方式告知自己的女儿她的丈夫出轨了。
本来一张纸上是什么都没有的,但是拿着打火机一烤就出现了字迹。




父亲本来要表达的含义是告知女儿她的丈夫出轨了,但是加密后的信息是这张纸上什么都没有了。
通过火烤的形式使字迹显现出来,这里的火源就是 密钥,使字迹消失就是 加密,呈现就是 解密

HTTPS 的工作过程


网络传输中不再直接传输明文了,而是加密之后的 “密文”。

加密的方式有很多,但是整体可以分成两大类: 对称加密非对称加密

1 对称加密


进行安全传输的时候,核心就是加密,其中的 对称加密 是一种最简单有效的办法。

对称加密 是通过一个密钥来进行加密的,当然也可以通过这个密钥来解密。

例如,a(明文)+ key(密钥)=> b(密文)b(密文)+ key(密钥)=> a(明文)

密钥的成分可以认为是一串数字或是一串字符串,在加密的过程中,把明文和字符串进行一系列的数学变换,
这其中最简单的就是 ^(按位异或)


在加密的过程中为了保证其安全性,务必不能被黑客知道。


由于黑客并不知道密钥是什么,即使截获了数据也无法知道是什么意思。

密钥是由客户端生成的还是服务器生成的?

由于一个服务器对应着很多的客户端,这些个客户端都应该有不同的密钥,
假设客户端生一个密钥,此时客户端就需要把密钥告知服务器才行,此时客户端要把密钥发送给服务器。

需要注意的是,由于此时的密钥是刚刚生成的,服务器还不知道,此处传输给服务器是就只能 明文传输
此时传输的密钥就有可能会被黑客截获。



此时我们要考虑的问题就是如何把密钥安全的传输给服务器,当然还得是加密

此时就可以使用 非对称加密

2 非对称加密


先是生成 一对密钥,并且分为 公钥私钥

明文 + 公钥 => 密文
密文 + 私钥 => 明文

也就是说,使用 公钥 就是加密,使用 私钥 就是解密,或者反过来也可以。




服务器生成了一对 公钥私钥,客户端持有公钥,服务器持有私钥。
此时客户端的公钥是从服务器拿的,黑客虽然也能知道公钥,但是不知道私钥,因为私钥是只有服务器才知道的。

此时的客户端使用公钥来对对称密钥进行加密,传输给服务器,此时的服务器就可以拿着自己的私钥来解密了,
解密后就可以得到对称密钥。

此时的客户端服务器就可以使用这个对称密钥进行后续的传输了。


需要注意的是 客户端是不需要 私钥 的,因为 非对称加密只是用来加密要传输的对称密钥 的,
一旦对称密钥顺利的到达服务器之后,后续的传输都会使用对称加密来进行加密了。

如果全部使用非对称加密是不太可以的,因为非对称加密速度回比较慢,
在保证安全的前提下要尽可能的提升速度。

3 中间人攻击


既然服务器可以发送 公钥 给客户端,那黑客能不能模仿服务器给客户端发送自己的 公钥?
当是是可以的,这其实就是中间人攻击


如果客户端接收的是黑客所发的公钥,那么此时客户端就会把加密过后的密钥发送给黑客了。

举一个例子。

张三是一个缉毒警察的卧底,李四是一个毒贩,还有另外两个毒贩 A 和 毒贩 B。
A 与 B 相互之间是不认识的,但是他们两个都认识李四,李四是作为中间人的存在。

李四先带着张三与 A 会面,此时张三就扮演 B;然后李四再带着张三与 B 会面,此时的张三就扮演 A。
这个时候,倒置 A B 两人会面的时候,其中的细节已经被警方知道了,此时就可以一网打尽了。


3.1 预防中间人攻击


解决中间人攻击的关键就是,要让客户端能够分辨当前的这个公钥是不是服务器的公钥。
此时就可以引入一个 “证书”,本质上是一个第三方的证机构

服务器(网站)在设立之初,就需要去专门的认证机构申请证书(提供一些资质)。
审核通过之后,就会颁发证书,服务器生成的公钥,也就包含在这个证书中。

此时的客户端向服务器请求公钥的是时候,就不再是简单的请求一个公钥了,而是把整个证书都给请求过来。

客户端拿到证书后,就可以对证书进行校验,验证一下此时的证书是不是假的或者是不是被篡改的。
如果发现证书是无效的,浏览器就会直接弹框警告。




客户端拿到证书后,就可以对证书进行校验,证书上面会带有一个特定的字段,叫做证书的签名
就好比找老师请假需要老师是的签字一样,学校门卫就会看这个签名是不是老师写的。


假如一个证书的字段1是 abc、字段2是 cde、字段3是 gdj、公钥是 0xaabbccdd…
证书里还带有一个签名:sdbdsbcskdbskaskc。

这里的签名实际上是一个被加密的字符串,客户端可以使用认证机构提供的公钥进行解密。
解密之后,得到的结果相当于是一个 hash 值。类似于 tcp udp 里的校验和,这是根据证书的其它字段总和计算的结果。


客户端可以使用同样的 hash 算法,针对其它字段再算一次 hash 值,得到一个 hash2,
看看此时的 hash1(从签名中解出来的)和 hash2(客户端自己算的)这两个值是不是相同,
如果是相同的,说明证书是有效的,如果不相同说明证书被篡改了。


认证机构也有一组 公钥私钥,私钥用来加密 hash 值得到签名,公钥是客户端用来解密签名获取 hash 值的。

黑客是不能自加把证书给篡改的,比如把公钥更改。
因为一旦换了公钥,意味着客户端算出的 hash2 值 和 签名解密出来的 hash1 值就对不上了,
客户端也就知道无效了。

另外,黑客是不知道认证机构的私钥的,即使黑客自己算好了个新的篡改后的 hash 值,
也是无法加密生成签名的。




猜你喜欢

转载自blog.csdn.net/m0_63033419/article/details/129970886