近年来,互联网发生了翻天覆地的变化。尤其是我们始终习惯的HTTP协议,慢慢被HTTPS取代。这样的话,为何要用HTTPS呢?是因为HTTP不安全!
在讨论HTTPS协议事先,我们先总结一下HTTP协议的概念。HTTP协议是一种基于文本的传输协议,位于OSI网络模型的应用层。HTTP协议利用客户端和服务器的请求响应开展通信。现阶段,该协议被RFC2616分为6个独立自主的协议规范(RFC7230、RFC7231、RFC7232、RFC7233、RFC7234和RFC7235)。通信信息如下:
HTTP中间人攻击
HTTP协议应用起来很便捷,可是存在一个致命的缺陷:不安全。我们知道HTTP协议中的消息都是明文传输的,并没有任何数据加密。这会造成 什么问题?这里存在一个例子:小亮在java贴吧发帖,内容是“我喜欢Java”。他被中间人攻击,内容改成“我喜欢PHP”。能够看出,在HTTP传输过程中,中间人能够看到并修改HTTP通信中的所有请求和响应,所以应用HTTP是非常不安全的。为了防止中间人攻击,这个时候可能有人会想。由于内容是明文,我用对称加密信息开展数据加密,使中间人看不到明文,所以做了如下变换:双方约定加密方式,如下图:用AES对消息开展数据加密,如下图。
看似中间人无法获得明文信息,但实际上,加密方法和密钥在通信过程中还是会以明文的形式暴露出来。假如首次通信被拦截,密钥会泄露给中间人,中间人依然能够解密后续的通信,如下图所示。所以在这种情况下,我们一定会考虑是否能够数据加密密钥,让中间人看不到。答案是肯定的,应用非对称加密,我们可以利用RSA算法来实现。当加密方法达成一致时,服务器生成一对公钥和私钥,服务器将公钥返回给客户端。客户端在本地生成一系列对称加密的密钥(AES_KEY),由服务器发送的公钥数据加密后返回给服务器。服务器利用私钥对客户端上传的AES_KEY_SECRET开展解密,获得AEK_KEY。最后,客户机和服务器利用AEK_密钥传递数据加密消息。能够看出,这种情况下,中间人无法窃取AES加密的密钥,所以肯定无法解密后续通信,那么这样做是否绝对安全?
俗话说,中间人想出了新的破解方案来对应这种加密方式。既然如此拿不到AES_KEY,我便把自己模仿成客户端和服务器的组合。
中间人模仿了客户→中间人过程中服务器的行为,进而能够获得客户请求的明文。中间人攻击能够利用中间人模仿客户端在中间人→服务器的过程中的行为来进行。
此次,通信再度被中间人截获。中间人伪造两个公钥和私钥,将公钥发送给客户,窃取客户端生成的AES_KEY。获得AES_KEY后,就可以轻松解密了。如果中间商为所欲为,就没有办法惩罚他们。当然有。接下来,让我们看看HTTPS是如何解决通信安全问题的。