https原理是什么?

前言

自己初中的时候有过一段时间很好奇密码学相关的问题,当时就了解到了非对称加密,觉得很神奇,只要被公钥加密,就只有私钥才能解开,当时想,加密过程不过就是按照规则进行一些数学计算而已,怎么会不可逆呢?非对称加密是怎么做到这些的?怎么让网络变成可信的?
当时百度还挺可靠的,搜索到了一篇讲的很好文章,大概有了认知,可惜那篇文章找不到了;今天正好看到一个前端问题:https 原理是什么?就再学习了一次,写这篇博客记录下来。

https 为什么出现?

因为网络链路默认是不可信任的,HTTP 在整个传输过程中无法保证数据不被窥探、篡改,常见的中间人攻击就是利用了这个原理,日常经常发现的网页出现莫名奇妙的新增广告,通常叫做运营商劫持,就是一种中间人攻击。

https 如何防止中间人攻击的?

https 在 TCP 传输层和 HTTP 应用层之间再加了一层 SSL/TSL(传输层安全协议),用于对 HTTP 报文进行加密。

SSL/TSL 采用基于公钥的加密算法,比如最常用的RSA 算法

RSA 是一种非对称加密算法,在了解非对称加密前,先了解一下对称加密,对称加密指的是在加密或者解密时使用相同的密钥。就像是为数据上一把锁,同时也要把钥匙拿给解密的人。
使用对称加密的过程往往是这样的:

  • A 生成随机密钥 K
  • A 与 B 通过某种方式
  • A 密钥 K 加密明文数据
  • A 传输密文数据
  • B 使用密钥 K 解密密文
  • 得到明文数据
    对称加密的一大问题就是存在密钥交换环节,想要解密必须传输密钥,而传输密钥这个环节,往往容易泄露密钥,整个加密环节也就不安全了。

非对称加密算法就解决了这个问题,密钥加密解密使用不同的密钥,避免了密钥交换环节,最著名的非对称加密算法就是 RSA 算法

RSA 算法是怎么工作的?

RSA 算法利用了数论方面的知识,详细的数学解释可以看阮一峰的博客,简单易懂(虽然自己只看了半懂 233)

整个过程简单概述,为

生成

  1. 随机选择两个不相等的质数pq
  2. 计算pq的乘积n
  3. 计算n的欧拉函数 φ(n),φ(n) = (p-1)(q-1)
  4. 随机选择一个整数e,条件是 1< e < φ(n),且 e 与 φ(n) 互质
  5. 计算e对于 φ(n)的模反元素d
  6. ne封装成公钥,nd封装成私钥。

加解密

  1. 假设需要加密的密文为 m,m 必须是整数,且m必须小于n
  2. 利用公钥(n,e)计算加密的密文c=m^e mod n
  3. 利用私钥(n,d)解密密文 m=c^d mod n

理论上公钥也可以当作公钥,也可以当作私钥,但实际上为了方便客户端进行加密和防止破解,公钥使用的 e 往往较小,私钥的更大。

对抗中间人攻击

只引入非对称加密算法实际上并不能阻止中间人攻击,非对称密钥加密依赖于公钥的正确性。
想想这样的场景:

  1. 小昂给小蕾想秘密的通过网路传输些暧昧信息
  2. 小昂生成一对公钥和私钥,将公钥传输给小蕾
  3. 小蕾收到公钥,并且将信息利用公钥进行加密
  4. 小昂收到信息

整个过程看样子很完美
但是这其中有一个很重大的缺陷,网络中一切数据都是可以被截获和伪造的,小蕾其实并不能确认公钥就是小昂发送的,公钥在传输中存在被掉包的可能

  1. 小昂生成一对公钥和私钥,将公钥传输给小蕾
  2. 小艾在中途截获了传输的公钥,并替换成了自己公钥
  3. 小蕾利用小艾的公钥加密了信息
  4. 小艾利用了自己的私钥解密了小蕾的信息
  5. 小艾篡改了信息,并使用小昂的公钥重新加密了修改后的信息
  6. 小昂收到了被篡改的信息。

这是个很大的问题!非对称加密并没有解决中间人攻击。

证书机制

证书机制利用了另一个特点,即被私钥加密的信息,可以被公钥解密,可以利用私钥对消息进行一次签名,证明自己就是私钥的拥有者。

证书机制是这样工作的

  1. 首先由受信任的机构(CA)生成一组公钥和私钥
  2. 软件商(浏览器、操作系统)会将这个公钥内置在自己软件中,并信任这个公钥。
  3. 小昂为了自己的通信安全,证明自己就是公钥的拥有者,决定使用数字证书。
  4. CA 收到小昂的申请,确认了小昂的身份。
  5. CA 先生成了这个证书的基本信息
    • 使用者: 小昂
    • 公钥:xxxxx
    • 有效期限:xxxxx
    • 公钥算法:RSA
    • 证书版本:xxxx
  6. CA 利用 hash 算法计算上列信息的 hash 值,并用自己的私钥进行加密,并和上面的信息组合,成为最终的数字证书。
    这时小昂就得到了自己的数字证书,可以证明自己时公钥的拥有者了。

小昂与小蕾接下来的通信就是这样的

  1. 小蕾向小昂发送请求
  2. 小昂出示自己的数字证书
  3. 小蕾对得到的证书进行验证,使用 CA 的公钥解密被加密的数字证书 hash,计算数字证书 hash 值,以保证证书未被篡改
  4. 小类使用数字证书的公钥和算法进行加密密文

使用对称密钥

在使用非对称密钥中,由于公钥是公开的,被私钥加密的内容实际可以被认为等同于明文,小蕾向小昂发送信息,只有小昂能够解密,但是任何持有公钥的人都能解密小昂使用私钥加密的内容。
并且非对称加密相比对称加密,运算复杂度要高一个数量级,如果要传输大量信息,性能消耗会很大,在这种情况下,引入对称密钥就是很有必要的了。

  • 在上文的前提下,小蕾随机生成一个密钥,并将这个密钥使用公钥加密,发送给小昂
  • 小昂使用私钥解密这个私钥,并在接下来的过程中,转用这个对称加密密钥进行通信

在这个过程中往往为了前向安全性,使用的是DH 密钥交换算法协商密钥,不依赖于 RSA 算法

增强安全性

  • 为了防止重放攻击,SSL/TLS 还会在密文中附带时间戳
  • 为了保证内容完整性,SSL/TLS 会计算内容的 hash 值并一同加密发送
  • 为了防止从 https 降级成 http,https 拥有 HSTS(HTTP Strict Transport Security),会强制客户端使用 https