===============

前言


继续上一篇文章深入研究网络相关的知识,因为上一篇还是有很多没有解释很清楚的地方,所以在这里想讲讲自己对http和https的理解。

自从苹果更新了iOS9.0之后一直没机会研究它为什么把所以的请求都改为了https,第一反应肯定是考虑安全方面,那到底http和https有什么区别,https改善了http的哪些安全方面的不足呢?

Http的缺点


Http从1990年正式推出到后面更新到Http/2之后就再也没更新。而在安全方面它只是更新到了1.1,也就是说这么多年来Http一直都没有解决安全方面的问题。

1.因为Http的通信是明文的,所以存在被窃听的风险。
2.无法确认身份。
3.无法验证报文的完整性。

通信明文

因为Http本身没有加密功能,所以在通信过程中都是明文通信的,这样会造成被第三方窃听的危险。

目前比较普遍的解决方式就是对通信内容进行加密,在客户端与服务端在通信之间对通信的数据进行加密,这样即使被窃听了,窃听方必须进行解密才能看到数据内容。但是这并不是最安全的方式,因为还是有可能会被解密的。

无法验证通信方的身份

因为Http没有验证身份的功能,所以很有可能会被人伪装。

  • 目前很多都是用用户密码的方式来验证身份,但是一旦密码被窃取就会被其他人伪装,所以也不是很安全,这是第一点。
  • 是如果服务器不对客户端请求进行身份认证的话,那随便哪个客户端都能对服务器进行通信,这样可能造成恶意攻击等问题而使服务器浪费不必要的资源甚至瘫痪。
  • 因为无法验证身份所以,在通信过程中服务端无法得知客户端是谁,客户端也不知道得到的响应是谁发送过来的,其中很有可能伪装的。

无法验证报文的完整性

因为Http无法验证收到的报文信息的完整性。因此通信双方无法在收到信息前得知发送过来的报文是否和接收到的报文是否一致,也就是说无法验证在途中是否被篡改过。

Https的优点


那知道了以上的缺点之后大概也能猜得出Https和Http有什么区别了吧。Https就是Http

  • 通信加密 + 身份认证 +
    数据完整性的保护。Https主要应用在需要在安全上面做一些保护的通信上,比如像平时登录淘宝,浏览器的地址栏会有一个带锁的标志,这个就是Https通信的标识。

有一点需要先说清楚,Https并不是新的协议,它只是对原先的Http套了一层壳,这个壳的作用就是起到了保护的作用,可以说是对Http给了套装备,但是它还是Http。而这层壳的名字就叫SSL(Secure
Socket Layer),通常都是Http和TCP通信,加了SSL层之后就变成先是 Http 和
SSL通信,然后再由SSL和TCP通信。

经过SSL这一层的保护之后,Http就有了通信加密,身份认证(证书)和数据完整性验证的功能了。

![](./谈谈Http和Https _ 飞奔的蜗牛的博客_files/https_01.jpg)

Https是如何解决这些问题的


SSL使用了公开秘钥加密技术,从而解决了通信加密和身份认证的问题。

相互交换的公开密钥加密技术

大家都知道,外面的很多加密算法都是公开的,所以不是很安全。这里所指的公开密钥加密技术就是在通信双方各持2种密钥,一种是公开密钥一种是私钥,公钥和密钥的关系就是公钥加密了,就要用对方的私钥解密。

比方说客户端有份需要加密的数据需要发送给服务器,它首先持手中的公钥对数据进行了加密,然后连同数据一起发送给服务器,这个时候服务器拿到加密后的数据和客户端发过来的公钥后,它会对公钥进行验证确认下是不是自己人,这里就先解决了身份认证的问题。然后服务器持手中的私钥,这个是只有服务器才有的钥匙,对数据进行解密。因为私钥从未公开过,所以没有人能拿到这个私钥,而发送过来的公钥是不能够对这份数据进行解密的,所以也解决了数据加密而防止被人破解的问题。

![](./谈谈Http和Https _ 飞奔的蜗牛的博客_files/https_02.jpg)

为什么要用公钥私钥两把钥匙,因为如果通信双方公用一把钥匙的话就可能会被拦截,然后使用这把钥匙给解密。但是如果不发送钥匙的话又不知道对方的身份。

这里有个疑问,密钥是从何而来的?密钥其实就是一种加密算法。如果被攻击者偷偷替换掉了公钥,那数据不就危险了吗?这个是这个技术唯一的缺点,当然也有解决方法,那就是从第三方证书颁发机构申请,当然这个是需要付费的。当你用自己的密钥向可靠的第三方申请数字证书的时候,第三方颁布的它会把密钥和带有数字签名的证书绑定在一起,这个时候当你需要验证这份公钥是否是自己的就可以通过第三方验证。

![](./谈谈Http和Https _ 飞奔的蜗牛的博客_files/https_03.jpg)

关于第三点,因为通信被加密了所以也就不存在数据被人篡改的问题了

已知SSL的缺点

其实SSL真正用起来的话比刚刚所说的还要复杂,除了密钥公钥,验证密钥,加密解密等步骤,还有一些零零碎碎的会话需要处理,所以相比http会慢很多。不过起码保证了安全嘛,而且平时开发中只有涉及到敏感数据才使用SSL。否则对服务器压力太大也是件麻烦事。

总结

看过书之后以前一直觉得远不可攀的这些东西,自己琢磨之后也就那回事情,虽然本文章并没有把Https的方方面面给讲透,但已经把核心部分给说明了。总结下来就是