传输层安全

传输层安全

定义

传输层安全(TLS) 就是在HTTP和TCP之间TLS 就是在 HTTP 和 TCP 中间加一层保护层。原先的流程是这样:

HTTP → TCP → IP → 网络

但是这样明文会直接传输。HTTP 本身是明文的。也就是说,如果你登录网站,发送:

复制代码
username=abc&password=123456

中间有人抓包,可能直接看到。

加上TLS后:

HTTP → TLS → TCP → IP → 网络

所以 HTTPS 其实就是:HTTP + TLS = HTTPS

TLS 主要做三件事:

第一,加密

别人抓包也只能看到乱码,看不到你发的密码、cookie、网页内容。

第二,认证服务器身份

浏览器会检查证书,确认你连到的确实是 unsw.edu.au,不是攻击者假冒的网站。

第三,防篡改

中间人不能偷偷把服务器返回的内容改掉。比如把pay 10 -\> pay 1000 TLS 会检测出来。

TLS提供了:Confidentiality :机密性 Integrity :完整性 Authentication:认证

简易版TLS

设计逻辑

  1. 握手 Handshake

    双方互相验证身份(靠证书),然后协商出一个共享秘密(比如 DH 交换)。这一步结束后,只有通信双方知道这个密钥,窃听者不知道。

    • Alice 发 Hello 给 Bob。

    • Bob 发 Public Key Certificate 给 Alice,证书里面核心有两样东西:

      Bob 的身份信息

      Bob 的公钥 K_B^

    • Alice 生成一个 Ms,也就是 Master Secret。然后 Alice 用 Bob 的公钥加密它:

      K_B^+(Ms) = Ems。Alice 把 Ems 发给 Bob。Bob 收到以后,用自己的私钥解密

    所以这一步结束后,结果是:

    复制代码
    Alice 知道 Ms
    Bob 也知道 Ms
    中间人不知道 Ms

    这就是"协商/建立共享秘密"。

    所以这张图对应 ToySSL 的第一步:

    复制代码
    Handshake = 认证 Bob + 让 Alice 和 Bob 拥有同一个 Master Secret
  2. 密钥派生 Key Derivation

    共享密钥本身不直接拿来加密。你从它派生出多把密钥:一把加密用、一把算 MAC 用、甚至双向各一套。同一个密钥用在不同地方会削弱安全性------密钥分离原则。

    • Kc:客户端 → 服务器 的加密密钥
    • Mc:客户端 → 服务器 的 MAC 密钥
    • Ks:服务器 → 客户端 的加密密钥
    • Ms:服务器 → 客户端 的 MAC 密钥
  3. 数据传输 Data Transfer

    把HTTP需要传输的数据,切分成一条一条的record再独立加密,每条record加上MAC再发送

    所以一条 record 发出去长这样:

    明文数据 → 加上MAC → 整体加密 → 发送

    这样的好处是,可以来一条record就检验一条,不用等到整个会话结束后,才发现信息被篡改

  4. 安全关闭连接 Connection closure

    需要一个加密的"我说完了"信号,双方确认才算真正结束。

replay attack

攻击者可以截取到多条 record,然后不停的重复发送,或者调换record顺序发送

解决方法

sequence number 放进 HMAC 计算中,即HMAC = MAC(Mx, sequence || data)

这样即使数据内容一样,只要序号不对,校验就过不了。

truncation attack

攻击者伪造一个 TCP 关闭连接的信号,导致一方误以为"数据传完了",但其实后面还有内容。

于是接收方看到的是一个 被截断的会话

解决方法

给 record 加 type 。比如type 0 表示正常数据,type 1 表示正常数据。然后把 type 也放入 HMAC:HMAC = MAC(Mx, sequence || type || data)