What is TLS
TLS全称T ransport L ayer S ecurity,传输层安全协议),前身是SSL(S ecure S ockets L ayer,安全套接层)。TLS位于OSI 7层模型的第5层:会话层
TLS的目的是提供为互联网通信提供安全及数据完整性保障。
为什么需要TLS
信息安全原则
信息安全的最基本的原则是 CIA 三个原则:
- C onfidentiality [kɑnfədɛnʃiˈælədi], 保密性。就是 “不能看”。
- I ntegrity [ɪn’teɡrətɪ] 完整性。就是 “不能改”。
- A vailability [ə,velə’bɪləti]。可用性,就是 “不能挂”。
TLS为信息安全带来的什么
- 所有信息都是加密传播,第三方无法窃听。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
TLS是为了解决什么问题而产生的
ref: 密码学入门科普(加密、签名、证书、HMAC、CA、PKI)
角色
- Alice:话唠,严重的倾诉欲,和 Bob 是 CP。
- Bob:沉默男,理工男,和 Alice 是 CP。
- Eve:Alice 的室友,热衷于偷听八卦。
- Mallory:猥琐男,专业搞破坏 20 年。
- Trent:长者,相当具有权威性,大家都相信他。
没有任何安全措施

没有加密,全程裸奔。
引入加密(保证不能看)
对称加密

- Alice和Bob事先商量好key。
- Alice用key对msg进行加密,生成MSG`。
- Bob用key对MSG进行解密,生成msg。
常见的对称加密算法:
优:
- 比之前裸奔安全,只要key不泄露,Eve没办法知道内容。也没法篡改内容
劣:
- 需要用某种方式事先商量好key。无法轻易更改。
- 万一key泄露,对Eve而言,他们还是在裸奔。

非对称加密
公开密钥密码学(英语:Public-key cryptography,也称非对称式密码学)是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。虽然两个密钥在数学上相关,但如果知道了其中一个,并不能凭此计算出另外一个。

- Bob首先生成一对公钥pub和私钥pri。pri由自己保管,pub公开给外界。
- Alice用pub加密msg -> MSG。
- Bob用pri解密MSG -> msg。
常见的非对称加密算法:
优:
- 与对称加密相比,不再需要提前协定密钥。
- 不需要担心密钥泄露,公钥可以对外公开
劣:
- 与对称加密相比,非对称加密的计算相当复杂、性能欠佳。
因为非对称加密性能不佳,所以一般是用非对称加密协定一个对称密钥。再用对称密钥通信。
如何证明"你是你"(保证不能改)
消息认证码(Message Authentication Code)
消息认证码这个名字可能有点陌生,但其实类似我们平时说的某种 “签名” 。它的作用是 保证通信内容不被篡改 。即 “我说1就是1,你不能抵赖说我说了2”

- Alice和Bob提前约定一个key
- Alice用key对msg进行计算,计算出MAC1
- Alice将msg和MAC1同时发给Bob
- Bob用key对msg进行计算,计算出MAC2
- 比较MAC1 == MAC2
上述的计算就由散列算法完成。
但是消息认证码有一个很重要的前提:要提前协商key。
常见的散列算法:
- SHA-2,包含了SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256
MD5,SHA-0,SHA-1已无法有效防止碰撞。为了防止碰撞,不再建议使用
散列不是一种加密
散列函数是 单射函数,故不存在"逆向流程"。无法通过函数的输出来计算或推导出输入。
将散列结果破解这一说是不存在的。只有通过不同的输入散列成相同的输出的"碰撞"一说。
消息认证码的作用主要有两个:
- 防止数据篡改

- 校验身份

数字签名
数字签名可以解决消息认证码需要提前协商key这个痛点。

- Alice首先生成一对公钥pub和私钥pri。pri由自己保管,pub公开给外界。
- Alice用pri加密msg,生成SIGN1,将msg + SIGN1同时发送给Bob
- Bob用pub解密msg,生成SIGN2
- 比较SIGN1 == SIGN2
数字签名除了防止篡改,还可以:
- 身份校验

- 抗否认

所以数字签名跟现实生活中的签名作用一样。可以做到保证你就是你,说过的话也没法抵赖。
数字证书
数字签名有一个破绽,就是伪造公钥。

- Bob生成pub,发送给Alice。
- Eve在中途截获了Bob的pub(假设Bob的数据包全部被Eve丢掉了)。然后Eve生成pub`并发送给Alice,同时声称自己是Bob。
- Alice收到pub`后,认为是pub`是Bob的公钥。
中间人攻击 (Man-In-The-Middle attack)
Eve伪造公钥后可以窃听Alice与Bob的通信,且Alice和Bob都不会发现被窃听。

- Alice用pub`加密msg -> MSG,发送给Bob
- Bob即使收到了MSG,也无法通过pri解密出msg
- 但Eve可以用pri`解密出msg。
中间人攻击不仅可以窃听信息,更可以冒充身份。


Mallory通过中间人攻击冒充Alice身份与Bob通信。且Alice无法再与Bob正常通信。
数字证书认证机构
数字证书认证机构(英语:Certificate Authority,缩写为CA),也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA,其实就是一个权威的第三方。
CA有点类似我们的警察局。 警察局颁发的身份证可以用来证明我们的身份。 CA颁发的数字证书也可以用来证明我们的身份。

- Bob将自己的公钥pub发给Trent,请求Trent为Bob生成数字证书。
- Trent用自己的私钥pri`对Bob的公钥pub进行计算,生成sign。将certificate = pub + sign发给Bob。
- Bob将certificate发给Alice
- Alice用Trent的公钥pub`对sign进行验签
现实中的TLS协议
TLS协议是建立在非对称密码学的基础上的。 但是非对称密码学有两个很大的缺陷:
- 会被伪造公钥(受到中间人攻击)
- 在数据量大的情况下,加解密运算时间会非常长
所以TLS要解决上述两个问题
- 引入CA和数字证书,防止伪造公钥,依赖PKI(Public Key Infrastructure, 公开密钥基础设施)
- 每个session,客户端和服务器端都生成一个对称密钥session key。用session key来加解密信息。由于session key是对称加密,所以运算速度非常快。而服务器公钥只用于加密session key。
TLS协议的大致流程
- client向server索要数字证书并验证
- client与server协商生成session key
- client与server用session key通信
上述流程中重点的重点是前两步,就是TLS的"握手"阶段。
TLS的"握手阶段"
以下主要以RSA握手过程为例。粗略介绍DH(Diffie-Hellman)握手过程。
RSA握手

关于TSL握手需要"几步",不做争论。但请注意,TSL握手过程全程都是明文传输的
RSA交换密钥依赖:对极大整数做因数分解的难度
个人理解,主要分成以下几步
clientHello
- client生成随机数RNc
- 将支持的TLS版本、支持的加密方法、支持的压缩方法、RNc发送给server
serverHello
- server收到clientHello请求
- server生成随机数RNs
- 将确定使用的TLS版本、确定使用的加密方法、确定使用的压缩方法、server的certificate、RNs发送给client
clientResponse
- 验证server certificate,同时获得server public key
- 产生一个随机数pre-master-key(PMK)
- 将PMK用server public key加密后的密文、client certificate、编码改变通知(表示随后的信息都将用双方商定的加密方法和密钥发送)和上述内容的hash值发送给server。表示client已结束握手阶段
- 通过RNc、RNs、PMK三个随机数,生成一个最终的随机数,即master-secret(MS、session key)
serverResponse
- server收到clientResponse后。用server private key解密出pre-master-key
- 编码改变通知(表示随后的信息都将用双方商定的加密方法和密钥发送)client。表示server已结束握手阶段
- 通过RNc、RNs、PMK三个随机数,生成一个最终的随机数,即master-secret(MS、session key)
至此,TSL握手就结束了。之后的所有通信都是都是用session key对信息进行加解密通信。
问一个问题,RSA握手过程会受到中间人攻击吗?
为什么需要三个随机数(RNc、RNs、pre-master-key)?
不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。 对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。 pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。

Diffie-Hellman(DF握手)
DF交换密钥是依赖:求解“离散对数问题”的复杂性。
DF可以做到通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建一个双方共享的私有密钥。
但要注意:单独使用DF无法认证对方身份,DF必须搭配其它能认证身份的方式(如RSA)共同使用,以保证完整的信息安全。

- client跟server建立连接,准备DF握手
- server选择基数g,模数p
- server生成随机数s,计算S=g^s mod p。将p,g,S发给client
- client生成随机数c,计算C=g^c mod p。将C发送server
- client计算k1=S^c mod p。server计算k2=C^s mod p。在数学上保证了k1=k2=k。
- client与server使用k进行加密通信。