扫盲 HTTPS 和 SSL/TLS 协议[3]:密钥交换(密钥协商)算法及其原理hjJ免费翻墙网
文章目录hjJ免费翻墙网
★密钥交换/协商机制要达到啥目的?hjJ免费翻墙网
★密钥交换/协商机制的几种类型hjJ免费翻墙网
★基于 RSA 的密钥协商hjJ免费翻墙网
★基于 DH 的密钥协商hjJ免费翻墙网
★DH 的变种hjJ免费翻墙网
★基于 PSK 的密钥协商hjJ免费翻墙网
★基于 SRP 的密钥协商hjJ免费翻墙网
★各种组合的一览表hjJ免费翻墙网
先插播一个好消息:hjJ免费翻墙网
本月初俺发了一篇《老流氓CNNIC 的接班人——聊聊“沃通/WoSign”的那些破事儿》。前2天看到新闻说,Mozilla 组织(Firefox)已经把沃通的根证书加入黑名单了,为期一年。一年之后看它的表现再决定是否永久性屏蔽。hjJ免费翻墙网
对这种流氓公司,就应该给它点颜色看看(老实说,俺还觉得处罚偏轻了)hjJ免费翻墙网
本系列的前一篇,咱们聊了“密钥交换的难点”以及“证书体系”的必要性。今天这篇来介绍一下实战中使用的“密钥协商算法”。hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★密钥交换/协商机制要达到啥目的?
hjJ免费翻墙网
前一篇介绍了 SSL/TLS 的身份认证机制。这个机制是为了防止攻击者通过【篡改】网络传输数据,来假冒身份,以达到“中间人攻击/MITM”的目的。hjJ免费翻墙网
而今天要聊的“密钥协商机制”是:(在身份认证的前提下)如何规避【偷窥】的风险。hjJ免费翻墙网
通俗地说,即使有攻击者在偷窥你与服务器的网络传输,客户端(client)依然可以利用“密钥协商机制”与服务器端(server)协商出一个用来加密应用层数据的密钥(也称“会话密钥”)。hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★密钥交换/协商机制的几种类型
hjJ免费翻墙网
俺总结了一下,大致有如下几种类型:hjJ免费翻墙网
◇依靠非对称加密算法
hjJ免费翻墙网
原理:hjJ免费翻墙网
拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。hjJ免费翻墙网
hjJ免费翻墙网
举例:hjJ免费翻墙网
RSAhjJ免费翻墙网
◇依靠专门的密钥交换算法
hjJ免费翻墙网
原理:hjJ免费翻墙网
这个原理比较复杂,一两句话说不清楚,待会儿聊到 DH 的那个章节会详谈。hjJ免费翻墙网
hjJ免费翻墙网
举例:hjJ免费翻墙网
DH 算法及其变种hjJ免费翻墙网
◇依靠通讯双方事先已经共享的“秘密”
hjJ免费翻墙网
原理:hjJ免费翻墙网
既然双方已经有共享的秘密(这个“秘密”可能已经是一个密钥,也可能只是某个密码/password),只需要根据某种生成算法,就可以让双方产生相同的密钥(并且密钥长度可以任意指定)hjJ免费翻墙网
hjJ免费翻墙网
举例:hjJ免费翻墙网
PSK 和 SRPhjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★基于 RSA 的密钥协商
hjJ免费翻墙网
◇概述
hjJ免费翻墙网
这大概是 SSL 最古老的密钥协商方式——早期的 SSLv2 只支持一种密钥协商机制,就是它。(前一篇)介绍身份认证重要性的时候,也是拿 RSA 来演示。hjJ免费翻墙网
RSA 是一种【非】对称加密算法。在本系列第1篇的背景知识介绍中,已经聊过这种算法的特点——加密和解密用使用【不同的】密钥。并且“非对称加密算法”既可以用来做“加密/解密”,还可以用来做“数字签名”。hjJ免费翻墙网
◇密钥协商的步骤
hjJ免费翻墙网
(下列步骤只阐述原理,具体的协议细节在下一篇讲)hjJ免费翻墙网
hjJ免费翻墙网
1. 客户端连上服务端hjJ免费翻墙网
2. 服务端发送 CA 证书给客户端hjJ免费翻墙网
3. 客户端验证该证书的可靠性hjJ免费翻墙网
4. 客户端从 CA 证书中取出公钥hjJ免费翻墙网
5. 客户端生成一个随机密钥 k,并用这个公钥加密得到 k'hjJ免费翻墙网
6. 客户端把 k' 发送给服务端hjJ免费翻墙网
7. 服务端收到 k' 后用自己的私钥解密得到 khjJ免费翻墙网
8. 此时双方都得到了密钥 k,协商完成。hjJ免费翻墙网
◇如何防范偷窥(嗅探)
hjJ免费翻墙网
攻击方式1hjJ免费翻墙网
攻击者虽然可以监视网络流量并拿到公钥,但是【无法】通过公钥推算出私钥(这点由 RSA 算法保证)hjJ免费翻墙网
hjJ免费翻墙网
攻击方式2hjJ免费翻墙网
攻击者虽然可以监视网络流量并拿到 k',但是攻击者没有私钥,【无法解密】 k',因此也就无法得到 khjJ免费翻墙网
◇如何防范篡改(假冒身份)
hjJ免费翻墙网
攻击方式1hjJ免费翻墙网
如果攻击者在第2步篡改数据,伪造了证书,那么客户端在第3步会发现(这点由证书体系保证)hjJ免费翻墙网
hjJ免费翻墙网
攻击方式2hjJ免费翻墙网
如果攻击者在第6步篡改数据,伪造了k',那么服务端收到假的k'之后,解密会失败(这点由 RSA 算法保证)。服务端就知道被攻击了。hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★基于 DH 的密钥协商
hjJ免费翻墙网
◇概述
hjJ免费翻墙网
DH 算法又称“Diffie–Hellman 算法”。这是两位数学牛人的名称,他们创立了这个算法。该算法用来实现【安全的】“密钥交换”。它可以做到——“通讯双方在完全没有对方任何预先信息的条 件下通过不安全信道创建起一个密钥”。这句话比较绕口,通俗地说,可以归结为两个优点:hjJ免费翻墙网
1. 通讯双方事先【不】需要有共享的秘密。hjJ免费翻墙网
2. 用该算法协商密码,即使协商过程中被别人全程偷窥(比如“网络嗅探”),偷窥者也【无法】知道协商得出的密钥是啥。hjJ免费翻墙网
hjJ免费翻墙网
但是 DH 算法本身也有缺点——它不支持认证。也就是说:它虽然可以对抗“偷窥”,却无法对抗“篡改”,自然也就无法对抗“中间人攻击/MITM”(在本系列的前一篇,俺已经强调过了——缺乏身份认证,【必定会】遭到“中间人攻击/MITM”)。hjJ免费翻墙网
为了避免遭遇 MITM 攻击,DH 需要与其它签名算法(比如 RSA、DSA、ECDSA)配合——靠签名算法帮忙来进行身份认证。当 DH 与 RSA 配合使用,称之为“DH-RSA”,与 DSA 配合则称为“DH-DSA”,以此类推hjJ免费翻墙网
反之,如果 DH 【没有】配合某种签名算法,则称为“DH-ANON”(ANON 是洋文“匿名”的简写)。此时会遭遇“中间人攻击/MITM”。(具体的中间人攻击手法,可以参见本系列前一篇)hjJ免费翻墙网
hjJ免费翻墙网
关于该算法的更多介绍,可以参见维基百科(这个条目)。hjJ免费翻墙网
◇数学原理
hjJ免费翻墙网
(如果你属于那种“看了数学公式就犯晕的人”,可以直接略过本小节,不影响你看后续的章节)hjJ免费翻墙网
hjJ免费翻墙网
从概念上讲:DH 依赖的是:求解“离散对数问题”的复杂性。具体的算法如下:hjJ免费翻墙网
通讯双方(张三、李四)需要先约定好算法参数(algorithm parameters):一个素数 p 作为模数,一个素数 g 作为基数(g 也称为“生成元”)。这两个算法参数是可以对外公开滴。hjJ免费翻墙网
对于张三而言,需要先想好一个秘密的自然数 a 作为私钥(不能公开),然后计算 A = ga mod p 作为自己的公钥(可以公开)。hjJ免费翻墙网
对李四而言也类似,先想好一个秘密的自然数 b 作为私钥(不能公开),然后计算 B = gb mod p 作为自己的公钥(可以公开)。hjJ免费翻墙网
张三和李四互相交换各自的公钥。hjJ免费翻墙网
然后张三计算出 k = Ba mod p,李四计算出 k = Ab mod phjJ免费翻墙网
hjJ免费翻墙网
该算法至少确保了如下几点:hjJ免费翻墙网
1. 张三和李四分别计算出来的 k 必定是一致的hjJ免费翻墙网
2. 张三和李四都无法根据已知的数来推算出对方的私钥(张三无法推算出 b,李四无法推算出 a)hjJ免费翻墙网
3. 对于一个旁观者(偷窥者),虽然能看到 p,g,A,B,但是无法推算出 a 和 b(就是说,旁观者无法推算出双方的私钥),自然也无法推算出 khjJ免费翻墙网
hjJ免费翻墙网
举例hjJ免费翻墙网
前面说得都是符号,比较抽象。下面拿具体数字举例:hjJ免费翻墙网
假设约定的算法参数:模数是 97,基数是 3hjJ免费翻墙网
张三用的私钥是 6,李四用的私钥是 21,用 python 代码演示如下(python 语言用两个连续星号表示“幂运算”,用百分号表示“取模运算”):hjJ免费翻墙网
p = 97hjJ免费翻墙网
g = 3hjJ免费翻墙网
hjJ免费翻墙网
a = 6hjJ免费翻墙网
b = 21hjJ免费翻墙网
hjJ免费翻墙网
A = (g**a) % phjJ免费翻墙网
B = (g**b) % phjJ免费翻墙网
hjJ免费翻墙网
print((B**a) % p) # 47hjJ免费翻墙网
print((A**b) % p) # 47
最后打印出来的两个 47 就是双方都计算出了【相同的】结果(这个数值可以用作之后的“会话密钥”)hjJ免费翻墙网
hjJ免费翻墙网
上面因为是举例,用的数字都比较小。在实战中需要注意如下几点,以降低被攻击的风险。hjJ免费翻墙网
1. p 必须是质数且足够大(至少300位)hjJ免费翻墙网
2. a,b 也要足够大(至少100位),且必须是随机生成。hjJ免费翻墙网
3. g 必须是质数,【不】需要很大,比如 2 或 3 或 5 都可以。g 如果太大并【不能】显著提升安全性,反而会影响性能。 hjJ免费翻墙网
◇密钥协商的步骤
hjJ免费翻墙网
(下列步骤只阐述原理,具体的协议细节在下一篇讲)hjJ免费翻墙网
hjJ免费翻墙网
1. 客户端先连上服务端hjJ免费翻墙网
2. 服务端生成一个随机数 s 作为自己的私钥,然后根据算法参数计算出公钥 S(算法参数通常是固定的)hjJ免费翻墙网
3. 服务端使用某种签名算法把“算法参数(模数p,基数g)和服务端公钥S”作为一个整体进行签名hjJ免费翻墙网
4. 服务端把“算法参数(模数p,基数g)、服务端公钥S、签名”发送给客户端hjJ免费翻墙网
5. 客户端收到后验证签名是否有效hjJ免费翻墙网
6. 客户端生成一个随机数 c 作为自己的私钥,然后根据算法参数计算出公钥 ChjJ免费翻墙网
7. 客户端把 C 发送给服务端hjJ免费翻墙网
8. 客户端和服务端(根据上述 DH 算法)各自计算出 k 作为会话密钥hjJ免费翻墙网
◇如何防范偷窥(嗅探)
hjJ免费翻墙网
嗅探者可以通过监视网络传输,得到算法参数(模数p,基数g)以及双方的公钥,但是【无法】推算出双方的私钥,也【无法】推算出会话密钥(这是由 DH 算法在数学上保证的)hjJ免费翻墙网
◇如何防范篡改(假冒身份)
hjJ免费翻墙网
攻击方式1hjJ免费翻墙网
攻击者可以第4步篡改数据(修改算法参数或服务端公钥)。但因为这些信息已经进行过数字签名。篡改之后会被客户端发现。hjJ免费翻墙网
hjJ免费翻墙网
攻击方式2hjJ免费翻墙网
攻击者可以在第7步篡改客户端公钥。这步没有签名,服务端收到数据后不会发现被篡改。但是,攻击者篡改之后会导致“服务端与客户端生成的会话密钥【不一致】”。在后续的通讯步骤中会发现这点,并导致通讯终止。hjJ免费翻墙网
(下一篇讲具体协议的时候会提到:协议初始化/握手阶段的末尾,双方都会向对方发送一段“验证性的密文”,这段密文用各自的会话密钥进行【对称】加密,如果双方的会话密钥不一致,这一步就会失败,进而导致握手失败,连接终止)hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★DH 的变种
hjJ免费翻墙网
◇基于“椭圆曲线”的 ECDH
hjJ免费翻墙网
DH 算法有一个变种,称之为 ECDH(全称是“Elliptic Curve Diffie-Hellman”)。维基条目在“这里”hjJ免费翻墙网
它与 DH 类似,差别在于:hjJ免费翻墙网
DH 依赖的是——求解“离散对数问题”的困难。hjJ免费翻墙网
ECDH 依赖的是——求解“椭圆曲线离散对数问题”的困难。hjJ免费翻墙网
hjJ免费翻墙网
ECDH 的数学原理比 DH 更复杂。考虑到本文读者大都【不是】数学系出身,俺就不展开了。hjJ免费翻墙网
ECDH 跟 DH 一样,也是【无认证】的。同样需要跟其它签名算法(比如 RSA、DSA、ECDSA)配合。hjJ免费翻墙网
◇对 DH 和 ECDH 进行“临时密钥”的改良——DHE 和 ECDHE
hjJ免费翻墙网
刚才介绍的 DH 和 ECDH,其密钥是持久的(静态的)。也就是说,通讯双方生成各自的密钥之后,就长时间用下去。这么干当然比较省事儿(节约性能),但是存在某种安全隐患——无法做到“前向保密”(洋文是“forward secrecy”)。hjJ免费翻墙网
为了做到“前向保密”,采用“临时密钥”(洋文是“ephemeral key”)的方式对 DH 和 ECDH 进行改良。于是得到两种新的算法——DHE 和 ECDHE。(这两种新算法的名称,就是在原有名称后面加上字母 E 表示 ephemeral)。其实算法还是一样的,只是对每个会话都要重新协商一次密钥,且密钥用完就丢弃。hjJ免费翻墙网
(估计很多同学不太了解“前向保密”这个概念。俺会在本系列中单独开一帖,介绍“前向保密”的概念及其好处)hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★基于 PSK 的密钥协商
hjJ免费翻墙网
◇概述
hjJ免费翻墙网
PSK 是洋文“Pre-Shared Key”的缩写。顾名思义,就是【预先】让通讯双方共享一些密钥(通常是【对称加密】的密钥)。所谓的【预先】,就是说,这些密钥在 TLS 连接尚未建立之前,就已经部署在通讯双方的系统内了。hjJ免费翻墙网
这种算法用的不多,它的好处是:hjJ免费翻墙网
1. 不需要依赖公钥体系,不需要部属 CA 证书。hjJ免费翻墙网
2. 不需要涉及非对称加密,TLS 协议握手(初始化)时的性能好于前述的 RSA 和 DH。hjJ免费翻墙网
更多介绍可以参见维基百科,链接在“这里”。hjJ免费翻墙网
◇密钥协商的步骤
hjJ免费翻墙网
(由于 PSK 用的不多,下面只简单介绍一下步骤,让大伙儿明白其原理)hjJ免费翻墙网
hjJ免费翻墙网
在通讯【之前】,通讯双方已经预先部署了若干个共享的密钥。hjJ免费翻墙网
为了标识多个密钥,给每一个密钥定义一个唯一的 IDhjJ免费翻墙网
协商的过程很简单:客户端把自己选好的密钥的 ID 告诉服务端。hjJ免费翻墙网
如果服务端在自己的密钥池子中找到这个 ID,就用对应的密钥与客户端通讯;否则就报错并中断连接。hjJ免费翻墙网
◇如何防范偷窥(嗅探)
hjJ免费翻墙网
使用这种算法,在协商密钥的过程中交换的是密钥的标识(ID)而【不是】密钥本身。hjJ免费翻墙网
就算攻击者监视了全过程,也无法知晓密钥啥。hjJ免费翻墙网
◇如何防范篡改(假冒身份)
hjJ免费翻墙网
PSK 可以单独使用,也可以搭配签名算法一起使用。hjJ免费翻墙网
对于单独使用hjJ免费翻墙网
如果攻击者篡改了协商过程中传送的密钥 ID,要么服务端发现 ID 无效(协商失败),要么服务端得到的 ID 与客户端不一致,在后续的通讯步骤中也会发现,并导致通讯终止。hjJ免费翻墙网
(下一篇讲具体协议的时候会提到:协议初始化/握手阶段的末尾,双方都会向对方发送一段“验证性的密文”,这段密文用各自的会话密钥进行【对称】加密,如果双方的会话密钥不一致,这一步就会失败,进而导致握手失败,连接终止)hjJ免费翻墙网
hjJ免费翻墙网
对于搭配签名算法hjJ免费翻墙网
如果攻击者篡改了协商过程中传送的密钥 ID,验证签名会失败hjJ免费翻墙网
◇补充说明
hjJ免费翻墙网
PSK 与 RSA 具有某种相似性——既可以用来搞“密钥协商”,也可以用来搞“身份认证”。hjJ免费翻墙网
所以,PSK 可以跟 DH(及其变种)进行组合。例如:DHE-PSK、ECDHE-PSKhjJ免费翻墙网
关于 PSK 的更多细节,可以参见 RFC4279hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★基于 SRP 的密钥协商
hjJ免费翻墙网
◇概述
hjJ免费翻墙网
SRP 是洋文“Secure Remote Password”的缩写。这个算法有点类似于刚才提到的 PSK——只不过 client/server 双方共享的是比较人性化的密码(password)而不是密钥(key)。该算法采用了一些机制(盐/salt、随机数)来防范“嗅探/sniffer” 或“字典猜解攻击”或“重放攻击”。hjJ免费翻墙网
这个算法应该用得很少——OpenSSL 直到2012年才开始支持该算法。所以俺这里就不展开了。有兴趣的同学可以去看 RFC2945 的协议描述。hjJ免费翻墙网
◇密钥协商的步骤
hjJ免费翻墙网
(由于 SRP 用的不多,俺偷懒一下,略去此小节)hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
hjJ免费翻墙网
★各种组合的一览表
hjJ免费翻墙网
算法组合 |
密钥交换 |
身份认证 |
是否会遭遇hjJ免费翻墙网
中间人攻击 |
是否具备hjJ免费翻墙网
前向保密 |
SSL 2.0 |
SSL 3.0 |
TLS 1.0 |
TLS 1.1 |
TLS 1.2 |
TLS 1.3hjJ免费翻墙网
(草案) |
RSA |
RSA |
RSA |
否 |
否 |
是 |
是 |
是 |
是 |
是 |
否 |
DH-RSA |
DH |
RSA |
否 |
否 |
否 |
是 |
是 |
是 |
是 |
否 |
DH-DSA |
DH |
DSA |
否 |
否 |
否 |
是 |
是 |
是 |
是 |
否 |
DHE-RSA |
DHE |
RSA |
否 |
是 |
否 |
是 |
是 |
是 |
是 |
是 |
DHE-DSA |
DHE |
DSA |
否 |
是 |
否 |
是 |
是 |
是 |
是 |
是 |
ECDH-RSA |
ECDH |
RSA |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
否 |
ECDH-ECDSA |
ECDH |
ECDSA |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
否 |
ECDHE-RSA |
DHE |
RSA |
否 |
是 |
否 |
否 |
是 |
是 |
是 |
是 |
ECDHE-ECDSA |
DHE |
ECDSA |
否 |
是 |
否 |
否 |
是 |
是 |
是 |
是 |
PSK |
PSK |
PSK |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
? |
PSK-RSA |
PSK |
RSA |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
? |
DHE-PSK |
DHE |
PSK |
否 |
是 |
否 |
否 |
是 |
是 |
是 |
? |
ECDHE-PSK |
DHE |
PSK |
否 |
是 |
否 |
否 |
是 |
是 |
是 |
? |
SRP |
SRP |
SRP |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
? |
SRP-RSA |
SRP |
RSA |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
? |
SRP-DSA |
SRP |
DSA |
否 |
否 |
否 |
否 |
是 |
是 |
是 |
? |
DH-ANON |
DH |
无 |
是 |
否 |
否 |
是 |
是 |
是 |
是 |
否 |
ECDH-ANON |
ECDH |
无 |
是 |
否 |
否 |
否 |
是 |
是 |
是 |
否 |
hjJ免费翻墙网
(截至本文发布时,TLS 1.3 还处于“草案”阶段,尚未正式发布。等到它正式发布,俺会把上述表格的最后一列再补充一下)hjJ免费翻墙网
来自https://program-think.blogspot.com/2016/09/https-ssl-tls-3.htmlhjJ免费翻墙网
|