一、http数据传输的不安全
使用http协议进行网络数据传输的最大不足是:数据没有安全性可言,所有的数据都是明文传输的,所以一旦被第三方截获就造成了数据泄漏。
二、https数据传输的安全性
https协议可以看成是http协议的升级版,https=http+SSL,下面以渐进的方式来说明https是如何保证数据传输的安全性的。
2.1使用对称算法
既然http的数据是以明文的方式进行传输的,那么我们就使用加密算法对数据进行加密处理。之所以没有采用非对称算法对数据进行加密处理,是因为对称算法的处理速度要远远高于非对称算法的处理速度。
但是对称算法进行加密有一个问题就是:当server和client准备使用对称算法进行加密通讯之前,需要将公钥(之后为了和非对称公私钥中的公钥进行区分,称其为通讯公钥)从某一方传输到另一方。如果第三方截获了这个通讯公钥,之后server和client的数据传输就失去了意义,第三方可以使用截获的通讯公钥获取到通讯的数据。
2.2使用非对称算法解决对称加密的公钥泄漏问题
针对上面提到的问题,我们可以使用非对称算法来对通讯公钥进行加密传输。这里需要说明的一点是为什么不使用对称算法进行通讯公钥的加密传输,其实道理很简单,可以参考2.1中的观点。而使用非对称算法就没有这个问题,假设server需要将通讯公钥发送给client,那么server使用client的非对称公私钥中的公钥(下面称其为加密公钥)对通讯公钥进行加密。这里有个需要思考的问题是:为什么使用非对称公私钥对中的公钥对通讯公钥进行加密,而没有使用私钥对通讯公钥进行加密。假想我们使用私钥对通讯公钥进行加密,由于加密公钥是公开的,所以任何一个拥有加密公钥的人都可以对加密信息进行解密,那么就失去了对通讯公钥加密的意义。其实这里涉及到非对称算法的两个应用领域:一个是签名,另一个是数据加密,显然这里的应用是数据加密。笔者认为数据加密和签名最大的区别就是数据加密的目的是只希望唯一的接受方获取真实数据;而签名的目的是身份验证,试想如果签名采用的是公钥加密,那么任何一个拥有公钥的人都可以这么做,这样还能达到验证身份的目的么?所以前者采用公钥加密,后者采用私钥加密。
上面解释了为什么使用非对称算法加密,以及为什么使用非对称公私钥中的公钥进行加密。下面介绍下非对称算法+对称算法试图解决单纯的对称算法进行数据传输的公钥被截获的思路。server试图通过加密公钥对通讯公钥进行加密、然后client使用私钥进行解密获取通讯公钥、client使用通讯公钥进行数据加密及通讯。
这里有个问题,就是第三方还是可以介入。第三方拦截加密信息后,server使用公钥对另一个通讯公钥(为了和前面的通讯公钥进行区分,笔者定义为通讯公钥2)进行加密、client使用私钥进行解密得到通讯公钥2、client使用通讯公钥2进行加密数据、第三方拦截加密数据并用通讯公钥2进行解密。还是会有数据传输不安全的问题存在(两种过程的详细情况见下图)。至此分析下使用对称加密进行数据传输和非对称加密+对称加密进行数据传输的异同点:都导致了通讯数据的泄漏,但是前者中第三方是拦截信息然后获取通讯信息中的通讯公钥,而后者中第三方是拦截信息丢弃信息然后发送另一个通讯公钥2给client。前者的问题是公钥传输的无加密性,后者的问题是公钥来源的不明确。
2.3使用证书解决对称算法+非对称算法的第三方介入问题
上面提到了非对称加密+对称加密公钥来源不明确的问题,为了解决这个问题,我们引入CA证书。既然client接收到的公钥来源不明确,我们可以使用签名的思想来进行公钥来源的验证:可以对通讯公钥进行server的私钥进行签名,然后client拿到签名之后使用server的公钥进行解密验签,如果解密之后的信息和传过来的通讯公钥一致,表明通讯公钥中途没有被篡改过,也就是通讯公钥来源不变。说明下为什么使用server的私钥进行签名:首先签名的作用就是身份验证,在这里如果第三方截获了信息,试图修改通讯公钥为通讯公钥2并用该公钥进行签名,但是client在接收到信息之后会查找本地中该类型证书的公钥,使用了不匹配的公钥进行验签,验签得到的通讯公钥肯定不是通讯公钥2,表明过程中有人修改了通讯公钥。