传输层安全
定义
传输层安全(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
设计逻辑
-
握手 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 -
-
密钥派生 Key Derivation
共享密钥本身不直接拿来加密。你从它派生出多把密钥:一把加密用、一把算 MAC 用、甚至双向各一套。同一个密钥用在不同地方会削弱安全性------密钥分离原则。
Kc:客户端 → 服务器 的加密密钥Mc:客户端 → 服务器 的 MAC 密钥Ks:服务器 → 客户端 的加密密钥Ms:服务器 → 客户端 的 MAC 密钥
-
数据传输 Data Transfer
把HTTP需要传输的数据,切分成一条一条的record再独立加密,每条record加上MAC再发送
所以一条 record 发出去长这样:
明文数据 → 加上MAC → 整体加密 → 发送
这样的好处是,可以来一条record就检验一条,不用等到整个会话结束后,才发现信息被篡改
-
安全关闭连接 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)
