前言
HTTP作为我们开发者接触最多的一种应用层的协议,其有很多我们值得深入研究的地方,也是面试中网络这部分的重点之一。比如HTTP1.0—》HTTP1.1—》HTTP2.0—》HTTP3.0的升级迭代,这里面也是别有洞天的,不过我们今天来讲HTTP协议另外的一个重点,就是HTTPS是怎么做的。
一、什么是HTTPS?
说到HTTPS,背过八股文的人应该都能脱口而出,HTTPS就是使用了SSL安全套接字层的HTTP协议,HTTP不安全是因为使用的是socket套接字嘛,所以对socket进行了加强变成了SSL,有了SSL,HTTP发送的报文经过SSL加密以后,就不再是明文传输了,加密后的报文还是经过四层封包之后通过网卡发送出去,通过网络中心的传递到达另一台主机,另一台主机也是用了SSL,然后解密即可。这样的HTTP就是安全的HTTP了。
二 深入分析安全协议
SSL对我们来说像是一个黑盒子,报文进入SSL就加密了,安全的到达另一端SSL解密就可以了。
那么这个黑盒子里面是怎么做的呢,今天我们就来好好的扒拉扒拉。
讲之前我们先来看一看安全通信需要具备的特征
1 机密性
2 报文完整性
3 端点鉴别
4 运行安全性
我们举一个生活中的例子来说明上述特点的必要性,假如两个人小A和小B需要做到安全通信,首先它们会约定一个地点,这对应了第三个特点端点鉴别,作为小A,我肯定要见到小B才进行通信,要不然有人冒充怎么办?在现实世界中,这个很容易做到,但是对于网络世界就比较麻烦。然后小A需要找一个安全的地方,不能取叙利亚那边交流吧,不然命都没了还通信什么,这对应网络世界中的防火墙之类的保护电脑的措施,运行安全性是根基!,经过了上面两步,两个人终于可以通信了,为了防止特务和间谍,两人需要对通信的内容进行加密,这里对应的就是第一个特点,对应网络世界中的一些加密算法对报文进行加密,最后一点就是报文完整性,比如A给B说话,内容是我爱你,结果穿过去了加密后的内容变成了我爱,这时候B就不知道A到底啥意思。虽然在现实世界很少出现这种情况,但是在网络世界很容易出现,比如A发过去的报文被黑客劫持了,虽然你加密了我解不开,但是可以给你添油加醋或者删删减减,所以报文完整性也是需要考虑的。
至此,我们就把安全通信需要考虑的特性都分析了一遍,我们回到文章开头说了,你还单纯的认为SSL只是做了报文加密吗?很明显他做到了上述的四个特点,加密只是其中的一点。
至少SSL做到了其中的三点,第四点运行安全性一般是由防火墙或者其他的组件做的,我们下面就一个一个的去分析,SSL是怎么实现的这三个特点。
2.1机密性
机密性其实就是对报文进行加密,加密分为我们熟悉的对称加密和非对称加密,本文会举一些浅显的例子去解释二者的区别。
对称加密
所有的密码算法都涉及用一种东西去替换另一种东西的思想,这里举一个古代的加密算法凯撒密码,它的加密方式是这样的,将明文报文中的每个字母用字母表中该字母后k个字母进行替换,这里对报文bob进行加密,这里假设k=3,b的后面三个是e,所有报文就变成了ere。然后接收者收到ere之后进行解密,怎么解密呢?接收者肯定也知道这个加密算法,解密无非就是一个还原的过程。
非对称加密
加密通信需要通信双方共享一个共同的密码,这种方式一个困难是双方必须就共享密码达成一致,但是这样做的前提是需要通信,在现实世界中可能比较简单,双方约定个地点然后共享密码就行了,但是在网络世界,密码的通信也是不安全的,你发送的密码很可能就被人劫持了,然后双方的通信对于劫持密码的人来说就是明文传输了。
1976年开创了公开密钥加密的算法,也就是非对称加密。
这时通信的双方每个人有两个密钥,一个叫做公钥,一个叫做私钥。公钥每个人都可以得到,但是私钥只有自己知道,通过公钥加密的报文只能通过私钥去解密,通过私钥加密的报文也可以通过公钥去解密,记住这句话。我们假设两人需要通信,那么首先A取得B的公钥,这很简单因为是公开的,然后对报文进行加密,接着A就可以传输这个加密后的报文了,别人可以获取这些加密的报文,但是你没有私钥你解不开只能干着急,B收到以后,因为他有私钥,所以他就可以解开报文变成明文阅读了。我们看到通信过程中并没有涉及到分发密钥的过程。
比较有名的加密算法有RSA和Diffie-Hellman
这里简单对比一下二者的优缺点
对称加密
优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:秘钥的管理和分发非常困难,不够安全。在数据传送前,发送方和接收方必须商定好秘钥,然后双方都必须要保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
非对称加密
优点:安全性更高,公钥是公开的,秘钥是自己保存的,不需要将私钥给别人。 缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
你可能会疑惑为什么对称加密的速度快效率高,此部分笔者不进行深入分析,我们把它留给数学家去证明吧。
这里留一个问题,A如何证明他拿到的公钥是B的呢?
2.2报文完整性
我们解决了第一个问题,就是加密的问题,下面我们来看一下第二个特性报文完整性。
这个完整性包括两部分,1是报文没有被篡改,2是报文确实源自通信的另一方。
这里可能有人会对2表示疑问,2不是应该由端点鉴别却解决吗?为什么放在报文完整性去解决呢?
这里笔者卖个关子,接着往下看。
讲之前如果不提一下密码散列函数,那将是一个失误,因为报文的完整性就是由它确保的。
这里大家想一下什么叫做完整,完整就是你传过来什么我就要收到什么,不然就是不完整。
密码散列函数有下列附加的性质。
找到任意两个不同的报文x和y使得H(x)==H(y),在计算上是不可能的。
这种性质就意味着入侵者在计算上不可能用其他报文去做由散列函数保护的报文。这就是说如果(m,H(m))是报文和由发送方生成的报文散列的话,则入侵者不可能伪造另一个报文y,使得该报文具有与原报文相同的散列值。
解决了问题1后,我们来看一下问题2要怎么去解决。
报文鉴别码就出现了。
我们先来看下面的一个问题
A生成报文m并计算散列函数H(m)(例如使用SHA-1)
然后A将(m,H(m))扩展报文发送给B,B收到后对m进行计算,如果H(m)和收到的相同,说明报文是完整的,反之就有问题。
但是这里有一个问题,黑客也去发一个(x,H(x)),B收到后通过计算发现报文没有问题,但是B并不知道这是黑客发的。
所以就有了报文鉴别码。
这时A和B需要共享一个密码s,A生成的报文包括一个s,计算散列H(m+s)生成报文鉴别码MAC,将扩展报文段(m,H(m+s))发送给B,B收到后进行计算,因为B有密码s,将m和s拼接后计算就可以知道报文是否完整了。
2.3端点鉴别
端点鉴别的实现是通过ap协议也就是认证协议,由于此协议过于复杂,笔者这里不展开讲它的实现方式。
我们只需知道通过ap协议就可以使得网络中通信的双方能够鉴定彼此,一般发生在SSL中的握手阶段。
这里我们回答一下2.2中的一个问题,为什么有了端点鉴别,还需要有2.2中的报文验证码。
笔者是这样理解的,因为ap保证经过连接双方的身身份,但是黑客可不会走连接的过程,它可以通过对你直接发送报文的形式去攻击你。
总结
到这里,安全传输的特性我们就介绍完了。
我们模拟一个这个场景,通信的A和B双方。在一个安全的环境下(有诸如防火墙之类的保护),首先通过端点鉴别确认双方,然后传送完整的,并且使用非对称加密后端报文。
这样问题就解决了。
这样就结束了吗?还记得第一个问题吗,A如何证明他拿到的公钥是B的呢?
这里我们不得不提到数字签名了,数字签名的一个应用就是公钥认证,即证实一个公钥属于一个特定的实体。
这里的详细认证实际上还涉及到CA,笔者就不一一展开讲解了。