HTTPS 加密原理
为什么需要加密?
因为 HTTP 的内容是明文传输的,明文数据会经过代理服务器、路由器等多个物理节点,数据被人窃取的风险大。如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者甚至可以篡改传输的信息且不被双方察觉,也就是中间人攻击。所以需要对信息进行加密。
HTTPS 是如何加密的?
HTTPS 在 HTTP 和 TCP 之间引入了 TLS 层,双方仍然通过 TCP 进行传输,但 TCP 数据不是直接交付给 HTTP 应用层,而是先交付给 TLS 层,在 TLS 握手过程中会交换密钥、校验证书等。TLS 握手完成之后,所有数据都是加密传输的了,中间即便被截获也无法得到明文数据。
文章中图片均引用:彻底搞懂 HTTPS 的加密原理
背景知识
对称加密
对称加密只有一个密钥,用这个密钥对数据加密,同时也用该密钥对数据解密。
非对称加密
非对称加密有两个密钥,一个叫公钥、另一个叫私钥。一般而言,公钥是全世界公开的,私钥是自己保存的。
这时可以用一个密钥加密,另一个密钥解密。给对方发消息时,通常用对方的公钥加密,此时只有对方能用自己的私钥解密获取到数据。
数据篡改检验
发送方在发送数据时,用自己的私钥对数据加密,形成一份数字签名和数据一起发送。接收方在收到的时候,用发送方的公钥对数字签名进行解密,然后与数据对比。如果解密后的数据与发送过来的明文数据不同,则说明数据被人篡改了。
上述方式还有一个问题,原始数据加密后形成的数据可能很大,传输浪费时间。因此可以先对数据做哈希运算,对哈希运算的结果用私钥加密,接收方收到后用公钥解密,比较哈希值即可。
加密方式选择
- 对称式加密
- 绝对不可能,因为只有一把密钥,需要给对方发送密钥,但发送时又需要加密
- 若不加密,密钥就泄漏了
- 若加密,对方又无法解密获得密钥
- 非对称加密
- 公钥直接发给对方,不进行加密
- 发送数据时,用对方的公钥加密,此时只有对方能解密
- 但这种加密方式比较耗费时间
- 对称与非对称相结合
- 密钥协商阶段
- 网站将自己的公钥 A 明文发送给浏览器
- 浏览器随机生成一个用于对称加密的密钥 X,用网站公钥 A 加密后,生成密钥 X’ 明文发送给网站
- 此时网站用自己的私钥 A’ 解密得到同一个密钥 X
- 通信阶段
- 浏览器和网站进行数据加密时都用随机生成的密钥 X
- 此时既保证了安全又提高了效率
- 密钥协商阶段
中间人攻击
- 在上述描述的过程中,有个中间人,在网站发送自己公钥 A 浏览器的时候劫持了数据,用自己的公钥 B 替换了网站的公钥 A
- 此时浏览器生成了一个只能有中间人解密的密钥 S,中间人用自己的私钥 B’ 解密后得到密钥 S 后,再把密钥 S 发给网站
- 这时浏览器和网站进行看似正常的通信,熟不知有中间人已经窃取了数据,甚至对数据进行了篡改
上述问题的关键是:浏览器无法确定收到的公钥是网站给自己发送的。
数字证书
由此诞生了互联网世界的公理 CA 机构,他来证明各个网站合法的身份。
网站在使用 HTTPS 前,需要向 CA 机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。
数字证书的制作过程
- CA 机构拥有非对称加密的私钥 Q’ 和公钥 Q
- CA 机构对证书明文数据 T 进行 hash
- 明文信息 T 中包含网站域名、公钥和一些基本信息
- 对 hash 后的值用私钥 Q’ 加密,得到数字签名 S
明文信息 T 和数字签名 S 共同组成了数字证书,这样一份数字证书就可以颁发给网站了。
浏览器验证过程
- 拿到网站发来的证书
- 证书内有网站的明文信息 T 和加密后的数字签名 S
- 用 CA 机构的公钥 Q 对 S 解密,得到 S’(即为明文信息 hash 后的值)
- 由于 CA 机构是浏览器信任的机构,所以浏览器有它的公钥(下文会进行说明)
- 用证书里指明的 hash 算法对明文信息 T 进行 hash 得到 T’
- 显然通过以上步骤,T’ 应当等于 S‘,否则明文信息 T 或数字签名 S 已经被篡改了
中间人有可能篡改该证书吗?
假设中间人篡改了证书的原文,由于他没有 CA 机构的私钥,所以无法得到此时加密后签名,无法相应地篡改签名。若用自己的私钥加密,当浏览器用 CA 的公钥解密失败时,证明证书已经被篡改了。
若仅修改证书明文 T,没修改加密后的数字签名 S,浏览器收到该证书后会发现证书原文 T 经过 hash 后和签名解密后的值不一致,则说明证书已篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人。
中间人有可能把证书掉包吗?
假设有另一个网站 B 也拿到了 CA 机构认证的证书,它想劫持网站 A 的信息。于是它成为中间人拦截到了 A 传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到 B 的证书里的公钥了。
其实这并不会发生,因为证书里包含了网站 A 的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉了。
中间人可能篡改网站发送的数据吗?
由上文可知,中间人无法篡改数字证书的任何东西,那么他可以只篡改网站发送的数据吗?
通过开始部分的知识,我们知道,在发送数据时,可以用自己的私钥对发送的明文数据生成一份加密的数字签名。同理浏览器在收到网站发来的数据时,用网站的公钥对发来的数据的数字签名解密,用解密后的数据和明文数据进行对比,就可以知道数据是否被篡改了。
怎么证明 CA 机构的公钥是可信的?
CA 机构也可以用数字证书来证明身份,一些知名的网站的证书是在 OS 和浏览器中内置的。而且实际上证书之间的认证也可以不止一层,可以 A 信任 B,B 信任 C,以此类推,我们把它叫做信任链或数字证书链。也就是一连串的数字证书,由根证书为起点,透过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。