diff --git a/2023/10/19/bulletproof-ssl-and-tls-01/index.html b/2023/10/19/bulletproof-ssl-and-tls-01/index.html index ce3733ea7..54799844b 100644 --- a/2023/10/19/bulletproof-ssl-and-tls-01/index.html +++ b/2023/10/19/bulletproof-ssl-and-tls-01/index.html @@ -28,7 +28,7 @@ - + @@ -219,12 +219,12 @@
安全领域变得越来越复杂,理解攻击和威胁往往就是其工作的一部分。在日常工作中,通常都是把 OpenSSL 库作为黑盒子使用,但是随着对 Nginx 开发维护的深入,当前在 SSL/TLS 的知识储备不足以支撑我更深入地排查问题,因此想通过系统阅读相关书籍来加深对 SSL/TLS 的理解。以上就是我阅读本书的初衷。
-所有连接到互联网的设备都有一个共同点,它们依赖安全套接字层(secure socket layer,SSL)和传输层安全(transport layer security,TLS)协议保护传输的信息。SSL 和 TLS 都是加密协议,旨在基于不安全的基础设施提供安全通信。这些协议保护着通信链路即传输层,这也是 TLS 名称的由来。
+所有连接到互联网的设备都有一个共同点,它们依赖安全套接字层(secure socket layer,SSL)和传输层安全(transport layer security,TLS)协议保护传输的信息。SSL 和 TLS 都是加密协议,旨在基于不安全的基础设施提供安全通信。这些协议保护着通信链路即传输层,这也是 TLS 名称的由来。
TLS 有以下四个主要目标:
互联网的核心建立在 TCP/IP 协议族之上,但是 TCP/IP 协议族的核心协议本身不提供任何安全保障,任何有权访问通信链路的人都可以获得所有数据,并且可以在不被察觉情况下改变这些数据。
@@ -246,7 +246,8 @@对称加密(symmetric encryption)又称私钥加密(private-key cryptography),是一种混淆算法,能够让数据在非安全信道上进行安全通信。根据 Auguste Kerckhoffs
原则:
1 | 即使攻击者知晓了整个密码系统除密钥以外的所有情报,系统仍然应当能保证安全。 |
所以我们可以认为密文的安全性完全取决于密钥。密码可以分为两类:
+优秀的加密算法需要产出表面上看起来完全随机的密文,这样攻击者就无法通过无法分析得出任何关于明文的信息。因此替换密码就不是一种好的算法,因为攻击者可以确定密文中各个字母的使用频率,并与英语中的字母使用频率进行对比。如果加密算法优秀,攻击者只有一种方法,那就是尝试所有可能的解码密钥,俗称穷举密钥搜索(exhaustive key search)。
+所以我们可以认为密文的安全性完全取决于密钥。通常我们通过密钥长度来衡量加密长度(前提是密钥本质上是随机的)。密码可以分为两类:
序列密码
分组密码
散列函数可以用于验证数据完整性,但仅在数据的散列与数据本身分开传输的条件下如此。否则攻击者可以同时修改数据和散列,从而轻易地避开检测。消息验证代码(message authentication code,MAC)或者使用密钥的散列(keyed-hash)是以身份验证扩展了散列函数的密码学函数。只有拥有散列密钥,才能生成合法的 MAC。
+散列函数最常用的使用场合是以紧凑的方式表示并比较大量数据。散列函数经常被称为指纹、消息摘要,或者简单称为摘要。现在使用最为广泛的散列函数是 SHA1,它的输出是 256,由于 SHA1 已经变弱,建议升级为 SHA256 变种。
+散列函数可以用于验证数据完整性,但仅在数据的散列与数据本身分开传输的条件下如此。否则攻击者可以同时修改数据和散列,从而轻易地避开检测。消息验证代码(message authentication code,MAC)或者使用密钥的散列(keyed-hash)是以身份验证扩展了散列函数的密码学函数。只有拥有散列密钥,才能生成合法的 MAC。
MAC 通常与加密一起使用。如果没有 MAC,即使攻击者无法解密密文,他也能修改传输中的数据。加密提供了机密性但无法确保完整性。当 MAC 和密文一起发送时,Bob 就能确认消息并没有篡改。
任何散列函数都能用作 MAC 的基础,另一个基础是基于散列的消息验证代码(hash-based message authentication code,HMAC)。HMAC 本质就是将散列密钥和消息以一种安全的方式交织在一起。
-分组密码模式是为了加密任意长度的数据而设计的密码学方案,是对分组密码的扩展。
+上文说过,单纯的分组密码用处不大,我们需要使用 分组密码模式
来实现加密。分组密码模式是为了加密任意长度的数据而设计的密码学方案,是对分组密码的扩展。
电码本(electronic codebook,ECB):模式是最简单的分组密码模式。它只支持数据长度正好是块大小的整数倍的情况,如果数据长度不满足这个条件,就得事先实施填充。加密就是将数据 按块大小切分,再分别加密每一块。ECB 的简单就是它的劣势。因为分组密码是确定的(输入相同,输出也相同)。攻击者可以观察密文并且提交任意明文加密,如此尝试足够的次数,就能猜出明文
+电码本(electronic codebook,ECB):该模式是最简单的分组密码模式。它只支持数据长度正好是块大小的整数倍的情况,如果数据长度不满足这个条件,就得事先实施填充。加密就是将数据 按块大小切分,再分别加密每一块。ECB 的简单就是它的劣势。因为分组密码是确定的(输入相同,输出也相同)。攻击者可以观察密文并且提交任意明文加密,如此尝试足够的次数,就能猜出明文
加密块链接(cipher block chaining,CBC):模式是从 ECB 发展。为了解决 ECB 天生的确定性,CBC 引入了初始向量(initialization vector,IV)的概念。即使输入相同,IV 也可以使每次的输出都不相同:
+加密块链接(cipher block chaining,CBC):该模式是从 ECB 发展。为了解决 ECB 天生的确定性,CBC 引入了初始向量(initialization vector,IV)的概念。即使输入相同,IV 也可以使每次的输出都不相同:
CBC 仍然是 SSL 和 TLS 的主要模式。另外,GCM 是 TLS 中相对较新的模式,从 1.2 版本开始才能使用。它提供了机密性和完整性,是当前可用的最好模式。
对称加密在高速处理大量数据方面做得非常好,然而随着使用它的团体增加,产生了更多的需求,使得对称加密无法满足:
数字签名(digital signature)是一个密码学方案。它使得验证一条电子消息或者一篇电子文档的真实性成为可能。前面描述的 MAC 就是一种电子签名,它可以利用事先安全交换的散列密钥验证真实性。虽然这种校验非常有用,但仍有不足,因为它仍然依赖于一个私有密钥。
借助公钥密码,数字签名可以与现实生活中的手写签名类似。我们可以利用公钥密码的非称性设计出一种算法,使用私钥对消息进行签名,并使用对应的公钥验证它。实际的方式依照选择的公钥密码体系而有所不同。
-在密码学中,所有的安全性都依赖于生成随机数的质量。安全性构建于已知的算法和未知的密钥之上,而密钥最简单的形式就是非常长的随机数。随机数生成是不容易的,是因为计算机是十分善于预测的,它们会严格按照指令执行。
+在密码学中,所有的安全性都依赖于生成随机数的质量。安全性构建于已知的算法和未知的密钥之上,而密钥最简单的形式就是非常长的随机数。随机数生成是不容易的,是因为计算机是十分善于预测的,它们会严格按照指令执行。
在计算机中,真随机数生成器(true random number generator,TRNG)是很难的,实际使用中依靠的是伪随机数生成器(pseudorandom number generator,PRNG)。当然,PRNG 也要利用少量真正的随机数使系统运转起来。这个过程被称为 种子设定(seeding)
。利用种子,PRNG根据需要构造出无限数量的伪随机数。
普通用途的 PRNG 被常常用于编程,但它们并不适用于密码学,尽管其输出看起来就是随机的。加密安全伪随机数生成器(cryptographically secure pseudorandom number generator,CPRNG)是不可预测的 PRNG。这个性质对安全来说非常关键
-加密基元本身其实没什么用,诸如加密和散列算法。我们只有将这些元素组合成方案和协议,才能满足复杂的安全需求。一个协议大致要实现如下工作:
+加密基元本身其实没什么用,诸如加密和散列算法。我们只有将这些元素组合成方案和协议,才能满足复杂的安全需求,包括机密性、完整性和真实性。一个协议大致要实现如下工作:
加密使用的密钥
、完整性验证所需要的密钥
)加密使用的密钥
、完整性验证所需要的密钥
)从宏观角度来讲,这就是 SSL/TSL 所完成的工作。
复杂系统往往会受到多种方式的攻击,密码系统也不例外。人们一般都能很好地理解加密基元,因为它们相对直接,并且只完成一件工作。整体方案往往更容易遭受攻击,因为它们引入了额外的复杂性。此外,也存在针对协议实现(implementation)的攻击,即利用软件的 bug。所以,我们通常会说加密被绕过,而不是被攻击。这句话意味着使用的基元都很坚实,但软件体系不牢固。
我们使用攻破某个基元所需执行的操作数量衡量密码系统的强度,以安全位数来表示。实际使用的情况更复杂一些,因为并非所有操作的安全性都能同等度量。当我们讨论安全性时,提出诸如 针对谁的安全
和 多长时间的安全
这种问题会更有价值。
针对传输层安全性的攻击绝大多数来自中间人(man-in-the-middle,MITM)攻击。理论上,执行 MITM 攻击的最简单方法是加入网络,然后将受害者的通信重新路由到恶意节点。
-有一个问题需要额外注意,即是否支持 前向保密
(forward secrecy)。例如 TLS 中最常见的密钥交换算法是基于 RSA 算法的,在使用这种算法的系统中,密钥交换使用的 RSA密钥 也用于解密过去所有的会话。
如果攻击者只是监听双方的会话,我们称之为被动网络攻击(passive network attack)。如果攻击者主动改变数据流或者影响双方会话,我们则称之为主动网络攻击(active network attack)。
+有一个问题需要额外注意,即是否支持 前向保密
(forward secrecy)。例如 TLS 中最常见的密钥交换算法是基于 RSA 算法的,在使用这种算法的系统中,密钥交换使用的 RSA密钥也用于解密过去所有的会话。所以 RSA 算法是不支持 前向保密
的。