前言
加密通信是网络安全领域的关键技术之一,也广泛应用于现代 web 服务器(server)和客户端(client)之间的通信。web 技术诞生之初,server 和 client 之间是基于明文通信的,也就是 HTTP 1.0. 随着技术的发展,HTTPS 逐渐代替了 HTTP,HTTPS 协议能够保证数据不会泄露,不被篡改,所谓 HTTPS,就是 HTTP + TLS/SSL。本文采用看图说话的形式,带你了解加密通信的演进历史和原理,最后总结了现代 web 技术中采用的加密通信机制。
上古时代 - 明文
一对情侣 Jack 和 Rose 之间通信,直接采用明文。一是由于技术原因,二是隐私保护的意识可能还不明显。
明文通信
远古时代 - 对称加密
某一天,Jack 和 Rose 发现,他们之间的悄悄话被别人窃听了。于是,他们商量出了一个办法:约定一套只有他们俩知道的规则,给通信内容加密。这样,即使通信内容被劫持,没有密钥,也看不到原始通信内容。这种方式也就是我们常听到的对称加密。
一把密钥,对称加密
中古时代 - 非对称加密 1.0
时间久了,人们发现对称加密存在一个问题,那就是通信双方必须知道这个共同的密钥,他们得见面才能完成加密通信。那有没有什么办法能做到在不用见面的前提下实现加密通信呢?数学家们给出了答案。
非对称加密 1.0
Jack 和 Rose 分别在本地独自生成了一对密钥,分别是 public key(公钥)和 private key(私钥)。通信开始前,双方互相交换各自的 public key。交换之后,Jack 知道了 public key 2,Rose 也知道了 public key 1.
非对称加密 1.0 - 交换各自公钥
为什么要采用一对密钥呢?
先来看看 Jack 如何给数据加密的:
非对称加密 1.0 - 发送方给数据加密
发送方根据信的内容,采用某种 hash 算法,生成摘要(Digest),然后用自己的私钥(private key 1)加密,生成数字签名(Sinature),再把数字签名和信件一起发送出去。
Rose 如何处理收到的加密信件:
非对称加密 1.0 - 接收方解密数据
Rose 收到 Jack 的加密信件后,采用和 Jack 同样的 hash 算法,对信件内容进行 hash 运算,得到 Digest A。接着,用之前收到的 Jack 的公钥(也就是 public key 1)解密 Sinature 文件,得到 Digest B。比较摘要 A 和摘要 B,如果 Digest A 和 Digest B 相等,表明信件内容没有被篡改。
虽然非对称加密比对称加密方便很多,通信双方不需要互相见面就能实现加密通信。然而,还是有个问题:在互相交换公钥的过程中,很容易被第三方黑客劫持。黑客拦截了双方的公钥之后,再伪造两个公钥匙分别发给 Jack 和 Rose,那么通信内容就彻底泄露了。
非对称加密 1.0 - 公钥被劫持
现代 - 非对称加密 2.0
为了解决非对称加密的弊端,科学家们想出了一个办法,那就是引入 CA(Certificate Authority,认证中心),CA 出现的意义就是去保证 public key 的真实性。
CA 的功能有两个:一是颁发 CA 证书;二是制作数字证书(Digital Certificate)。具体是怎么做的呢?
非对称加密 2.0 - CA 的功能
CA 自己生成一对公钥和私钥(私钥是绝对保密,不可能泄露的)。CA 证书是客户端(这里对应的是 Rose)使用的,简单理解就是 CA 的公钥,CA 证书一般内置在客户端的浏览器或操作系统里。
非对称加密 2.0 - 数字证书的生成
而数字证书的目的就是用 CA 的私钥给 web 服务器(这里对应的是 Jack) 的 public key 加密,如上图所示。Jack 拿到 CA 的数字证书之后,和信件内容,数字签名(Sinature)一起打包发给 Rose.
非对称加密 2.0 - 解密流程
Rose 拿到加密数据后,用 CA 证书里的 CA 公钥解密数字证书,获取 Jack 的 public key 1,然后用 Jack 的公钥(public key 1)解密 Sinature,得到 Digest B。接下来流程就是和非对称加密 1.0 时代相同了。
总结 - 现代 web 技术中的加密通信机制
上文宏观地介绍了加密通信的实现原理和演进历史,其中 hash 算法、公、私钥的生成方法等有很多种实现形式,感兴趣的同学可以进一步研究。值得注意的是,虽然非对称加密是最理想的加密手段,但是实现复杂度较高,比较浪费系统资源。所以,现代 web 加密通信中,数据传输采用对称加密,而对称加密所使用的密钥是基于非对称加密 2.0 技术传输的,具体流程如下:
客户端 向 web 服务器发起一个安全连接的请求服务器返回经过 CA 认证的数字证书,证书里面包含了服务器的 public key(注意:服务器的 public 可以,不是 CA 的 public key)客户端 拿到数字证书,用自己浏览器内置的 CA 证书(包含CA公钥)解密得到服务器的 public key客户端 用服务器的 public key 加密一个用于接下来的对称加密算法的密钥,传给 web 服务器(因为只有服务器有private key可以解密,所以不用担心中间人拦截这个加密的密钥)服务器拿到这个加密的密钥,解密获取密钥,再使用对称加密算法,和用户完成接下来的网络通信。