1 问题提出
现在广泛使用的HTTP协议采用的是一种明文传输的方式,因此通信双方的数据在网络上传输是十分不安全的。
2 解决方案一种简单的解决方案就是对传输的数据进行加密处理。
目前流行的加密方式有两种:对称加密和非对称加密。
2.1 对称加密首先讨论对称加密方式。
对称加密指的是通信双方使用同一套密钥对数据进行加密和解密。
如果使用对称加密就意味着通信的双方必须都知道密钥,才能完成加密和解密操作。
一种典型的场景是:客户端发送密钥至服务器,服务器接受该密钥,之后所有的数据传输都采用该密钥进行加密和解密;
该方法虽然可以解决明文传输的问题,却存在安全隐患。在密钥协商阶段,客户端需要发送密钥给服务器,此时如果攻击者监测到该密钥,就可以使用该密钥来解密之后所有的数据,那么本次经对称加密后的数据传输也就变为明文传输。
因此,如何确保对称加密方式中密钥的安全是此方式中最为核心的问题。
2.2 非对称加密接下来我们讨论非对称加密方式。 非对称加密的密钥有公钥和私钥之分,使用公钥加密的数据只有私钥才能解密,同理使用私钥加密的数据只有公钥才能解密。
那么对传输数据进行非对称加密是不是就是安全的呢?
非对称加密一种典型的场景是: 由服务器生成公钥和私钥,并将公钥发送给客户端,之后服务器和客户端之间所有的数据都采用公钥和私钥加密。
接下来我们分析下这种场景。 客户端接受到服务器发来的公钥,然后使用公钥对数据进行加密,根据非对称加密的原理,我们了解这种加密数据只有服务器使用私钥才能解密,因此任何攻击者截取到该信息都无法完成解密,所以任何由客户端向服务器发送的数据都是安全的。
但是,在开始阶段,服务器需要将公钥发送给客户端,在这个过程中,攻击者就有可能会拿到公钥,这就意味之后所有由服务器发给客户端的,经私钥加密的数据,攻击者同样可以用截取到的公钥对其进行解密。
综上,我们得出,采用非对称加密的方式只能保证客户端到服务器的数据是安全的,并不能保证服务器到客户端也是安全的,因此只是一种单向安全的加密方式。
2.3 混合加密方式接下来我们探讨采用对称加密+非对称加密混合加密方式。
通过 2.1 对称加密方式 一节的分析,我们知道,此种方式最大的问题在于密钥的安全性,一旦密钥被攻击者获取,那么本次传输将变为明文传输。通过 2.2 非对称加密方式 我们了解非对称加密只是单向安全的数据传输,即只有客户端到服务器的传输才是安全的。
结合二者的特点,我们提出,通信双方所有的数据传输采用对称加密方式,密钥的传输采用非对称加密方式。
一种典型的场景是:
服务器生成公钥和私钥,并将公钥发给客户端;
客户端生成对称加密的密钥,用公钥对该密钥进行加密,并发给服务器,之后所有的数据传输都使用该密钥进行加密;
服务器收到该客户端发过来的经公钥加密的数据,使用私钥对其解密,从而得到客户端的密钥,之后所有来自该客户端的数据,都使用该密钥解密。
这种混合加密的方式在一定程度上确实能提高数据传输的安全性,但是它就一定安全吗? 我 们 日常上网 经 常会使用代理服 务 器,如果代理服 务 器 伪 造来自真 实 服 务 器的公 钥 并 发给 客 户 端,那么之后所有的 传输 也将 变为 明文 传输 。
因此, 对 于混合加密方式核心的 问题 在于无法确 认该 公 钥 是否来自真 实 服 务 器,而不是代理服 务 器的公 钥 。
2.4 证书
在混合加密方式中,客 户 端是直接向服 务 器 请 求公 钥 , 该 公 钥 有可能被 伪 造。我 们 改 进 一下 这 种方式,引入 证书 的概念。
证书包含三部分信息:
服 务 器公 钥 等明文信息;
摘要;
数字 签 名;
摘要 = hash( 明文信息 );
数字 签 名 = 该证书的颁发机构私钥加密 ( 摘要 ) ;
一种典型的 场 景是:
客 户 端向服 务 器 请 求 证书 ;
找到 证书颁发 机构的 证书 , 获 取公 钥 ,然后解密数字 签 名,得到摘要 A ;
hash( 明文信息 ) = 摘要 B ;
比 较 A 和 B 是否相等, 验证证书 合法性。
此 举 能 够验证该证书 确 实 是由某 证书 机构 颁发 的,但是 该 机构就一定是合法的 吗 ?所以需要再次 验证 它的合法性。
采取上述同 样 的方法来 验证该 机构的合法性,一 层层 的向上 验证 ,最 终 在客 户 端 浏览 器中会 预 先安装全球受信任的 证书颁发 机构的 证书 ,我 们 称之 为 根 证书 。
所以 对 于每一个服 务 器的 证书 ,采取向上一 层层 的 验证证书颁发颁发 机构的合法性,只要最 终经过 了根 证书 的 验证 , 则 表示 该证书 是合法的。
后面的博客将探 讨 https 实现的细节,如果您有兴趣可关注后续博文。
参考文献
[1] 腾讯 Bugly. 全站 HTTPS 来了 .[EB/OL].[2016-12-09].https://segmentfault.com/a/1190000004199917附 录
常 见 的 hash 算法: MD5SHA1 SHA256
常 见 的 对 称加密算法: DES 3DES TDEA Blowfish RC5 IDEA
常 见 的非 对 称加密算法: RSA ECC Elgamal