在前一节课中,我们讨论了密码学的基础:对称加密、非对称加密、哈希函数、MAC、数字签名。但这些密码学原语本身并不能直接提供安全通信。它们需要被组合成协议(Protocol)来实现实际的安全目标。
安全协议定义了参与方之间如何交换消息来实现安全目标,如身份认证、密钥交换、安全通信等。设计一个安全协议比使用密码学原语更复杂,因为协议涉及多个步骤、多个参与方、以及各种攻击场景。

协议设计是安全领域中最困难的任务之一。即使所有密码学原语都是安全的,协议设计错误也可能导致严重的安全漏洞。理解协议设计的原则和常见陷阱,是安全工程师的重要技能。
这一部分我们将讨论认证协议、密钥交换协议、以及协议设计中的常见漏洞,如重放攻击、中间人攻击等。我们还将分析实际协议,如TLS、SSH、Kerberos,理解它们的设计原理和安全特性。
认证协议允许一方(证明者,Prover)向另一方(验证者,Verifier)证明自己的身份。最简单的认证协议是密码认证:证明者发送密码,验证者检查密码是否正确。但这种协议存在许多问题:密码可能被窃听,密码可能被重放,密码可能被暴力破解。
挑战-响应(Challenge-Response)认证协议解决了密码传输的问题。验证者发送一个随机挑战(Challenge),证明者使用密钥计算响应(Response),验证者验证响应是否正确。
这种协议的优势是密码(密钥)不通过网络传输,只传输挑战和响应。即使攻击者截获了挑战和响应,他们也无法推导出密钥(假设哈希函数是单向的)。
但挑战-响应协议仍然可能受到重放攻击。如果攻击者截获了挑战和响应,他们可能稍后重放响应来通过认证。这需要时间戳或随机数来防止重放攻击。
零知识证明(Zero-Knowledge Proof)允许证明者向验证者证明自己知道某个秘密,而不泄露秘密本身。这是认证协议的高级形式,在某些场景中特别有用。
零知识证明的基本思想是:证明者通过回答验证者的多个挑战来证明自己知道秘密,但每个单独的挑战-响应对不泄露秘密信息。只有通过所有挑战,验证者才能确信证明者知道秘密。
零知识证明在密码学中有重要应用,如身份认证、匿名凭证、区块链等。理解零知识证明的原理有助于理解现代安全协议的设计。
密钥交换协议允许双方在不安全的信道上建立共享密钥。这个共享密钥可以用于后续的对称加密通信。密钥交换是安全通信的基础,因为对称加密需要共享密钥,而非对称加密速度较慢,不适合加密大量数据。

Diffie-Hellman密钥交换是最著名的密钥交换协议。它允许双方在不安全的信道上建立共享密钥,而不需要预先共享密钥。
Diffie-Hellman协议基于离散对数难题。双方选择一个大素数 和一个原根 (这些可以是公开的)。然后:
双方现在拥有相同的共享密钥 ,即使攻击者截获了 和 ,也无法计算 (假设离散对数难题是困难的)。
Diffie-Hellman协议容易受到中间人攻击。如果攻击者可以拦截和修改通信,他们可以在Alice和Bob之间分别建立密钥,然后转发消息。这需要身份认证来防止。
椭圆曲线Diffie-Hellman(ECDH)是Diffie-Hellman的椭圆曲线版本。它提供相同的安全性,但使用更短的密钥,计算效率更高。ECDH是现代协议(如TLS)中常用的密钥交换方法。
单纯的密钥交换协议(如Diffie-Hellman)不提供身份认证,容易受到中间人攻击。要防止中间人攻击,需要结合身份认证。
重放攻击(Replay Attack)是协议设计中的常见漏洞。攻击者截获合法的协议消息,稍后重放这些消息来欺骗系统。即使消息是加密的或认证的,如果协议没有防止重放,攻击者仍然可以重放消息。

使用时间戳可以防止重放攻击。消息包含时间戳,接收方检查时间戳是否在可接受的范围内(如5分钟内)。如果时间戳太旧或太新,接收方拒绝消息。
但时间戳方法面临时钟同步问题。如果发送方和接收方的时钟不同步,合法消息可能被拒绝,或者旧消息可能被接受。这需要时钟同步机制,如NTP(Network Time Protocol)。
使用随机数(Nonce,Number used Once)可以防止重放攻击。每次协议执行时,生成一个唯一的随机数,包含在消息中。接收方记录已使用的随机数,如果收到重复的随机数,拒绝消息。
随机数方法不需要时钟同步,但需要存储已使用的随机数。如果系统需要处理大量消息,存储所有随机数可能不现实。这需要定期清理旧的随机数,或者使用滑动窗口机制。
使用序列号可以防止重放攻击。消息包含序列号,接收方检查序列号是否在可接受的范围内。如果序列号太小(可能是重放),接收方拒绝消息。
序列号方法需要双方维护序列号状态,这在某些场景中可能不方便。但如果双方有持久连接,序列号方法可能比随机数方法更高效。
防止重放攻击是协议设计的关键要求。即使消息是加密和认证的,如果没有防止重放,攻击者仍然可以重放旧消息来欺骗系统。时间戳、随机数、序列号是常用的防重放机制。
中间人攻击(Man-in-the-Middle Attack,MITM)是协议设计中的严重威胁。攻击者拦截通信双方之间的消息,可能修改、删除、重放消息,或者建立与双方的独立连接。

在中间人攻击中,攻击者位于通信双方之间,可以:
防止中间人攻击需要身份认证。通信双方必须能够确认对方的身份,确保消息确实来自声称的发送方。
中间人攻击是网络通信中的严重威胁。即使使用加密,如果没有身份认证,攻击者仍然可以进行中间人攻击。设计协议时必须考虑身份认证。
设计安全协议需要遵循一些基本原则。理解这些原则有助于设计安全的协议,也有助于分析现有协议的安全性。
协议设计是一个复杂的过程,需要仔细考虑各种攻击场景。即使所有密码学原语都是安全的,协议设计错误也可能导致严重的安全漏洞。应该使用经过充分测试的标准协议,而不是自己设计协议。
理解实际协议的设计原理和安全特性,有助于理解协议设计的实际应用。我们将分析TLS、SSH、Kerberos等协议。
TLS是互联网上最广泛使用的安全协议,用于保护HTTP、SMTP、IMAP等应用层协议。TLS提供机密性、完整性、认证等安全服务。
TLS握手过程包括:
TLS的设计考虑了各种攻击场景,包括中间人攻击、重放攻击、降级攻击等。但TLS的实现仍然可能出现漏洞,如Heartbleed、POODLE等。
TLS协议本身是安全的,但实现可能存在问题。应该使用最新版本的TLS(目前是TLS 1.3),避免使用旧版本(如SSL 3.0、TLS 1.0),这些版本存在已知漏洞。
SSH是用于远程登录的安全协议。SSH提供身份认证、加密通信、端口转发等功能。
SSH的密钥交换使用Diffie-Hellman,身份认证可以使用密码、公钥、证书等方式。SSH首次连接时显示服务器密钥指纹,用户需要手动验证,这防止了中间人攻击(假设用户正确验证了指纹)。
SSH的设计考虑了各种攻击场景,但实现可能存在问题。应该使用最新版本的SSH,配置强密码套件,禁用不安全的选项。

Kerberos是一个网络认证协议,使用可信第三方(密钥分发中心,KDC)来认证用户和服务。Kerberos解决了在开放网络中安全认证的问题。
Kerberos的基本流程:
Kerberos的设计考虑了重放攻击、中间人攻击等,使用时间戳和随机数来防止重放。但Kerberos需要时钟同步,KDC是单点故障。
安全协议结合使用密码学技术来实现安全通信。认证协议允许一方证明身份,密钥交换协议允许双方建立共享密钥,完整的协议(如TLS)提供机密性、完整性、认证等安全服务。 协议设计比使用密码学原语更复杂,因为涉及多个步骤、多个参与方、以及各种攻击场景。重放攻击、中间人攻击是协议设计中的常见威胁,需要使用时间戳、随机数、身份认证等机制来防止。
理解协议设计的原则和常见陷阱,以及分析实际协议的设计原理,有助于理解现代网络安全。在下一部分中,我们将讨论操作系统安全,理解系统级安全机制如何保护系统资源。