第7章 网络安全¶
第 7 章 网络安全¶
随着计算机网络的发展,网络中的安全问题也日趋严重。当网络的用户来自社会各个阶层与部门时,大量在网络中存储和传输的数据就需要保护。由于计算机网络安全是另一门专业学科,所以本章只对计算机网络安全问题的基本内容进行初步的介绍。
本章最重要的内容是:
7.1 网络安全问题概述¶
本节讨论计算机网络面临的安全性威胁、安全的内容和一般的数据加密模型。
7.1.1 计算机网络面临的安全性威胁¶
计算机网络的通信面临两大类威胁,即被动攻击和主动攻击(如图 7-1 所示)。

被动攻击是指攻击者从网络上窃听他人的通信内容。通常把这类攻击称为截获。在被动攻击中,攻击者只是观察和分析某一个协议数据单元 PDU(这里使用 PDU 这一名词是考虑到所涉及的可能是不同的层次)而不干扰信息流。即使这些数据对攻击者来说是不易理解的,他也可通过观察 PDU 的协议控制信息部分,了解正在通信的协议实体的地址和身份,研究 PDU 的长度和传输的频度,从而了解所交换的数据的某种性质。这种被动攻击又称为流量分析 (traffic analysis)。在战争时期,通过分析某处出现大量异常的通信量,往往可以发现敌方指挥所的位置。
主动攻击有如下几种最常见的方式。
- 计算机病毒 (computer virus),一种会 “传染” 其他程序的程序,“传染” 是通过修改其他程序来把自身或自己的变种复制进去而完成的。
- 计算机蠕虫 (computer worm),一种通过网络的通信功能将自身从一个节点发送到另一个节点并自动启动运行的程序。
- 特洛伊木马 (Trojan horse),一种程序,它执行的功能并非所声称的功能而是某种恶意功能。如一个编译程序除了执行编译任务以外,还把用户的源程序偷偷地复制下来,那么这种编译程序就是一种特洛伊木马。计算机病毒有时也以特洛伊木马的形式出现。
- 逻辑炸弹 (logic bomb),一种当运行环境满足某种特定条件时执行其他特殊功能的程序。如一个编辑程序,平时运行得很好,但当系统时间为 13 日又为星期五时,它会删去系统中所有的文件,这种程序就是一种逻辑炸弹。
- 后门入侵 (backdoor knocking),是指利用系统实现中的漏洞通过网络入侵系统。就像一个盗贼在夜晚试图闯入民宅,如果某家住户的房门有缺陷,盗贼就能乘虚而入。索尼游戏网络 (PlayStation Network) 在 2011 年被入侵,导致 7700 万用户的个人信息,诸如姓名、生日、E-mail 地址、密码等被盗 [W-BACKD]。
- 流氓软件,一种未经用户允许就在用户计算机上安装运行并损害用户利益的软件,其典型特征是:强制安装、难以卸载、浏览器劫持、广告弹出、恶意收集用户信息、恶意卸载、恶意捆绑等。现在流氓软件的泛滥程度已超过了各种计算机病毒,成为互联网上最大的公害。流氓软件的名字一般都很吸引人,如某某卫士、某某搜霸等,因此要特别小心。
上面所说的计算机病毒是狭义的,也有人把所有的恶意程序泛指为计算机病毒。例如 1988 年 10 月 “Morris 病毒” 入侵美国互联网,舆论说该事件是 “计算机病毒入侵美国计算机网”,而计算机安全专家却称之为 “互联网蠕虫事件”。
(3) 拒绝服务 DoS (Denial of Service) 指攻击者向互联网上的某个服务器不停地发送大量分组,使该服务器无法提供正常服务,甚至完全瘫痪。2000 年 2 月 7 日至 9 日美国几个著名网站遭黑客 \(^{①}\) 袭击,使这些网站的服务器一直处于 “忙” 的状态,因而无法向发出请求的客户提供服务。这种攻击被称为拒绝服务。又如在 2014 年圣诞节,索尼游戏网 (PlayStation Network) 和微软游戏网 (Microsoft Xbox Live) 被黑客攻击后瘫痪,估计有 1.6 亿用户受到影响 [W-DOS]。
若从互联网上的成百上千个网站集中攻击一个网站,则称为分布式拒绝服务 DDoS (Distributed Denial of Service)。有时也把这种攻击称为网络带宽攻击或连通性攻击。
2018 年 2 月,6 日世界标准时间零时,亚太地区许多计算机同时向根服务器系统发动袭击,企图使之瘫痪。它们每秒传送的数据量相当于服务器每分钟要接收 75 万封电子邮件。结果至少有 6 个根服务器系统受到影响,两个破坏严重。有分析认为攻击来自韩国,但
ICANN 不认为黑客一定是韩国人,他可以是任何地点的任何人,只不过是操纵了韩国的计算机而已。
还有其他类似的网络安全问题。例如,在使用以太网交换机的网络中,攻击者向某个以太网交换机发送大量的伪造源 MAC 地址的帧。以太网交换机收到这样的帧,就把这个假的源 MAC 地址写入交换表中(因为交换表中没有这个地址)。由于这种伪造的地址数量太大,因此很快就把交换表填满了,导致以太网交换机无法正常工作(称为交换机中毒)。
对于主动攻击,可以采取适当措施加以检测。但对于被动攻击,通常却是检测不出来的。根据这些特点,可得出计算机网络通信安全的目标如下:
对付被动攻击可采用各种数据加密技术,而对付主动攻击,则需将加密技术与适当的鉴别技术相结合。
7.1.2 安全的计算机网络¶
人们一直希望能设计出一种安全的计算机网络,但不幸的是,网络的安全性是不可判定的 [DENN82]。目前在安全协议的设计方面,主要是针对具体的攻击设计安全的通信协议。但如何保证所设计出的协议是安全的?这可以使用两种方法。一种是用形式化方法来证明,另一种是用经验来分析协议的安全性。形式化证明的方法是人们所希望的,但一般意义上的协议安全性也是不可判定的,只能针对某种特定类型的攻击来讨论其安全性。对于复杂的通信协议的安全性,形式化证明比较困难,所以主要采用人工分析的方法来找漏洞。对于简单的协议,可通过限制入侵者的操作(即假定入侵者不会进行某种攻击)来对一些特定情况进行形式化的证明,当然,这种方法有很大的局限性。
根据上一节所述的各种安全性威胁,不难看出,一个安全的计算机网络应设法达到以下四个目标:
1. 机密性¶
机密性(或私密性)就是只有信息的发送方和接收方才能懂得所发送信息的内容,而信息的截获者则看不懂所截获的信息。显然,机密性是网络安全通信最基本的要求,也是对付被动攻击所必须具备的功能。通常可简称为保密。尽管计算机网络安全并不仅仅依靠机密性,但不能提供机密性的网络肯定是不安全的。为了使网络具有机密性,需要使用各种密码技术。
2. 端点鉴别¶
安全的计算机网络必须能够鉴别信息的发送方和接收方的真实身份。网络通信和面对面的通信差别很大。现在频繁发生的网络诈骗,在许多情况下,就是由于在网络上不能鉴别出对方的真实身份。当我们收到一封电子邮件时,发信人也可能并不是邮件上所署名的那个人。当我们进行网上购物时,卖家也有可能是犯罪分子假冒的商家。不能解决这个问题,就不能认为网络是安全的。端点鉴别在对付主动攻击时是非常重要的。
3. 信息的完整性¶
即使能够确认发送方的身份是真实的,并且所发送的信息都是经过加密的,我们依然不能认为网络是安全的。还必须确认所收到的信息都是完整的,也就是信息的内容没有被人篡改过。保证信息的完整性在应对主动攻击时也是必不可少的。信息的完整性和机密性是两个不同的概念。例如,商家向公众发布的商品广告当然不需要保密,但如果广告在网络上传送时被人恶意删除或添加了一些内容,那么就可能对商家造成很大的损失。
实际上,信息的完整性与端点鉴别往往是不可分割的。假定你准确知道报文发送方的身份没有错(即通过了端点鉴别),但收到的报文却已被人篡改过(即信息不完整),那么这样的报文显然是没有用处的。因此,在谈到 “鉴别” 时,有时是同时包含了端点鉴别和报文的完整性。也就是说,既鉴别发送方的身份,又鉴别报文的完整性。
4. 运行的安全性¶
现在的机构与计算机网络的关系越密切,就越要重视计算机网络运行的安全性。上一节介绍的恶意程序和拒绝服务的攻击,即使没有窃取到任何有用的信息,也能够使受到攻击的计算机网络不能正常运行,甚至完全瘫痪。因此,确保计算机系统运行的安全性,也是非常重要的工作。对于一些要害部门,这点尤为重要。
访问控制 (access control) 对计算机系统的安全性非常重要。必须对访问网络的权限加以控制,并规定每个用户的访问权限。由于网络是个非常复杂的系统,其访问控制机制比操作系统的访问控制机制更复杂(尽管网络的访问控制机制是建立在操作系统的访问控制机制之上的),尤其在安全要求更高的多级安全 (multilevel security) 情况下更是如此。
7.1.3 数据加密模型¶
一般的数据加密模型如图 7-2 所示。用户 A 向 B 发送明文 X,但通过加密算法 E 运算后,就得出密文 Y。

图中所示的加密和解密用的密钥 \(K\) (key) 是一串秘密的字符串(即比特串)。公式 (7-1) 就是明文通过加密算法变成密文的一般表示方法。
在传送过程中可能出现密文的截取者(或攻击者、入侵者)。公式 (7-2) 表示接收端利用解密算法 \(D\) 运算和解密密钥 \(K\) ,解出明文 \(X\) 。解密算法是加密算法的逆运算。在进行解密运算时,如果不使用事先约定好的密钥就无法解出明文。
这里我们假定加密密钥和解密密钥都是一样的。但实际上它们可以是不一样的(即使不一样,这两个密钥也必然有某种相关性)。密钥通常由密钥中心提供。当密钥需要向远地传送时,一定要通过另一个安全信道。
密码编码学 (cryptography) 是密码体制的设计学,而密码分析学 (cryptanalysis) 则是在未知密钥的情况下从密文推演出明文或密钥的技术。密码编码学与密码分析学合起来即为密码学 (cryptology)。
如果不论截取者获得了多少密文,但在密文中都没有足够的信息来唯一地确定出对应的明文,则这一密码体制称为无条件安全的,或称为理论上是不可破的。在无任何限制的条件下,目前几乎所有实用的密码体制均是可破的。因此,人们关心的是要研制出在计算上(而不是在理论上)是不可破的密码体制。如果一个密码体制中的密码,不能在一定时间内被可以使用的计算资源破译,则这一密码体制称为在计算上是安全的。
早在几千年前人类就已经有了通信保密的思想和方法。直到 1949 年,信息论创始人香农 (C. E. Shannon) 发表著名文章 [SHAN49],论证了一般经典加密方法得到的密文几乎都是可破的。密码学的研究曾面临着严重的危机。但从 20 世纪 60 年代起,随着电子技术、计算技术的迅速发展以及结构代数、可计算性和计算复杂性理论等学科的研究,密码学又进入了一个新的发展时期。在 20 世纪 70 年代后期,美国的数据加密标准 DES (Data Encryption Standard) 和公钥密码体制(public key crypto-system,又称为公开密钥密码体制)的出现,成为近代密码学发展史上的两个重要里程碑。
7.2 两类密码体制¶
7.2.1 对称密钥密码体制¶
所谓对称密钥密码体制,即加密密钥与解密密钥都使用相同密钥的密码体制。例如图 7-2 所示的情况,通信的双方使用的就是对称密钥。
数据加密标准 DES 属于对称密钥密码体制。它由 IBM 公司研制出,于 1977 年被美国定为联邦信息标准后,在国际上引起了极大的重视。ISO 曾将 DES 作为数据加密标准。
DES 是一种分组密码。在加密前,先对整个的明文进行分组。每一个组为 64 位长的二进制数据。然后对每一个 64 位二进制数据进行加密处理,产生一组 64 位密文数据。最后将各组密文串接起来,即得出整个的密文。使用的密钥占有 64 位(实际密钥长度为 56 位,外加 8 位用于奇偶校验)。
DES 的机密性仅取决于对密钥的保密,而算法是公开的。DES 的问题是它的密钥长度。56 位长的密钥意味着共有 \(2^{56}\) 种可能的密钥,也就是说,共有约 \(7.6 \times 10^{16}\) 种密钥。假设一台计算机 \(1\mu \mathrm{s}\) 可执行一次 DES 加密,同时假定平均只需搜索密钥空间的一半即可找到密钥,那么破译 DES 要超过 1000 年。
然而芯片的发展出乎意料地快。不久,56 位 DES 已不再被认为是安全的。
对于 DES 56 位密钥的问题,学者们提出了三重 DES(Triple DES 或记为 3DES)的方案,把一个 64 位明文用一个密钥加密,再用另一个密钥解密,然后再使用第一个密钥加密,即
这里,X 是明文,Y 是密文,K1 和 K2 分别是第一个和第二个密钥, \(\mathrm{DES}_{K1}(\cdot)\) 表示用密钥 K1 进行 DES 加密,而 \(\mathrm{DES}^{-1}_{K2}(\cdot)\) 表示用密钥 K2 进行 DES 解密。
这种三重 DES 曾广泛用于网络、金融、信用卡等系统。
在 DES 之后,1997 年美国标准与技术协会 (NIST),对一种新的加密标准即高级加密标准 AES (Advanced Encryption Standard) 进行遴选,最后由两位年轻比利时学者 Joan Daemen 和 Vincent Rijmen 提交的 Rijndael 算法被选中,在 2001 年正式成为 NIST 的加密标准。在 2002 年成为美国政府加密标准。现在 AES 也是 ISO/IEC 18033-3 标准。
AES 是一种分组密码,分组长度为 128 位。AES 有三种加密标准,其密钥分别为 128 位、192 位和 256 位,加密步骤相当复杂,运算速度比 3DES 快得多,且安全性也大大加强。在 2001 年,NIST 曾有一个大致的估计,就是假定有一台高速计算机,仅用 1 秒钟就能够破译 56 位的 DES(也就是采用穷举法,在 1 秒钟内能够把 DES 所有的 \(2^{56}\) 个密钥逐个进行解密运算一遍),那么要破译 128 位的 AES,就需要 \(10^{12}\) 年!但是计算机运算速度的提高是很难预测的。因此美国国家安全局 NSA 认为,对于最高机密信息(这类信息必须保证数十年以上的安全性)的传递,至少需要 192 或 256 位的密钥长度。
到 2020 年 5 月为止,尚未见到能够成功破解 AES 密码系统的报道。有人认为,要破解 AES 可能需要在数学上出现非常重大的突破。
7.2.2 公钥密码体制¶
公钥密码体制的概念是由斯坦福 (Stanford) 大学的研究人员 Diffie 与 Hellman 于 1976 年提出的 [DIFF76]。公钥密码体制使用不同的加密密钥与解密密钥。这种加密体制又称为非对称密钥密码体制。
公钥密码体制的产生主要有两个方面的原因,一是由于对称密钥密码体制的密钥分配问题,二是由于对数字签名的需求。
在对称密钥密码体制中,加解密的双方使用的是相同的密钥。但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送。在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适的。如果事先约定密钥,就会给密钥的管理和更换带来极大的不便。若使用高度安全的密钥分配中心 KDC (Key Distribution Center),也会使得网络成本增加。
对数字签名的强烈需要也是产生公钥密码体制的一个原因。在许多应用中,人们需要对纯数字的电子信息进行签名,表明该信息确实是某个特定的人产生的。
公钥密码体制提出不久,人们就找到了三种公钥密码体制。目前最著名的是由美国三位科学家 Rivest, Shamir 和 Adleman 于 1976 年提出并在 1978 年正式发表的 RSA 体制,它是一种基于数论中的大数分解问题的体制 [RIVE78]。
在公钥密码体制中,加密密钥 PK(Public Key,即公钥)是向公众公开的,而解密密钥 SK(Secret Key,即私钥或密钥)则是需要保密的。加密算法 E 和解密算法 D 也都是公开的。
公钥密码体制的加密和解密过程有如下特点:
(1) 密钥对产生器产生出接收者 B 的一对密钥:加密密钥 \(\mathrm{PK}_{\mathrm{B}}\) 和解密密钥 \(\mathrm{SK}_{\mathrm{B}}\) 。发送者 A 所用的加密密钥 \(\mathrm{PK}_{\mathrm{B}}\) 就是接收者 B 的公钥,它向公众公开。而 B 所用的解密密钥 \(\mathrm{SK}_{\mathrm{B}}\) 就是接收者 B 的私钥,对其他人都保密。
(2) 发送者 A 用 B 的公钥 \(PK_{B}\) 通过 E 运算对明文 X 加密,得出密文 Y,发送给 B。
B 用自己的私钥 \(\mathrm{SK}_{\mathrm{B}}\) 通过 \(D\) 运算进行解密,恢复出明文,即
(3) 虽然在计算机上可以容易地产生成对的 \(\mathrm{PK}_{\mathrm{B}}\) 和 \(\mathrm{SK}_{\mathrm{B}}\) ,但从已知的 \(\mathrm{PK}_{\mathrm{B}}\) 实际上不可能推导出 \(\mathrm{SK}_{\mathrm{B}}\) ,即从 \(\mathrm{PK}_{\mathrm{B}}\) 到 \(\mathrm{SK}_{\mathrm{B}}\) 是 “计算上不可能的”。这就是说,除了 B 以外,其他任何人都无法解密出明文 \(X\) 。
(4) 虽然公钥可用来加密,但却不能用来解密,即
(5) 先后对 X 进行 D 运算和 E 运算或进行 E 运算和 D 运算,结果都是一样的:
请注意,通常都是先加密然后再解密。但仅从运算的角度看,D 运算和 E 运算的先后顺序则可以是任意的。对某个报文进行 D 运算,并不表明是要对其解密。
图 7-3 给出了用公钥密码体制进行加密的过程。

公开密钥与对称密钥在使用通信信道方面有很大的不同。在使用对称密钥时,由于双方使用同样的密钥,因此在通信信道上可以进行一对一的双向保密通信,每一方既可用此密钥加密明文,并发送给对方,也可接收密文,用同一密钥对密文解密。这种保密通信仅限于持有此密钥的双方(如再有第三方就不保密了)。但在使用公钥密码体制时,在通信信道上可以是多对一的单向保密通信。例如在图 7-3 中,可以有很多人同时持有 B 的公钥,并各自用此公钥对自己的报文加密后发送给 B。只有 B 才能够用其私钥对收到的多个密文一一进行解密。但使用这对密钥进行反方向的保密通信则是不行的。在现实生活中,这种多对一的单向保密通信是很常用的。例如,在网购时,很多顾客都向同一个网站发送各自的信用卡信息,就属于这种情况。
请注意,任何加密方法的安全性取决于密钥的长度,以及攻破密文所需的计算量,而不是简单地取决于加密的体制(公钥密码体制或传统加密体制)。我们还要指出,公钥密码体制并没有使传统密码体制被弃用,因为目前公钥加密算法的开销较大,在可见的将来还不会放弃传统加密方法。
7.3 鉴别¶
7.3.1 报文鉴别¶
在网络的应用中,鉴别 (authentication) 是网络安全中一个很重要的问题。鉴别和加密是不相同的概念。鉴别的内容有二。一是要鉴别发信者,即验证通信的对方的确是自己所要通信的对象,而不是其他的冒充者。这就是实体鉴别。实体可以是发信的人,也可以是一个进程(客户或服务器)。因此这也常称为端点鉴别。二是要鉴别报文的完整性,即对方所传送的报文没有被他人篡改过。至于报文是否需要加密,则是与 “鉴别” 性质不同的问题。有的报文需要加密(这要另找措施),但许多报文并不需要加密。
请注意,鉴别与授权 (authorization) 也是不同的概念。授权涉及的问题是:所进行的过程是否被允许(如是否可以对某文件进行读或写)。
不过有时常用报文鉴别一词包含上述鉴别的两个内容,既鉴别报文的发送者,也鉴别报文的完整性。
下面分别讨论报文鉴别与实体鉴别的特点。
1. 用数字签名进行鉴别(原理)¶
我们知道,书信或文件可根据亲笔签名或印章来鉴别其真实性。但在计算机网络中传送的报文,则可使用数字签名进行鉴别。下面就介绍数字签名的原理。
为了进行数字签名,A 用其私钥 \(\mathrm{SK}_{\mathrm{A}}\) 对报文 \(X\) 进行 \(D\) 运算(如图 7-4 所示)。 \(D\) 运算本来叫作解密运算。可是,还没有加密怎么就进行解密呢?其实 \(D\) 运算只是把报文变换为某种不可读的密文(因此有时也说成 A 用其私钥对报文加密,但这样说不准确)。在图 7-4 中我们使用 “\(D\) 运算” 而不是 “解密运算”,就是为了避免产生这种误解。A 把经过 \(D\) 运算得到的密文传送给 B。B 为了核实签名,用 A 的公钥进行 \(E\) 运算,还原出明文 \(X\) 。请注意,任何人用 A 的公钥 \(\mathrm{PK}_{\mathrm{A}}\) 进行 \(E\) 运算后都可以得出 A 发送的明文。可见图 7-4 所示的通信方式并非为了保密,而是为了进行签名和核实签名,即确认此明文的确是 A 发送的。

下面讨论一下为什么数字签名具有鉴别报文的功能。
因为除 A 外没有别人持有 A 的私钥 \(SK_{A}\) ,所以除 A 外没有别人能产生密文 \(D_{\mathrm{SK}_{\mathrm{A}}}(X)\) 。这样,B 确信报文 X 是 A 签名发送的。这就鉴别了报文的发送者。同理,其他人如果篡改过报文,但由于无法得到 A 的私钥 \(SK_{A}\) 对篡改后的报文进行 D 运算,那么 B 对收到的报文进行核实签名的 E 运算后,将会得出不可读的明文,因而不会被欺骗。这样就保证了报文的完整性。
数字签名还有另一功能,就是发送者事后不能抵赖对报文的签名。这叫作不可否认。
若 A 要抵赖曾发送报文给 B,B 可把 X 及 \(D_{\mathrm{SK}_{A}}(X)\) 出示给进行公证的第三者。第三者很容易用 \(PK_{A}\) 去证实 A 确实发送 X 给 B。
以上这三项功能的关键都在于没有其他人能够持有 A 的私钥 \(SK_{A}\) 。
但数字签名仅对报文进行了签名,对报文 \(X\) 本身却未保密。因为截获到密文 \(D_{\mathrm{SK_A}}(X)\) 并知道发送者身份的任何人,若通过某种手段获得了发送者的公钥 \(\mathrm{PK_A}\) ,就能解出报文的内容。如果用图 7-5 所示的方法,就可同时实现保密通信和数字签名。图中 \(\mathrm{SK_A}\) 和 \(\mathrm{SK_B}\) 分别为 A 和 B 的私钥,而 \(\mathrm{PK_A}\) 和 \(\mathrm{PK_B}\) 分别为 A 和 B 的公钥。请注意,在许多情况下,我们往往强调的是使用何种密钥进行运算,这时的表达方式可简单些。例如,“用 A 的私钥对明文 \(X\) 进行签名” 可记为 \(\mathrm{SK_A}(X)\) 。若 “再用 B 的公钥对此签名进行加密”,则可记为 \(\mathrm{PK_B}(\mathrm{SK_A}(X))\) ,而不必深究使用的是 \(D\) 运算还是 \(E\) 运算。

如图 7-5 所示的可保证机密性的数字签名方法,虽然在理论上是正确的,但很难用于现实生活中。因此这一节的小标题后边有 “原理” 二字。这是因为要对报文(可能很长的报文)先后要进行两次 D 运算和两次 E 运算,这种运算量太大,要花费非常多的计算机 CPU 时间,在很多情况下是无法令人接受的。因此目前对网络上传送的大量报文,普遍都使用开销小得多的对称密钥加密。要实现数字签名当然必须使用公钥密码,但一定要设法减小公钥密码算法的开销。这就要使用后面几个小节所讨论的密码散列函数和报文鉴别码。
2. 密码散列函数¶
散列函数(又称为杂凑函数,或哈希函数)在计算机领域中使用得很广泛。密码学对散列函数有非常高的要求,因此符合密码学要求的散列函数又常称为密码散列函数 (cryptographic hash function)。以后在不致产生错误概念时,我们也常把密码散列函数简称为散列函数。具体说来,密码散列函数 \(H(X)\) 应具有以下四个特点:
(1) 虽然散列函数的输入报文 \(X\) 的长度不受限制,但计算出的结果 \(H(X)\) 的长度则应是较短的和固定的。散列函数的输出 \(H(X)\) 又称为散列值,或散列。散列函数采用确定算法,因此相同的输入必定得出相同的输出。虽然密码散列函数相当复杂,但利用计算机,散列函数的运算还是相当快的。
(2) 散列函数的输入和输出的关系是多对一的。若散列值 \(H(X)\) 的长度为 128 位,那么输出散列值只有 \(2^{128}\) 个有限多的可能值( \(2^{128}\) 与 IPv6 的地址数一样大,是个很大的数值)。然而我们的输入报文 \(X\) 却有无限多的取值。可见必然会出现不同输入却产生相同输出的碰撞现象。精心挑选的密码散列函数应当非常不易发生碰撞,即应具有很好的抗碰撞性。
(3) 若给出散列值 \(H(X)\) ,则无人能找出输入报文 \(X\) 。也就是说,散列函数是一种单向函数 (one-way function),即逆向变换是不可能的(如图 7-6 所示)。

上述特点的另一种表述方法是:
若已知 X 和 \(H(X)\) ,则没有人能够找到 \(Y (Y \neq X)\) ,使得 \(H(Y) = H(X)\) 。
但下面我们要讲到,关于这方面的研究,后来已有了一些新的进展。
(4) 好的密码散列函数还具有这样一些特性:散列函数输出的每一个比特,都与输入的每一个比特有关;哪怕仅改动输入的一个比特,输出也会相差极大;散列函数的运算包括许多非线性运算。
通过许多学者的不断努力,已经设计出一些实用的密码散列函数(或称为散列算法),其中最出名的就是 MD5 和 SHA-1。MD 就是 Message Digest 的缩写,意思是报文摘要。MD5 是报文摘要的第 5 个版本。
报文摘要算法 MD5 公布于 RFC 1321(1991 年),并获得了非常广泛的应用。MD5 的设计者 Rivest 曾提出一个猜想,即根据给定的 MD5 报文摘要代码,要找出一个与原来报文有相同报文摘要的另一报文,其难度在计算上几乎是不可能的。但在 2004 年,中国学者王小云 \(^{①}\) 发表了轰动世界的密码学论文,证明可以用系统的方法找出一对报文,这对报文具有相同的 MD5 报文摘要 [W-WANG],而这仅需 15 分钟,或不到 1 小时。于是,MD5 的安全性就产生了动摇。随后,又有许多学者开发了对 MD5 实际的攻击。于是 MD5 最终被另一种叫作安全散列算法 SHA (Secure Hash Algorithm) 的标准所取代。
下面仍以 MD5 为例来介绍报文摘要。这主要是考虑到目前新的散列函数(如 SHA-2)是从 MD5 发展而来的。对于有兴趣研究散列函数的读者,MD5 是个很好的出发点。
MD5 算法的大致过程如下:
这样得出的 MD5 报文摘要代码中的每一位都与原来报文中的每一位有关。由此可见,像 MD5 这样的密码散列函数实际上已是个相当复杂的算法,而不是简单的函数了。
SHA-1 是由美国标准与技术协会 NIST 提出的一个散列算法系列。SHA-1 和 MD5 相似,但其散列值的长度为 160 位(比 MD5 的 128 位多了 25%)。SHA-1 也是先把输入报文划分为许多 512 位长的数据块,然后经过复杂运算后得出散列值。SHA-1 比 MD5 更安全,但计算起来却比 MD5 要慢些。1995 年发布的新版本 SHA-1 [RFC 3174] 在安全性方面有了很大的改进。
但 SHA-1 后来也被证明其实际安全性并未达到设计要求,并且也曾被王小云教授的研究团队攻破。谷歌也宣布了攻破 SHA-1 的消息。现在 SHA-1 已被另外的两个版本 SHA-2 [RFC 6234] 和 SHA-3 [W-SHA3] 所替代。SHA-2 和 SHA-3 都各有好几种变型。前者有 SHA-224, SHA-256, SHA-384 和 SHA-512,后者有 SHA3-224, SHA3-256, SHA3-384 和 SHA3-512。在上面名称最后的 3 位数字表示散列的位数。这里需要指出,SHA-3 采用了与 SHA-2 完全不同的散列函数。现在许多组织都已纷纷宣布停用 SHA-1。例如,微软于 2017 年 1 月 1 日起停止支持 SHA-1 证书,而以前签发的 SHA-1 证书也必须更换为 SHA-2 证书。
请注意,MD5 或 SHA-1 “被攻破”,是指有人能设法找出具有相同散列值的一对报文。这样就动摇了 MD5 或 SHA-1 的安全性。但是,密码学家目前尚无法把一个任意已知的报文 X,篡改为具有同样 MD5 或 SHA-1 散列值的另一报文 Y。
3. 用报文鉴别码实现报文鉴别¶
下面进一步讨论怎样使用散列函数来实现报文鉴别。
下面给出的三个简单步骤,给出鉴别报文的初步概念。
但上述做法实际上是不可行的。设想某个入侵者创建了一个伪造的报文 M,然后也用同样的方法计算出其散列 \(H(M)\) ,并且冒充 A 把拼接有散列的扩展报文发送给 B。B 收到扩展的报文 \((M, H(M))\) 后,按照上面步骤 (3) 的方法进行验证,发现一切都是正常的,就会误认为所收到的伪造报文就是 A 发送的。
因此,必须设法对上述的攻击进行防范。解决的办法可以是:A 把双方共享的密钥 K(K 就是一串不太长的字符串)拼接到报文 X 后,进行散列运算(如图 7-7 所示)。散列运算得出的结果为固定长度的 \(H(X + K)\) ,称为报文鉴别码 MAC (Message Authentication Code)。请注意:局域网中使用的媒体接入控制 MAC 正好也使用这三个字母,因此在看到缩写词 MAC 时应注意上下文。A 把报文鉴别码 MAC 拼接在报文 X 后面,得到扩展的报文,发送给 B。我们注意到,共享密钥 K 并没有出现在网上传送的扩展的报文中。
B 收到扩展的报文后,把报文鉴别码 MAC 与报文 X 进行分离。B 再用同样的密钥 K 与报文 X 拼接,进行散列运算,把得出的结果 \(H(X + K)\) 与分离出的报文鉴别码 MAC 进行比较。如相等,就可确认收到的报文 X 的确是 A 发送的。只要入侵者不掌握密钥 K,就无法伪造 A 的报文鉴别码 MAC,因而无法伪造 A 发送的报文。像这样的报文鉴别码称为数字签名,或数字指纹。图 7-7 所示的过程就是 A 对报文进行了签名,而 B 对报文进行了鉴别。

图 7-7 所示的鉴别过程并没有执行加密算法,只是在计算散列值时在报文后面拼接了密钥,因此这种鉴别报文的方法消耗的计算资源很少,但却能有效地保护报文的完整性。
在许多有关鉴别的文献中,常常看到在 MAC 前面加上一个 H 的写法,即 HMAC (Hashed MAC)。MAC 与 HMAC 的区别如图 7-8 所示 [PETE12,第 646 页]。前面图 7-7 所示的 MAC 实际上就是 HMAC。计算 HMAC 是规定把密钥 K 拼接在明文后面,然后使用密码散列算法对其进行运算,得出的散列值就是 HMAC。但在计算 MAC 时则不一定这样做。首先,密钥 K 不一定非要拼接在明文的后面,只要把密钥 K 作为一个计算 MAC 的参数即可。其次,可以有多种计算 MAC 的算法,不一定非要使用严格的密码散列算法。在 RFC 2104 中,对各种不同情况下 HMAC 的计算方法都有着详细的规定。但在本书中,为了方便,对 MAC 和 HMAC 可视为同义词。


上述这种鉴别报文的方法还有一些问题有待解决。例如,采用怎样安全有效的方法来分发通信双方共享的密钥 K?另一种可行的方法是采用公钥系统。我们用图 7-9 来说明。

用户 A 对报文 X 进行散列运算,得出固定长度的散列 \(H(X)\) 。用自己的私钥对 \(H(X)\) 进行 D 运算(也可以说成是用私钥进行加密),得出已签名的但非固定长度的报文鉴别码 MAC。
请注意,这里没有对报文 X 进行加密,而是对很短的散列 \(H(X)\) 进行 D 运算,因此这种运算仍然是很快的。A 把已签名的非固定长度的报文鉴别码 MAC,拼接在报文 X 后面,构成扩展的报文发送给 B。
B 收到扩展的报文后,先进行报文分离。虽然 B 不知道已签名的报文鉴别码的长度,但由于报文 X 是明文,其结束处可以设有标记,因此分离出 MAC 不困难。分离后,B 对报文 X 进行散列函数运算,同时用 A 的公钥对分离出的已签名的报文鉴别码 MAC 进行 E 运算(也可以说成是用公钥进行解密)。最后对这两个运算结果 \(H(X)\) 进行比较。如相等,就说明一切正确。由于入侵者没有 A 的私钥,因此不可能伪造出 A 发出的报文。这里我们假定 B 事先知道 A 的公钥。
不难看出,采用这种方法得到的扩展的报文,不仅是不可伪造的,也是不可否认的。图 7-9 所示的过程,可简称为:“A 用自己的私钥进行签名,B 用 A 的公钥进行鉴别”。
7.3.2 实体鉴别¶
实体鉴别和报文鉴别不同。报文鉴别是对每一个收到的报文都要鉴别报文的发送者,而实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体只需验证一次。
最简单的实体鉴别过程如图 7-10 所示。A 向远端的 B 发送带有自己身份 A(例如,A 的姓名)和口令的报文,并且使用双方约定好的共享对称密钥 \(K_{AB}\) 进行加密。B 收到此报文后,用共享对称密钥 \(K_{AB}\) 进行解密,从而鉴别了实体 A 的身份。

然而这种简单的鉴别方法具有明显的漏洞。例如,入侵者 C 可以从网络上截获 A 发给 B 的报文,C 并不需要破译这个报文(因为破译可能很费时间),而是直接把这个由 A 加密的报文发送给 B,使 B 误认为 C 就是 A;然后 B 就向伪装成 A 的 C 发送许多本来应当发给 A 的报文。这就叫作重放攻击 (replay attack)。C 甚至还可以截获 A 的 IP 地址,然后把 A 的 IP 地址冒充为自己的 IP 地址(这叫作 IP 欺骗),使 B 更加容易受骗。
为了对付重放攻击,可以使用不重数 (nonce)。不重数就是一个不重复使用的大随机数,即 “一次一数”。在鉴别过程中不重数可以使 B 能够把重复的鉴别请求和新的鉴别请求区分开。图 7-11 给出了这个过程。

在图 7-11 中,A 首先用明文发送其身份 A 和一个不重数 \(R_{A}\) 给 B。接着,B 响应 A 的查问,用共享的密钥 \(K_{AB}\) 对 \(R_{A}\) 加密后发回给 A,同时也给出了自己的不重数 \(R_{B}\) 。最后,A 再响应 B 的查问,用共享的密钥 \(K_{AB}\) 对 \(R_{B}\) 加密后发回给 B。这里很重要的一点是 A 和 B 对不同的会话必须使用不同的不重数集。由于不重数不能重复使用,所以 C 在进行重放攻击时无法重复使用所截获的不重数。
在使用公钥密码体制时,可以对不重数进行签名鉴别。例如在图 7-11 中,B 用其私钥对不重数 \(R_{\mathrm{A}}\) 进行签名后发回给 A。A 用 B 的公钥核实签名,如能得出自己原来发送的不重数 \(R_{\mathrm{A}}\) ,就核实了和自己通信的对方的确是 B。同样,A 也用自己的私钥对不重数 \(R_{\mathrm{B}}\) 进行签名后发送给 B。B 用 A 的公钥核实签名,鉴别了 A 的身份。
公钥密码体制虽然不必在互相通信的用户之间秘密地分配共享密钥,但仍有受到攻击的可能。让我们看下面的例子。
C 冒充是 A,发送报文给 B,说:“我是 A”。
B 选择一个不重数 \(R_{B}\) ,发送给 A,但被 C 截获了。
C 用自己的私钥 \(SK_{C}\) 冒充是 A 的私钥,对 \(R_{B}\) 加密,并发送给 B。
B 向 A 发送报文,要求对方把解密用的公钥发送过来,但这报文也被 C 截获了。
C 把自己的公钥 \(PK_{C}\) 冒充是 A 的公钥发送给 B。
B 用收到的公钥 \(PK_{C}\) 对收到的加密的 \(R_{B}\) 进行解密,其结果当然正确。于是 B 相信通信的对方是 A,接着就向 A 发送许多敏感数据,但都被 C 截获了。
然而上述这种欺骗手段不够高明,因为 B 只要打电话询问一下 A 就能戳穿骗局,因为 A 根本没有和 B 进行通信。但下面的 “中间人攻击”(man-in-the-middle attack)就更加具有欺骗性。图 7-12 是 “中间人攻击” 的示意图。

从图 7-12 可看出,A 想和 B 通信,向 B 发送 “我是 A” 的报文,并给出了自己的身份。这个报文被 “中间人” C 截获,C 把这个报文原封不动地转发给 B。B 选择一个不重数 \(R_{B}\) 发送给 A,但同样被 C 截获后也照样转发给 A。
中间人 C 用自己的私钥 \(SK_{C}\) 对 \(R_{B}\) 加密后发回给 B,使 B 误以为是 A 发来的。A 收到 \(R_{B}\) 后也用自己的私钥 \(SK_{A}\) 对 \(R_{B}\) 加密后发回给 B,但中途被 C 截获并丢弃。B 向 A 索取其公钥,这个报文被 C 截获后转发给 A。
C 把自己的公钥 \(PK_{C}\) 冒充是 A 的公钥发送给 B,而 C 也截获到 A 发送给 B 的公钥 \(PK_{A}\) 。
B 用收到的公钥 \(PK_{C}\) (以为是 A 的)对数据 DATA 加密,并发送给 A。C 截获后用自己的私钥 \(SK_{C}\) 解密,复制一份留下,然后再用 A 的公钥 \(PK_{A}\) 对数据 DATA 加密后发送给 A。
A 收到数据后,用自己的私钥 \(SK_{A}\) 解密,以为和 B 进行了保密通信。其实,B 发送给 A 的加密数据已被中间人 C 截获并解密了一份,但 A 和 B 却都不知道。
由此可见,公钥的分配以及认证公钥的真实性也是一个非常重要的问题。关于这点我们在后面(7.4.2 节)还要讨论。
7.4 密钥分配¶
由于密码算法是公开的,网络的安全性就完全基于密钥的安全保护上。因此在密码学中出现了一个重要的分支 —— 密钥管理。密钥管理包括:密钥的产生、分配、注入、验证和使用。本节只讨论密钥的分配。
密钥分配(或密钥分发)是密钥管理中最大的问题。密钥必须通过最安全的通路进行分配。例如,可以派非常可靠的信使携带密钥分配给互相通信的各用户。这种方法称为网外分配方式。但随着用户的增多和网络流量的增大,密钥更换频繁(密钥必须定期更换才能做到可靠),派信使的办法已不再适用,而应采用网内分配方式,即对密钥自动分配。
7.4.1 对称密钥的分配¶
对称密钥分配存在以下两个问题。
第一,如果 \(n\) 个人中的每一个需要和其他 \(n - 1\) 个人通信,就需要 \(n(n - 1)\) 个密钥。但每两人共享一个密钥,因此密钥数是 \(n(n - 1)/2\) 。这常称为 \(\pmb{n}^2\) 问题。如果 \(n\) 是个很大的数,所需要的密钥数量就非常大。
第二,通信的双方怎样才能安全地得到共享的密钥呢?正是因为网络不安全,所以才需要使用加密技术。但密钥又需要怎样传送呢?
目前常用的密钥分配方式是设立密钥分配中心 KDC (Key Distribution Center)。KDC 是大家都信任的机构,其任务就是给需要进行秘密通信的用户临时分配一个会话密钥(仅使用一次)。在图 7-13 中假定用户 A 和 B 都是 KDC 的登记用户。A 和 B 在 KDC 登记时就已经在 KDC 的服务器上安装了各自和 KDC 进行通信的主密钥 (master key) \(K_{A}\) 和 \(K_{B}\) 。为简单起见,下面在叙述时把 “主密钥” 简称为 “密钥”。密钥分配分为三个步骤(如图 7-13 中带箭头直线上的①, ②和③所示)。

① 用户 A 向密钥分配中心 KDC 发送时用明文,说明想和用户 B 通信。在明文中给出
A 和 B 在 KDC 登记的身份。
② KDC 用随机数产生 “一次一密” 的会话密钥 \(K_{AB}\) 供 A 和 B 的这次会话使用,然后向 A 发送回答报文。这个回答报文用 A 的密钥 \(K_{A}\) 加密。这个报文中包含这次会话使用的密钥 \(K_{AB}\) 和请 A 转给 B 的一个票据 (ticket) \(^{①}\) ,该票据包括 A 和 B 在 KDC 登记的身份,以及这次会话将要使用的密钥 \(K_{AB}\) 。票据用 B 的密钥 \(K_{B}\) 加密,A 无法知道此票据的内容,因为 A 没有 B 的密钥 \(K_{B}\) ,当然 A 也不需要知道此票据的内容。
③ 当 B 收到 A 转来的票据并使用自己的密钥 \(K_{B}\) 解密后,就知道 A 要和他通信,同时也知道 KDC 为这次和 A 通信所分配的会话密钥 \(K_{AB}\) 。
此后,A 和 B 就可使用会话密钥 \(K_{AB}\) 进行这次通信了。
请注意,在网络上传送密钥时,都是经过加密的。解密用的密钥都不在网上传送。
KDC 还可在报文中加入时间戳,以防止报文的截取者利用以前已记录下的报文进行重放攻击。会话密钥 \(K_{AB}\) 是一次性的,因此机密性较高。而 KDC 分配给用户的密钥 \(K_{A}\) 和 \(K_{B}\) ,都应定期更换,以减少攻击者破译密钥的机会。
目前最出名的对称密钥分配协议是 Kerberos V5 \(^{②}\) [RFC 4120, 4121,建议标准],是美国麻省理工学院 (MIT) 开发的。Kerberos 既是鉴别协议,同时也是 KDC,它已经变得很普及。Kerberos 使用比 DES 更加安全的高级加密标准 AES 进行加密。下面用图 7-14 介绍 Kerberos V4 的大致工作过程(其原理和 V5 大体一样,但稍简单些)。

Kerberos 使用两个服务器:鉴别服务器 AS (Authentication Server)、票据授予服务器 TGS (Ticket-Granting Server)。Kerberos 只用于客户与服务器之间的鉴别,而不用于人对人的鉴别。在图 7-14 中,A 是请求服务的客户,而 B 是被请求的服务器。A 通过 Kerberos 向 B 请求服务。Kerberos 需要通过以下六个步骤鉴别的确是 A(而不是其他人冒充 A)向 B 请求服务后,才向 A 和 B 分配会话使用的密钥。下面简单解释各步骤。
① A 用明文(包括登记的身份)向鉴别服务器 AS 表明自己的身份。AS 就是 KDC,它掌握各实体登记的身份和相应的口令。AS 对 A 的身份进行验证。只有验证结果正确,才允许 A 和票据授予服务器 TGS 进行联系。
② 鉴别服务器 AS 向 A 发送用 A 的对称密钥 \(K_{A}\) 加密的报文,这个报文包含 A 和 TGS 通信的会话密钥 \(K_{S}\) 以及 AS 要发送给 TGS 的票据(这个票据是用 TGS 的对称密钥 \(K_{TG}\) 加密的)。A 并不保存密钥 \(K_{A}\) ,但当这个报文到达 A 时,A 就键入其口令。若口令正确,则该口令和适当的算法一起就能生成密钥 \(K_{A}\) 。这个口令随即被销毁。密钥 \(K_{A}\) 用来对 AS 发送过来的报文进行解密。这样就提取出会话密钥 \(K_{S}\) (这是 A 和 TGS 通信要使用的)以及要转发给 TGS 的票据(这是用密钥 \(K_{TG}\) 加密的)。
③ A 向 TGS 发送三项内容:
- 转发鉴别服务器 AS 发来的票据。
- 服务器 B 的名字。这表明 A 请求 B 的服务。请注意,现在 A 向 TGS 证明自己的身份并非通过键入口令(因为入侵者能够从网上截获明文口令),而是通过转发 AS 发出的票据(只有 A 才能提取出)。票据是加密的,入侵者伪造不了。
- 用 \(K_{\mathrm{S}}\) 加密的时间戳 \(T\) 。它用来防止入侵者的重放攻击。
④ TGS 发送两个票据,每一个都包含 A 和 B 通信的会话密钥 \(K_{\mathrm{AB}}\) 。给 A 的票据用 \(K_{\mathrm{S}}\) 加密;给 B 的票据用 B 的密钥 \(K_{\mathrm{B}}\) 加密。请注意,现在入侵者不能提取 \(K_{\mathrm{AB}}\) ,因为不知道 \(K_{\mathrm{S}}\) 和 \(K_{\mathrm{B}}\) 。入侵者也不能重放步骤③,因为入侵者不能把时间戳更换为一个新的(因为不知道 \(K_{\mathrm{S}}\) )。如果入侵者在时间戳到期之前,非常迅速地发送步骤③的报文,那么对 TGS 发送过来的两个票据仍然不能解密。
⑤ A 向 B 转发 TGS 发来的票据,同时发送用 \(K_{AB}\) 加密的时间戳 T。
⑥ B 把时间戳 T 加 1 来证实收到了票据。B 向 A 发送的报文用密钥 \(K_{AB}\) 加密。
以后,A 和 B 就使用 TGS 给出的会话密钥 \(K_{AB}\) 进行通信。
顺便指出,Kerberos 要求所有使用 Kerberos 的主机必须在时钟上进行 “松散的” 同步。所谓 “松散的” 同步是要求所有主机的时钟误差不能太大,例如,不能超过 5 分钟的数量级。这个要求是为了防止重放攻击。TGS 发出的票据都设置较短的有效期。超过有效期的票据就作废了。因此入侵者即使截获了某个票据,也不能长期保留用来进行以后的重放攻击。
7.4.2 公钥的分配¶
在公钥密码体制中,公钥的分配方法并不简单。本节就讨论这个问题。
我们不妨先假定大家都各自保存有自己的私钥,而把各自的公钥发布在网上。假定 A 和 B 都是公司。有个捣乱者给 A 发送邮件,声称自己是 B,要购买 A 生产的设备,货到付款,并给出了 B 的收货地址。邮件中还附上 “B 的公钥”(其实是捣乱者的公钥)。最后用捣乱者的私钥对邮件进行了签名。A 收到邮件后,就用邮件中给出的捣乱者的公钥(A 以为自己使用了 B 的公钥),对邮件中的签名进行了鉴别,就误认为 B 真的是要购买设备。当 A 把生产的设备运到 B 的地址后,B 才知道被愚弄了!捣乱者甚至还可伪造一个冒充 B 的网站,上面有 “B 的公钥”(其实是捣乱者的公钥)。
那么,有没有可靠的方法来获得 B 的公钥,并且能确信公钥是真的?
有一种非常可靠的方法,就是公司 A 派人亲自去公司 B,直接向公司 B 索要其公钥。这样拿到的 B 的公钥当然是可信任的。但这种很不方便的办法显然不能普遍推广使用。
现在流行的办法,这就是找一个可信任的第三方机构(第三方机构既不是需要 B 的公钥的公司 A,也不是拥有公钥的公司 B),给拥有公钥的实体发一个具有数字签名的数字证书 (digital certificate),有时也可简称为证书。数字证书就是对公钥与其对应的实体(人或机器)进行绑定 (binding) 一个证明。因此它常称为公钥证书。这种签发证书的机构就叫作认证中心 CA (Certification Authority),它由政府或知名公司出资建立(这样就可以得到大家的信任)。每个证书中写有公钥及其拥有者的标识信息(人名、地址、电子邮件地址或 IP 地址等)。更重要的是,证书中有 CA 使用自己私钥的数字签名,这就是认证中心 CA 把 B 的未签名的证书进行散列函数运算,再用 CA 的私钥对散列值进行 D 运算(也就是对散列值进行签名)。这样就得到了 CA 的数字签名。把 CA 的数字签名和未签名的 B 的证书放在一起,就最后构成了已签名的 B 的数字证书(如图 7-15 所示)。图中的数字证书只给出了最重要的几个项目。这样的证书无法伪造。任何用户都可从可信任的地方(如代表政府的报纸)获得认证中心 CA 的公钥,以验证证书的真伪。这种数字证书是公开的,不需要加密。现在我国的认证中心已有不少,例如,在金融领域,中国金融认证中心 CFCA (China Financial Certification Authority) 是由中国人民银行牵头,联合 14 家全国性商业银行共同建立的金融认证机构,其权威性是毋庸置疑的。在国际上,威瑞信公司 VeriSign 是发行数字证书产品的一家具有权威性的公司。

公司 A 拿到 B 的数字证书后,可以对 B 的数字证书的真实性进行核实。A 使用数字证书上给出的 CA 的公钥,对数字证书中 CA 的数字签名进行 E 运算,得出一个数值。再对 B 的数字证书(把 CA 的数字签名除外的部分)进行散列运算,又得出一个数值。比较这两个数值。若一致,则数字证书是真的。当 A 收到包含有 B 的数字签名的订货单时,也能用类似的方法,对订单的真实性进行核实(使用 B 的数字证书中给出的 B 的公钥)。
为了使 CA 发布的数字证书在各行各业中能够通用,数字证书的格式就必须标准化。为此,ITU-T 制定了 X.509 协议标准,后来 IETF 采用了现在的版本,即 X.509 V3 [RFC 5280],作为互联网的建议标准(147 页)。X.509 又称为互联网公钥基础结构 PKI (Public Key Infrastructure)。
X.509 规定了一个数字证书必须包括以下这些重要字段:
X.509 的版本
- 数字证书名称及序列号
- 公钥(数字证书拥有者的公钥和使用算法的标识符,对应的私钥由证书拥有者保存)
X.509 提出把多级认证中心链接起来的,构成一个树状的认证系统(如图 7-16 (a) 所示)。在多级认证系统的末端就是用户(A \~ E)。在 X.509 中并没有规定这种链接需要多少级,也没有给每一级的认证中心规定统一的名称。但最高一级的认证中心都称为根认证中心 (Root CA),即公认可信的认证中心(或无条件信任的),且其公钥是公开的。在这种树状的认证系统中,可以有不止一个根 CA。从根 CA 向下的所有链接都称为信任链,表示处在这条链接上的认证机构都是可信的。

图 7-16 (a) 最右边的一串链接就是一条信任链的例子:根 CA→中间 CA₂→用户 E。与这条信任链对应的是证书链(如图 7-16 (b) 所示),通过图中所示的链接,就可以查到本证书的签发者,也可以知道用谁的公钥来验证本证书中的签名。在这条证书链中,根 CA 给中间 CA₂ 签发了中间证书,并使用根 CA 的私钥进行数字签名。中间 CA₂ 可以用根 CA 的公钥,对证书中的根 CA 签名进行验证。因此中间证书是可信的和不可篡改的。同理,中间 CA₂ 给下面的一个用户签发了用户证书,并使用中间 CA₂ 的私钥进行数字签名。用户可以用中间 CA₂ 的公钥,对用户证书中的中间 CA₂ 的签名进行验证。因此,这个用户证书也是可信的和不可篡改的。请注意,最顶层的根证书的数字签名是自签名(即自己的私钥给自己签名)。根证书不需要其他的认证机构对其签名,是我们的信任链的起点。
若证书链中的某个认证中心没有严格遵守证书所规定的要求(例如,把证书转让给了其他单位,但并未严格验证其身份),那么这个节点以下的证书是否还可信,就应重新验证。用户若发现私钥被盗或遗失,应及时报告上级 CA,以便撤销证书。每一个 CA 应当有一个公布于众的、用本 CA 的私钥签名证书撤销名单,并定期更新。
7.5 互联网使用的安全协议¶
前面几节所讨论的网络安全原理都可用在互联网中,目前在网络层、运输层和应用层都有相应的网络安全协议。下面分别介绍这些协议的要点。
7.5.1 网络层安全协议¶
1. IPsec 协议族概述¶
我们在第 4 章的 4.8.1 节中讨论虚拟专用网 VPN 时,提到在 VPN 中传送的信息都是经过加密的。现在我们就要介绍提供这种加密服务的 IPsec。
IPsec 并不是单一的协议,而是能够在 IP 层提供互联网通信安全的协议族(不太严格的名词 “IPsec 协议” 也常见到)。实际上,IPsec 包含了一个通用框架和若干加密算法,具有相当的灵活性和可扩展性。IPsec 允许通信双方从中选择合适的算法和参数(例如,密钥长度),以及是否使用鉴别。为保证互操作性,IPsec 规定其所有的实现都必须包含 IPsec 所推荐的全部加密算法。
IPsec 就是 “IP 安全 (security)” 的缩写。在很多 RFC 文档中已给出了详细的描述。在这些文档中,最重要的就是描述 IP 安全体系结构的 RFC 4301(目前是建议标准)和提供 IPsec 协议族概述的 RFC 6071。
IPsec 协议族中的协议可划分为以下三个部分:
(1) IP 安全数据报格式的两个协议:鉴别首部 AH (Authentication Header) 协议和封装安全有效载荷 ESP (Encapsulation Security Payload) 协议。
(2) 有关加密算法的三个协议。
(3) 互联网密钥交换 IKE (Internet Key Exchange) 协议。
下面我们要重点介绍 IP 安全数据报的格式,以便了解 IPsec 怎样提供网络层的安全通信。AH 协议提供源点鉴别和数据完整性,但不能保密。而 ESP 协议比 AH 协议复杂得多,它提供源点鉴别、数据完整性和保密。IPsec 支持 IPv4 和 IPv6。在 IPv6 中,AH 和 ESP 都是扩展首部的一部分。AH 协议的功能都已包含在 ESP 协议中,因此使用 ESP 协议就可以不使用 AH 协议。下面我们将不再讨论 AH 协议,而只介绍 ESP 协议的要点。
使用 ESP 或 AH 协议的 IP 数据报称为 IP 安全数据报(或 IPsec 数据报),它可以在两台主机之间、两个路由器之间或一台主机和一个路由器之间发送。
IP 安全数据报有以下两种不同的工作方式。
第一种工作方式是运输方式 (transport mode)。运输方式是在整个运输层报文段的前后分别添加若干控制信息,再加上 IP 首部,构成 IP 安全数据报(见图 7-17 (a))。


第二种工作方式是隧道方式 (tunnel mode)。隧道方式是在原始的 IP 数据报的前后分别添加若干控制信息,再加上新的 IP 首部,构成一个 IP 安全数据报(见图 7-17 (b))。
无论使用哪种方式,最后得出的 IP 安全数据报的 IP 首部都是不加密的。只有使用不加密的 IP 首部,互联网中的各个路由器才能识别 IP 首部中的有关信息,把 IP 安全数据报在不安全的互联网中进行转发,从源点安全地转发到终点。所谓 “安全数据报” 是指数据报的数据部分是经过加密的,并能够被鉴别的。通常把数据报的数据部分称为数据报的有效载荷 (payload)。
由于目前使用最多的就是隧道方式,因此下面的讨论只限于隧道方式。
2. 安全关联¶
在发送 IP 安全数据报之前,在源实体和目的实体之间必须创建一条网络层的逻辑连接,即安全关联 SA (Security Association)。这样,传统的互联网中无连接的网络层就变为了具有逻辑连接的一个层。安全关联是从源点到终点的单向连接,它能够提供安全服务。如要进行双向安全通信,则两个方向都需要建立安全关联。假定某公司有一个公司总部和一个在外地的分公司。总部需要和这个分公司以及在各地出差的 n 个员工进行双向安全通信。在这种情况下,一共需要创建 \((2 + 2n)\) 条安全关联 SA。在这些安全关联 SA 上传送的就是 IP 安全数据报。
图 7-18 (a) 是安全关联 SA 的示意图。公司总部和分公司都各有一个负责收发 IP 数据报的路由器 \(R_{1}\) 和 \(R_{2}\) (通常就是公司总部和分公司的防火墙中的路由器),而公司总部与分公司之间的安全关联 SA 就是在路由器 \(R_{1}\) 和 \(R_{2}\) 之间建立的。当然,路由器 \(R_{1}\) 和 \(R_{2}\) 都必须预先装有 IPsec。现假定公司总部的主机 \(H_{1}\) 要和分公司的主机 \(H_{2}\) 通过互联网进行安全通信。
公司总部主机 \(H_{1}\) 发送给分公司主机 \(H_{2}\) 的 IP 数据报,必须先经过公司总部的路由器 \(R_{1}\) 。然后经 IPsec 的加密处理后,成为 IP 安全数据报。这样就把原始的 IP 数据报隐藏在 IP 安全数据报中了。IP 安全数据报经过互联网中很多路由器的转发,最后到达分公司的路由器 \(R_{2}\) 。路由器 \(R_{2}\) 对 IP 安全数据报解密,还原出原始的数据报,传送到终点主机 \(H_{2}\) 。从逻辑上看,IP 安全数据报在安全关联 SA 上传送,就好像通过一个安全的隧道。这就是 “隧道方式” 这一名词的来源。如果总部的主机 \(H_{1}\) 要和总部的另一台主机 \(H_{3}\) 通信,由于都在公司内部,不需要加密,因此不需要建立安全关联。 \(H_{1}\) 发出的 IP 数据报只需通过总部内部的路由器 \(R_{1}\) 转发一次即可送到 \(H_{3}\) 。如果 \(H_{1}\) 要上网查看天气预报,同样不需要建立安全关联,而是发送 IP 数据报,经过路由器 \(R_{1}\) 转发到互联网中的下一个路由器,最后到达互联网中预报气象的服务器。


若公司总部的主机 \(H_{1}\) 要和某外地业务员的便携机 \(H_{2}\) 进行安全通信,则情况将稍有不同(如图 7-18 (b) 所示)。可以看出,这时公司总部的路由器 \(R_{1}\) 和外地业务员的便携机 \(H_{2}\) 建立安全关联 SA(即路由器和主机之间的安全关联)。公司总部 \(H_{1}\) 发送的 IP 数据报,通过路由器 \(R_{1}\) 后,就变成了 IP 安全数据报。经过互联网中许多路由器的转发,最后到达 \(H_{2}\) 。可以看出,现在是在路由器 \(R_{1}\) 和业务员的便携机 \(H_{2}\) 之间构成了一个安全隧道。外地业务员利用事先安装在便携机 \(H_{2}\) 中的 IPsec 对 IP 安全数据报进行鉴别和解密,还原 \(H_{1}\) 发来的 IP 数据报。
建立安全关联 SA 的路由器或主机,必须维护这条 SA 的状态信息。我们以图 7-18 中的安全关联 SA 为例,说明其状态信息应包括的项目:
当路由器 \(R_{1}\) 要通过 SA 发送 IP 安全数据报时,就必须读取 SA 的这些状态信息,以便知道如何把 IP 数据报进行加密和鉴别。
3. IP 安全数据报的格式¶
图 7-19 是 IP 安全数据报的格式。下面以隧道方式为例,结合各字段的作用,讨论一下 IP 安全数据报是怎样构成的。图中的数字①至⑥表示 IP 安全数据报构成的先后顺序。

① 首先在原始的 IP 数据报(也就是 ESP 的有效载荷)后面添加 ESP 尾部。ESP 尾部有三个字段。第一个字段是填充字段,用全 0 填充。第二个字段是填充长度(8 位),指出填充字段的字节数。为什么要进行填充呢?这是因为在进行数据加密时,通常都要求数据块长度是若干字节(例如,4 字节)的整数倍。当 IP 数据报长度不满足此条件时,就必须用 0 进行填充。每个 0 为一个字节长。虽然填充长度(8 位)的最大值是 255,但实际上,填充很少会用到这个最大值。ESP 尾部最后一个字段是 “下一个首部”(8 位)。这个字段的值指明,在接收端,ESP 的有效载荷应交给哪个协议来处理。如图 7-19 所示,IP 安全数据报有三个首部。现在 ESP 尾部中的 “下一个首部” 显然就是指 ESP 的有效载荷中的 “原始的 IP 首部”,IP 的协议值是 4,因此 “下一个首部” 应填入的数值是 4。如果不是隧道方式而是运输方式,则 “ESP 的有效载荷” 就应当是 TCP 或 UDP 报文段,“下一个首部” 的值也要改为另外的数值。
当分公司的路由器 \(R_{2}\) 收到 IP 安全数据报后,先检查首部中的目的地址。发现目的地址就是 \(R_{2}\) ,于是路由器 \(R_{2}\) 就继续处理这个 IP 安全数据报。
路由器 \(R_{2}\) 找到 IP 首部的协议字段值(现在是 50),就把 IP 首部后面的所有字段(即 IP 安全数据报的有效载荷)都用 ESP 协议进行处理。先检查 ESP 首部中的安全参数索引 SPI,以确定收到的数据报属于哪一个安全关联 SA(因为路由器 \(R_{2}\) 可能有多个安全关联)。路由器 \(R_{2}\) 接着计算报文鉴别码 MAC,看是否和 ESP 尾部后面添加的报文鉴别码 MAC 相符。如是,即知收到的数据报的确是来自路由器 \(R_{1}\) 。再检验 ESP 首部中的序号,以证实有无被入侵者重放。接着要用和这个安全关联 SA 对应的加密算法和密钥,对已加密的部分进行解密。再根据 ESP 尾部中的填充长度,去除发送端填充的所有 0,还原出加密前的 ESP 有效载荷,也就是 \(H_{1}\) 发送的原始 IP 数据报。
根据解密后得到的 ESP 尾部中 “下一个首部” 的值(现在是 4),把 ESP 的有效载荷交给 IP 来处理。当找到原始的 IP 首部中的目的地址是主机 \(H_{2}\) 的 IP 地址时,就把整个的 IP 数据报传送给主机 \(H_{2}\) 。整个 IP 数据报的传送过程到此结束。
请注意,在图 7-19 的 “原始的 IP 首部” 中,是用主机 \(H_{1}\) 和 \(H_{2}\) 的 IP 地址分别作为源地址和目的地址,而在 IP 安全数据报的 “新的 IP 首部” 中,是使用路由器 \(R_{1}\) 和 \(R_{2}\) 的 IP 地址分别作为源地址和目的地址(这是图 7-18 (a) 所示的情况)。但如果是图 7-18 (b) 所示的情况,IP 安全数据报不经过另一个路由器 \(R_{2}\) ,那么在 IP 安全数据报的 “新的 IP 首部” 中,要用路由器 \(R_{1}\) 和主机 \(H_{2}\) 的 IP 地址分别作为 IP 安全数据报的源地址和目的地址。
从以上的讨论可以看出,设想有一个 IP 安全数据报在互联网中被某人截获,如果截获者不知道此安全数据报的密码,那么他只能知道这是一个从路由器 \(R_{1}\) 发往路由器 \(R_{2}\) 的 IP 数据报,但却无法看懂其有效载荷中的数据含义。如果截获者篡改了数据报的源地址,那么安全数据报的鉴别功能可以保证源地址的真实性。假定截获者故意删除了安全数据报中的一些字节,但由于接收端的路由器 \(R_{2}\) 能够进行完整性检验,就不会接收这种含有差错的信息。
如果截获者试图进行重放攻击,那么由于安全数据报使用了有效的序号,使得重放攻击也无法得逞。
4. IPsec 的其他构件¶
前面已经提到过,发送 IP 安全数据报的实体可能要用到很多条安全关联 SA。那么这些 SA 存放在什么地方呢?这就要提及 IPsec 的一个重要构件,叫作安全关联数据库 SAD (Security Association Database)。所有需要运行 IPsec 的站点都必须有 SAD。当主机要发送 IP 安全数据报时,就要在 SAD 中查找相应的 SA,以便获得必要的信息,来对该 IP 安全数据报实施安全保护。同样,当主机要接收 IP 安全数据报时,也要在 SAD 中查找相应的 SA,以便获得信息来检查该分组的安全性。
前面已经提到了,主机所发送的数据报并非都必须进行加密,很多信息使用普通的数据报用明文发送即可。因此,除了安全关联数据库 SAD,还需要另一个数据库,这就是安全策略数据库 SPD (Security Policy Database)。SPD 指明什么样的数据报需要进行 IPsec 处理。这取决于源地址、源端口、目的地址、目的端口,以及协议的类型等。因此,当一个 IP 数据报到达时,SPD 指出应当做什么(使用 IP 安全数据报还是不使用),而 SAD 则指出,如果需要使用 IP 安全数据报,应当怎样做(使用哪一个 SA)。
还有一个问题,安全关联数据库 SAD 中存放的许多安全关联 SA 是怎样建立起来的呢?如果一个虚拟专用网 VPN 只有几个路由器和主机,那么用人工键入的方法就可以建立起所需的安全关联数据库 SAD。但如果一个 VPN 有好几百或几千个路由器和主机,人工键入的方法显然是不行的。因此,对于大型的、地理位置分散的系统,为了创建 SAD,我们需要使用自动生成的机制,即使用互联网密钥交换 IKE (Internet Key Exchange) 协议。IKE 的用途就是为 IP 安全数据报创建安全关联 SA。
IKE 是个非常复杂的协议,IKEv2 是其新的版本,在 2014 年 10 月已成为互联网的正式标准 [RFC 7296, STD79]。IKEv2 以另外三个协议为基础:
关于 IKE 的深入介绍可参阅有关文档,如 RFC 4945 和 RFC 7427(都是建议标准)。
7.5.2 运输层安全协议¶
1. 协议 TLS 的要点¶
当万维网能够提供网上购物时,安全问题就马上被提到桌面上来了。例如,当顾客在不安全的互联网上购物时,他会要求得到下列安全服务:
应保证通信内容的数据完整性。
(3) 顾客与销售商需要确保诸如信用卡上的敏感信息不被泄露。这就是要有机密性。
不仅在电子商务领域,即使在我们日常上网浏览各种信息时,我们所浏览的信息也是属于个人隐私,不应作为网上的公开信息。因此,在很多情况下,客户端(浏览器)与服务器之间的通信需要使用安全的运输层协议。曾经广泛使用的运输层安全协议有两个,即:(1) 安全套接字层 SSL (Secure Socket Layer)。(2) 运输层安全 TLS (Transport Layer Security)。
协议 SSL 是 Netscape 公司在 1994 年开发的安全协议,广泛应用于基于万维网的各种网络应用(但不限于万维网应用)。SSL 作用在端系统应用层的 HTTP 和运输层之间,在 TCP 之上建立起一个安全通道,为通过 TCP 传输的应用层数据提供安全保障。
1995 年 Netscape 公司把协议 SSL 转交给 IETF,希望能够把 SSL 进行标准化。1999 年 IETF 在 SSL 3.0 的基础上设计了协议 TLS 1.0(改动极少),为所有基于 TCP 的网络应用提供安全数据传输服务。为了应对网络安全的变化,IETF 及时地对 TLS 的版本进行升级,如 2006 年的 TLS 1.1,2008 年的 TLS 1.2。2014 年 10 月,谷歌建议禁用 SSL 3.0,因为其设计上有漏洞,用户的敏感信息有被窃取的可能。接着,Mozilla 和微软也发出了同样的安全通告。2018 年 8 月 IETF 发布了经历了 28 个草案后才通过的最新版本 TLS 1.3 [RFC 8446,建议标准](不向后兼容)。在 2020 年,旧版本 TLS 1.0/1.1 均被废弃。目前谷歌浏览器 Chrome 和火狐浏览器 Firefox 都已开始使用更加安全的协议 TLS 1.3,但不少老客户端仍未抛弃一些旧版本。应当说,到目前为止协议 TLS 1.2 还是安全可用的,只是被发现了有潜在的安全隐患。因此,现在能够使用的运输层安全协议就只剩下协议 TLS 1.2 和协议 TLS 1.3 了。
协议 TLS 的位置在运输层和应用层之间(如图 7-20 所示)。虽然协议 SSL 2.0/3.0 均已被废弃不用了,但现在还经常能够看到把 “SSL/TLS” 视为 TLS 的同义词。这是因为协议 TLS 本来就源于 SSL(但并不兼容),而现在旧协议 SSL 被更新为新协议 TLS。
图 7-20 协议 TLS 位于运输层和应用层之间
| 应用程序 |
| TLS(或 SSL/TLS) |
| TCP |
| IP |
应用层使用协议 TLS 最多的就是 HTTP,但并非仅限于 HTTP。因为协议 TLS 是对 TCP 加密,因此任何在 TCP 之上运行的应用程序都可以使用协议 TLS。例如,用于 IMAP 邮件存取的鉴别和数据加密也可以使用 TLS。TLS 提供了一个简单的带有套接字的应用程序接口 API,这和 TCP 的 API 是相似的。
当不需要运输层安全协议时,HTTP 就直接使用 TCP 连接,这时协议 TLS 不起作用。由于需要使用运输层安全协议的人越来越多,因此现在相当多的网站已是全站使用运输层安全协议。例如,当我们使用百度网站浏览信息时,在浏览器的地址栏键入其官网地址 www.baidu.com 后(不必在前面键入 http:// 或 https://),就可以在屏幕上看到这样的响应:
https://www.baidu.com¶
可以看出,尽管用户在浏览器上没有键入 https://,但百度网站总是提供安全的运输层服务。提供安全运输层服务的标志是地址栏 URL 中的协议部分显示出的是 https,并且在其左边还有一个安全锁 🔒 的标志。在 http 后面加上的 s 代表 security,表明是使用 HTTPS,即提供安全服务的 HTTP 协议(TCP 的 HTTPS 端口号是 443,而不是 HTTP 使用的端口号 80)。这时我们就可以放心和这样的网站进行通信,因为这个网站已经被鉴别了是真正的百度网站,并且之后在浏览器和百度服务器之间的所有交互报文都是加密的,因而通信的机密性得到了保证。
现在我们使用某些主流浏览器访问不安全的网站时,浏览器会向用户发出 “不安全” 的警告。下面给出当我们键入桔梗网的网址 shu.jiegeng.com 后所看到的响应:
谷歌 Chrome 浏览器指出 “不安全”
① 不安全 | shu.jiegeng.com
火狐 Firefox 浏览器提示无安全锁
shu.jiegeng.com
这就提醒我们在上网时要注意信息的安全。
协议 TLS 具有双向鉴别的功能。但大多数情况下使用的是单向鉴别,即客户端(浏览器)需要鉴别服务器。也就是说,浏览器 A 要确信即将访问的网站服务器 B 是安全和可信的。这必须要有两个前提。首先,服务器 B 必须能够证明本身是安全和可信的。因此服务器 B 需要有一个证书来证明自己。现在我们假定服务器 B 已经持有了有效的 CA 证书。这正是运输层安全协议 TLS 的基石。其次,浏览器 A 应具有一些手段来证明服务器 B 是安全和可信的。下面就来讨论这一点。
生产电脑操作系统的厂商为了方便用户,把当前获得公众信任的许多主流认证中心 CA 的根证书,都已内置在其操作系统中。这些根证书上都有认证中心 CA 的公钥 \(PK_{CA}\) ,而且根证书都用 CA 的私钥 \(SK_{CA}\) 进行了自签名(防止伪造)。用户为了验证要访问的服务器是否安全和可信,只要打开电脑中的浏览器(操作系统自带的或用户自己装上的),就可查到操作系统收藏的某个根认证中心的根 CA 证书,并可以利用证书上的公钥 \(PK_{CA}\) 对 B 的证书进行验证。若服务器 B 的证书是证书链上的某个中间 CA 签发的,那么浏览器 A 也可用类似方法验证 B 的证书的真实性。
由于浏览器与服务器的通信方式就是以前讲过的 “客户 - 服务器方式”,因此下面就用客户代表浏览器。
如图 7-21 所示,在客户与服务器双方已经建立了 TCP 连接后,就可开始执行协议 TLS。根据 RFC 8446,这里主要有两个阶段,即握手阶段和会话阶段。在握手阶段,TLS 使用其中的握手协议,而在会话阶段,TLS 使用其中的记录协议。下面讨论协议 TLS 的要点。

我们先介绍协议 TLS 的握手阶段。握手阶段要验证服务器是安全可信的,同时生成在后面的会话阶段所需的共享密钥,以保证双方交换的数据的私密性和完整性。这里要提醒读者,在刚开始执行协议 TLS 时,通信双方的信道是不安全的。因此要弄清:(1) 双方怎样通过不安全的信道得到会话时所需的共享密钥。这里没有采用密钥分发中心 KDC 来分配密钥,而是采用自己生成共享密钥的方法。(2) 用什么方法保证所传送数据的机密性与完整性。
(1) 协商加密算法 ①客户 A 向服务器 B 发送自己选定的加密算法(包括密钥交换算法)。②服务器 B 从中确认自己所支持的算法,同时把自己的 CA 数字证书发送给 A。这里要说明一下,从 TLS 1.0 更新到 1.1 和 1.2 版本时,每一次更新都增加了当时认为是更加安全可靠的加密算法。为了协议的向后兼容,对老版本中的不太安全的数十种算法也都保留下来了。这就造成协商过程非常耗时,需要花费 2 倍 RTT 的时间(通常记为 2-RTT)。因此最新的 TLS 1.3 版本把陈旧的很多种算法统统取消(例如 MD5, SHA-1, DES, 3DES 等),只留下几种最安全的算法。客户不是把自己所有的加密算法都告诉服务器,供服务器来挑选,而是猜测服务器可能愿意使用什么加密算法,把自己选定的加密算法直接发送给服务器,让服务器来确认。这就把 “协商” 时间缩短为 1-RTT。
(2) 服务器鉴别 ③客户 A 用数字证书中 CA 的公钥对数字证书进行验证鉴别。
(3) 生成主密钥 ④ 客户 A 按照双方确定的密钥交换算法生成主密钥 MS (Master Secret)。⑤ 客户 A 用 B 的公钥 PK \(_{B}\) 对主密钥 MS 加密,得出加密的主密钥 PK \(_{B}\) (MS),发送给服务器 B。请注意,在有关 TLS 的文档中,密钥一词使用的是 Secret,而不是 Key。
(4) 服务器 B 用自己的私钥把主密钥解密出来: \(\mathrm{SK}_{\mathrm{B}}(\mathrm{PK}_{\mathrm{B}}(\mathrm{MS})) = \mathrm{MS}\) 。这样,客户 A 和服务器 B 都拥有了为后面的数据传输使用的共同的主密钥 MS。
(5) 为了使双方的通信更加安全,客户 A 和服务器 B 最好使用不同的密钥。于是主密钥被分割成 4 个不同的密钥,这就是图 7-21 中的⑦和⑧: 生成会话密钥。在这以后,每一方都拥有这样 4 个密钥 (请注意,这些都是对称密钥,即加密和解密用的是同一个密钥):
会话密钥不使用非对称密钥,因为对称密钥的运行速度快得多(相差 3 个数量级)。
下面讨论协议 TLS 的会话阶段。会话阶段要保证传送数据的机密性和完整性。
客户或服务器在发送数据时,都把长的数据划分为较小的数据块,叫作记录 (record)。然后对每一个记录进行鉴别运算和加密运算。为了防止入侵者截取传输中的记录,或颠倒记录的前后顺序,TLS 的记录协议对每一个记录按发送顺序赋予序号,把每一方发送的第一个记录作为 0 号记录。发送下一个记录时序号就加 1,但序号最大值不得超过 \(2^{64} - 1\) ,且不允许序号绕回。然而此序号并非写在记录之中,而是在进行散列运算时,把序号包含进去。例如,当客户 A 向服务器 B 发送一个明文记录时,客户 A 先把 MAC 密钥 \(M_A\) 和该记录当前的序号一起拼接在此明文记录之后,然后进行散列运算,得出 MAC。再把得出的 MAC 和明文记录拼接起来,用会话密钥 \(K_A\) 进行加密,发送给服务器 B。B 使用同样的会话密钥 \(K_A\) 进行解密,然后分离出明文记录和 MAC。B 再把同样的 MAC 密钥 \(M_A\) 和该记录应有的序号拼接在此明文记录之后,进行散列运算,看得出的结果与前面得出的 MAC 值是否一致,以鉴别收到的明文记录的完整性(内容和顺序均无误)。上述对记录加密的方法称为 AEAD (Authenticated Encryption with Associated Data), 即带关联数据的鉴别加密。
实际上,客户 A 所发送的加密的记录的前面,还必须添加三个不加密的字段,图 7-22 给出了这三个字段的位置。类型字段指明所传送的记录出握手阶段的报文,还是应用程序传送的报文,或最后要关闭 TLS 连接的报文(下一小节将要解释)。长度字段给出的字节数可用来从 TCP 报文中提取 TLS 记录。

2. 协议 TLS 必须包含的措施¶
以上介绍的只是协议 TLS 的要点。但若仅仅是这样,还不能提供足够的安全。因此,对前面图 7-21 所示的双方的握手阶段,需要补充一些措施。
上述最后的 (4) 和 (5) 的作用是这样的。在 A 向 B 发送加密的预主密钥之前的握手信息是没有加密的明文,因此可能受到入侵者的篡改。现在 A 和 B 都各自对全部握手阶段的报文计算了散列值 MAC。如果入侵者篡改了处在传输过程中的某个报文,那么上面 (4) 和 (5) 所得出的 MAC 值必然不一致。这样 A 或 B 就可以立即中止当前的连接。
在 (1) 中客户和服务器各产生一个仅使用一次的不重数,其目的是为了防止 “重放攻击”。设想在 A 和 B 之间有一个入侵者,他截获了 A 和 B 交互的全部报文。虽然他未能解密 A 和 B 交互的具体内容,但他可以在以后的某日,重新按照原来的顺序依次发送给 B。如果没有使用上述的不重数,那么 B 无法发现这是入侵者重放旧的报文。B 也将和前次的握手过程一样,向 A 发回报文(实际上是发给了中间人入侵者)。这样造成的后果是很严重的。但使用了不重数以后,在下一个 TCP 连接中,客户 A 必须使用另一个不同的不重数。这样就有效地防止了重放攻击。
前面曾提到在关闭 TLS 连接之前,A 或 B 应当先发送关闭 TLS 的记录,目的是防止入侵者的截断攻击 (truncation attack)。所谓截断攻击就是在 A 和 B 正在进行会话时,入侵者突然发送 TCP 的 FIN 报文段来关闭 TCP 连接。但如果 A 或 B 没有事先发送一个要关闭 TLS 的记录,那么 A 或 B 见到 TCP 的 FIN 报文段时,就知道这是入侵者的截断攻击了。入侵者无法伪造关闭 TLS 的记录,因为虽然记录前面的三个字段都是明文,但每个记录的内容是加密的,并有 MAC 保证其完整性的。
在 TLS 1.3 中使用了更加安全的椭圆曲线密码 ECC (Elliptic Curve Cryptography) 与 AES,使运算速度比旧的 1.2 版本有了很大的提高。TLS 1.3 还添加了 0-RTT 的功能。这就是说,如果客户之前连接过某服务器,TLS 1.3 通过储存先前会话的秘密信息,不需要经过 1-RTT 的握手过程,仅需 0-RTT 即可开始会话阶段,这样就更加提高了 TLS 的效率。当然,这样做必须要防止可能发生的重放攻击。
7.5.3 应用层安全协议¶
限于篇幅,我们在这一节仅讨论应用层中有关电子邮件的安全协议。
电子邮件在传送过程中可能要经过许多路由器,其中的任何一个路由器都有可能对转发的邮件进行阅读。从这个意义上讲,电子邮件是没有什么隐私可言的。
电子邮件这种网络应用也有其很特殊的地方,这就是发送电子邮件是个即时的行为。这种行为在本质上与我们前两节所讨论的不同。当我们使用 IPSec 或 SSL 时,我们假设双方在相互之间建立起一个会话并双向地交换数据。而在电子邮件中没有会话存在。当 A 向 B 发送一个电子邮件时,A 和 B 并不会为此而建立任何会话。而在此后的某个时间,如果 B 读取了该邮件,他有可能会、也有可能不会回复这个邮件。可见我们所讨论的是单向报文的安全问题。
如果说电子邮件是即时的行为,那么发送方与接收方如何才能就用于电子邮件安全的加密算法达成一致意见呢?如果双方之间不存在会话,不存在协商加密 / 解密所使用的算法,那么接收方如何知道发送方选择了哪种算法呢?
要解决这个问题,电子邮件的安全协议就应当为每种加密操作定义相应的算法,以便用户在其系统中使用。A 必须要把使用的算法的名称(或标识)包含在电子邮件中。例如,A 可以选择用 AES 进行加密 / 解密,并选择用 SHA-1 作为报文摘要算法。当 A 向 B 发送电子邮件时,就在自己的邮件中包含与 AES 和 SHA-1 相对应的标识。B 在接收到该邮件后,首先要提取这些标识,然后就能知道在解密和报文摘要运算时应当分别使用哪种算法了。
加密算法在使用加密密钥时也存在同样的问题。如果没有协商过程,通信的双方如何在彼此之间知道所使用的密钥?目前的电子邮件安全协议要求使用对称密钥算法进行加密和解密,并且这个一次性的密钥要跟随报文一起发送。发信人 A 可以生成一个密钥并把它与报文一起发送给 B。为了保护密钥不被外人截获,这个密钥需要用收信人 B 的公钥进行加密。总之,这个密钥本身也要被加密。
还有一个问题也需要考虑。很显然,要实现电子邮件的安全就必须使用某些公钥算法。例如,我们需要对密钥加密或者对邮件签名。为了对密钥进行加密,发信人 A 就需要收信人 B 的公钥,同样为了验证被签名的报文,收信人 B 也需要发信人 A 的公钥。因此,为了发送一个具有鉴别和保密的报文,就需要用到两个公钥。但是 A 如何才能确认 B 的公钥,B 又如何才能确认 A 的公钥呢?不同的电子邮件安全协议有不同的方法来验证密钥。
下面我们介绍在应用层为电子邮件提供安全服务的协议 PGP。
PGP (Pretty Good Privacy) 是 Zimmermann 于 1995 年开发的。它是一个完整的电子邮件安全软件包,包括加密、鉴别、电子签名和压缩等技术。PGP 并没有使用什么新的概念,它只是把现有的一些加密算法(如 RSA 公钥加密算法或 MD5 报文摘要算法)综合在一起而已。由于包括源程序的整个软件包可以从互联网免费下载 [W-PGP],因此 PGP 在 MS-DOS/Windows 以及 UNIX 等平台上得到了广泛的应用。现在 PGP 的网站以每个月百万页的规模,为一百多个国家的用户提供服务。
后来 PGP 公司与 Zimmermann 同意 IETF 制定 PGP 的公开互联网标准 OpenPGP。2007 年 IETF 发布了 OpenPGP 的建议标准 [RFC 4880]。
PGP 的工作原理并不复杂。它提供电子邮件的安全性、发送方鉴别和报文完整性。
假定 A 向 B 发送电子邮件明文 X,现在用 PGP 进行加密。A 有三个密钥:自己的私钥 \(SK_{A}\) ,B 的公钥 \(PK_{B}\) 和自己生成的一次性密钥 K。B 有两个密钥:自己的私钥 \(SK_{B}\) 和 A 的公钥 \(PK_{A}\) 。
A 需要做以下几件事(如图 7-23 所示)。

请注意,图 7-23 中三个 “加密” 的作用是不同的。第一次加密是用 A 的私钥 \(SK_{A}\) 对明文邮件的报文摘要进行加密,即进行数字签名,目的是保证邮件的完整性。第二次加密是用 A 生成的一次性密钥 K 对已签名的邮件加密,目的是保证邮件的机密性。第三次加密是用 B 的公钥 \(PK_{B}\) 对 A 的一次性密钥 K 加密,目的是保证对称密钥 K 的机密性。
B 收到 A 发过来的报文后要做以下几件事(建议读者自行画出相应的图,这里从略):
在 PGP 中,发件方和收件方是如何获得对方的公钥呢?当然,最安全的办法是双方面对面直接交换公钥,但在大多数情况下这并不现实。因此可以通过认证中心 CA 签发的证书来验证公钥持有者的合法身份。然而在 PGP 中不要求使用 CA,而是允许用一种第三方签署的方式来解决该问题。例如,如果用户 A 和用户 B 分别和第三方 C 已经确认对方拥有的公钥属实,则 \(\mathrm{C}\) 可以用其私钥分别对 \(\mathrm{A}\) 和 \(\mathrm{B}\) 的公钥进行签名,为这两个公钥进行担保。当 \(\mathrm{A}\) 得到一个经 \(\mathrm{C}\) 签名的 \(\mathrm{B}\) 的公钥时,可以用已确认的 \(\mathrm{C}\) 的公钥对 \(\mathrm{B}\) 的公钥进行鉴别。不过,用户发布其公钥的最常见的方式还是把公钥发布在他们的个人网页上,或仅仅通过电子邮件进行分发。
PGP 很难被攻破。因此在目前可以认为 PGP 是足够安全的。
7.6 系统安全:防火墙与入侵检测¶
恶意用户或软件通过网络对计算机系统的入侵或攻击已成为当今计算机安全最严重的威胁之一。用户入侵包括利用系统漏洞进行未授权登录,或者授权用户非法获取更高级别权限。软件入侵方式包括通过网络传播病毒、蠕虫和特洛伊木马。此外还包括阻止合法用户正常使用服务的拒绝服务攻击,等等。而前面讨论的所有安全机制都不能有效解决以上安全问题。例如,加密技术并不能阻止植入了 “特洛伊木马” 的计算机系统通过网络向攻击者泄漏秘密信息。
7.6.1 防火墙¶
防火墙 (firewall) 作为一种访问控制技术,通过严格控制进出网络边界的分组,禁止任何不必要的通信,从而减少潜在入侵的发生,尽可能降低这类安全威胁所带来的安全风险。由于防火墙不可能阻止所有入侵行为,作为系统防御的第二道防线,入侵检测系统 IDS (Intrusion Detection System) 通过对进入网络的分组进行深度分析与检测发现疑似入侵行为的网络活动,并进行报警以便进一步采取相应措施。
防火墙是一种特殊编程的路由器,安装在一个网点和网络的其余部分之间,目的是实施访问控制策略。这个访问控制策略是由使用防火墙的单位自行制定的。这种安全策略应当最适合本单位的需要。图 7-24 指出防火墙位于互联网和内部网络之间。互联网这边是防火墙的外面,而内部网络这边是防火墙的里面。一般都把防火墙里面的网络称为 “可信的网络”(trusted network) \(^{①}\) ,而把防火墙外面的网络称为 “不可信的网络”(untrusted network)。

防火墙技术一般分为以下两类。
(1) 分组过滤路由器是一种具有分组过滤功能的路由器,它根据过滤规则对进出内部网络的分组执行转发或者丢弃(即过滤)。过滤规则是基于分组的网络层或运输层首部的信息,例如:源 / 目的 IP 地址、源 / 目的端口、协议类型(TCP 或 UDP),等等。我们知道,TCP 的端口号指出了在 TCP 上面的应用层服务。例如,端口号 23 是 TELNET,端口号 119 是新闻网 USENET,等等。所以,如果在分组过滤器中将所有目的端口号为 23 的入分组 (incoming packet) 都进行阻拦,那么所有外单位用户就不能使用 TELNET 登录到本单位的主机上。同理,如果某公司不愿意其雇员在上班时花费大量时间去看互联网的 USENET 新闻,就可将目的端口号为 119 的出分组 (outgoing packet) 阻拦住,使其无法发送到互联网。
分组过滤可以是无状态的,即独立地处理每一个分组。也可以是有状态的,即要跟踪每个连接或会话的通信状态,并根据这些状态信息来决定是否转发分组。例如,一个进入到分组过滤路由器的分组,如果其目的端口是某个客户动态分配的,那么该端口显然无法事先包含在规则中。这样的分组被允许通过的唯一条件是:该分组是该端口发出合法请求的一个响应。这样的规则只能通过有状态的检查来实现。
分组过滤路由器的优点是简单高效,且对于用户是透明的,但不能对高层数据进行过滤。例如,不能禁止某个用户对某个特定应用进行某个特定的操作,不能支持应用层用户鉴别等。这些功能需要使用应用网关技术来实现。
(2) 应用网关也称为代理服务器 (proxy server),它在应用层通信中扮演报文中继的角色。一种网络应用需要一个应用网关,例如在上一章 6.4.3 节中 “代理服务器” 介绍过的万维网缓存就是一种万维网应用的代理服务器。在应用网关中,可以实现基于应用层数据的过滤和高层用户鉴别。
所有进出网络的应用程序报文都必须通过应用网关。当某应用客户进程向服务器发送一份请求报文时,先发送给应用网关,应用网关在应用层打开该报文,查看该请求是否合法(可根据应用层用户标识 ID 或其他应用层信息来确定)。如果请求合法,应用网关以客户进程的身份将请求报文转发给原始服务器。如果不合法,报文则被丢弃。例如,一个邮件网关在检查每一个邮件时,会根据邮件地址,或邮件的其他首部,甚至是报文的内容(如,有没有 “导弹”“核弹头” 等关键词)来确定该邮件能否通过防火墙。
应用网关也有一些缺点。首先,每种应用都需要一个不同的应用网关(可以运行在同一台主机上)。其次,在应用层转发和处理报文,处理负担较重。另外,对应用程序不透明,需要在应用程序客户端配置应用网关地址。
通常可将这两种技术结合使用,图 7-24 所画的防火墙就同时具有这两种技术。它包括两个分组过滤路由器和一个应用网关,它们通过两个局域网连接在一起。
7.6.2 入侵检测系统¶
防火墙试图在入侵行为发生之前阻止所有可疑的通信。但事实是不可能阻止所有的入侵行为,有必要采取措施在入侵已经开始,但还没有造成危害或在造成更大危害前,及时检测到入侵,以便尽快阻止入侵,把危害降低到最小。入侵检测系统 IDS 正是这样一种技术。IDS 对进入网络的分组执行深度分组检查,当观察到可疑分组时,向网络管理员发出告警或执行阻断操作(由于 IDS 的 “误报” 率通常较高,多数情况不执行自动阻断)。IDS 能用于检测多种网络攻击,包括网络映射、端口扫描、DoS 攻击、蠕虫和病毒、系统漏洞攻击等。
入侵检测方法一般可以分为基于特征的入侵检测和基于异常的入侵检测两种。
基于特征的 IDS 维护一个所有已知攻击标志性特征的数据库。每个特征是一个与某种入侵活动相关联的规则集,这些规则可能基于单个分组的首部字段值或数据中特定比特串,或者与一系列分组有关。当发现有与某种攻击特征匹配的分组或分组序列时,则认为可能检测到某种入侵行为。这些特征和规则通常由网络安全专家生成,机构的网络管理员定制并将其加入到数据库中。
基于特征的 IDS 只能检测已知攻击,对于未知攻击则束手无策。基于异常的 IDS 通过观察正常运行的网络流量,学习正常流量的统计特性和规律,当检测到网络中流量的某种统计规律不符合正常情况时,则认为可能发生了入侵行为。例如,当攻击者在对内网主机进行 ping 搜索时,或导致 ICMP ping 报文突然大量增加,与正常的统计规律有明显不同。但区分正常流和统计异常流是一件非常困难的事情。至今为止,大多数部署的 IDS 主要是基于特征的,尽管某些 IDS 包括了某些基于异常的特性。
不论采用什么检测技术都存在 “漏报” 和 “误报” 情况。如果 “漏报” 率比较高,则只能检测到少量的入侵,给人以安全的假象。对于特定 IDS,可以通过调整某些阈值来降低 “漏报” 率,但同时会增大 “误报” 率。“误报” 率太大会导致大量虚假警报,网络管理员需要花费大量时间分析报警信息,甚至会因为虚假警报太多而对报警 “视而不见”,使 IDS 形同虚设。
7.7 一些未来的发展方向¶
本章介绍了网络安全的主要概念。网络安全是一个很大的领域,无法在这进行深入的探讨。对于有志于这一领域的读者,可在下面几个方向做进一步的研究:
(1) 椭圆曲线密码 ECC 目前椭圆曲线密码已在 TLS 1.3 的握手协议中占据非常重要的地位。此外,在电子护照和金融系统中也大量使用椭圆曲线密码系统。在互联网上已有许多关于椭圆曲线密码的资料。限于篇幅,无法在本书中进行介绍。
(2) 移动安全 (Mobile Security) 移动通信带来的广泛应用(如移动支付,Mobile Payment)向网络安全提出了更高的要求。
(3) 量子密码 (Quantum Cryptography) 量子计算机的到来将使得目前许多使用中的密码技术无效,后量子密码学 (Post-Quantum Cryptography) 的研究方兴未艾。
(4) 商密九号算法 SM9 为了降低公钥和证书管理的复杂性,早在三十多年前提出的标识密码 (Identity-Based Cryptography),现在又被重视。标识密码把用户的标识(如手机号码)作为公钥,使得安全系统变得易于部署和管理。2008 年标识密码算法正式获得我国密码管理局签发为商密九号算法 SM9。此算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障,其应用前景值得关注。
本章的重要概念¶
安全性和访问控制。
- 密码编码学是密码体制的设计学,而密码分析学则是在未知密钥的情况下从密文推演出明文或密钥的技术。密码编码学与密码分析学合起来即为密码学。
- 如果不论截取者获得了多少密文,都无法唯一地确定出对应的明文,则这一密码体制称为无条件安全的(或理论上是不可破的)。在无任何限制的条件下,目前几乎所有实用的密码体制均是可破的。如果一个密码体制中的密码不能在一定时间内被可以使用的计算资源破译,则这一密码体制称为在计算上是安全的。
- 对称密钥密码体制是加密密钥与解密密钥相同的密码体制(如数据加密标准 DES 和高级加密标准 AES)。这种加密的机密性仅取决于对密钥的保密,而算法是公开的。
- 公钥密码体制(又称为公开密钥密码体制)使用不同的加密密钥与解密密钥。加密密钥(即公钥)是向公众公开的,而解密密钥(即私钥或密钥)则是需要保密的。加密算法和解密算法也都是公开的。
- 目前最著名的公钥密码体制是 RSA 体制,它是基于数论中的大数分解问题的体制。
- 任何加密方法的安全性取决于密钥的长度,以及攻破密文所需的计算量,而不是简单地取决于加密的体制(公钥密码体制或传统加密体制)。
- 数字签名必须保证能够实现以下三点功能:(1) 报文鉴别,即接收者能够核实发送者对报文的签名;(2) 报文的完整性,即接收者确信所收到的数据和发送者发送的完全一样而没有被篡改过;(3) 不可否认,即发送者事后不能抵赖对报文的签名。
- 鉴别是要验证通信的对方的确是自己所要通信的对象,而不是其他的冒充者。鉴别与授权是不同的概念。
- 报文摘要 MD 曾是一种鉴别报文的常用方法,后来有了更加安全的 SHA-1。但目前最为安全的是 SHA-2 和 SHA-3。
- 密钥管理包括:密钥的产生、分配、注入、验证和使用。密钥分配(或密钥分发)是密钥管理中最大的问题。密钥必须通过最安全的通路进行分配。密钥分配中心 KDC 是一种常用的密钥分配方式。
- 认证中心 CA 是签发数字证书的实体,也是可信的第三方。CA 把公钥与其对应的实体(人或机器)进行绑定和写入证书,并对证书进行数字签名。任何人都可从可信的地方获得认证中心 CA 的公钥来鉴别数字证书的真伪。
- 为了方便地签发数字证书,根 CA 可以有下面的多级的中间 CA,负责给用户签发数字证书。这样就构成了信任链和证书链。
- 在网络层可使用 IPsec 协议族,IPsec 包括鉴别首部协议 AH 和封装安全有效载荷协议 ESP。AH 协议提供源点鉴别和数据完整性,但不能保密。而 ESP 协议提供源点鉴别、数据完整性和保密。IPsec 支持 IPv4 和 IPv6。在 IPv6 中,AH 和 ESP 都是扩展首部的一部分。IPsec 数据报的工作方式有运输方式和隧道方式两种。
- 运输层的安全协议曾经有 SSL(安全套接字层)和 TLS(运输层安全)。但 SSL 已被淘汰。目前使用的最新版本是 TLS 1.3。TLS 不仅对服务器的安全性进行鉴别,而且对浏览器与服务器的所有会话记录进行加密,并保证了所传送的报文的完整性。
- PGP 是一个完整的电子邮件安全软件包,包括加密、鉴别、电子签名和压缩等技术。PGP 并未使用新概念,只是把现有的一些加密算法(如 RSA 公钥加密算法或
SHA 报文摘要算法)综合使用而已。
- 防火墙是一种特殊编程的路由器,安装在一个网点和网络的其余部分之间,目的是实施访问控制策略。防火墙里面的网络称为 “可信的网络”,而把防火墙外面的网络称为 “不可信的网络”。防火墙的功能有两个:一个是阻止(主要的),另一个是允许。
- 防火墙技术分为:网络级防火墙,用来防止整个网络出现外来非法的入侵(属于这类的有分组过滤和授权服务器);应用级防火墙,用来进行访问控制(用应用网关或代理服务器来区分各种应用)。
- 入侵检测系统 IDS 是在入侵已经开始,但还没有造成危害或在造成更大危害前,及时检测到入侵,以便尽快阻止入侵,把危害降低到最小。
习题¶
7-01 计算机网络都面临哪几种威胁?主动攻击和被动攻击的区别是什么?对于计算机网络,其安全措施都有哪些?
7-02 试解释以下名词:(1) 拒绝服务;(2) 访问控制;(3) 流量分析;(4) 恶意程序。
7-03 为什么说计算机网络的安全不仅仅局限于机密性?试举例说明,仅具有机密性的计算机网络不一定是安全的。
7-04 密码编码学、密码分析学和密码学都有哪些区别?
7-05 “无条件安全的密码体制” 和 “在计算上是安全的密码体制” 有什么区别?
7-06 试破译下面的密文诗。加密采用替代密码。这种密码是把 26 个字母(从 a 到 z)中的每一个用其他某个字母替代(注意,不是按序替代)。密文中无标点符号。空格未加密。
kfd ktbd fzm eubd kfd pzyiom mztx ku kzyg ur bzha kfthcm ur mfudm zhx mftnm zhx mdzythc pzq ur ezsszcdm zhx gthcm zhx pfa kfd mdz tm sutythc fuk zhx pfdkfdi ntem fzld pthcm sok pztk z stk kfd uamkdim eitdx sdruid pd fzld uoi efzk rui mubd ur om zid uok ur sidzkf zhx zyy ur om zid rzk hu foiia mztx kfd ezindhkdi kfda kfzhgdx ftb boef rui kfzk
7-07 对称密钥体制与公钥密码体制的特点各是什么?各有何优缺点?
7-08 为什么密钥分配是一个非常重要但又十分复杂的问题?试举出一种密钥分配的方法。
7-09 公钥密码体制下的加密和解密过程是怎样的?为什么公钥可以公开?如果不公开是否可以提高安全性?
7-10 试述数字签名的原理。
7-11 为什么需要进行报文鉴别?鉴别和保密、授权有什么不同?报文鉴别和实体鉴别有什么区别?
7-12 试分别举例说明以下情况:(1) 既需要保密,也需要鉴别;(2) 需要保密,但不需要鉴别;(3) 不需要保密,但需要鉴别。
7-13 A 和 B 共同持有一个只有他们二人知道的密钥(使用对称密码)。A 收到了用这个密钥加密的一份报文。A 能否出示此报文给第三方,使 B 不能否认发送了此报文?
7-14 将图 7-5 所示的具有机密性的签名与使用报文鉴别码相比较,哪一种方法更有利于进行鉴别?
7-15 试述实现报文鉴别和实体鉴别的方法。
7-16 结合第 5 章图 5-6 计算 UDP 的检验和的例子,说明这种检验和不能用来鉴别报文。
7-17 报文的机密性与完整性有何区别?什么是 MD5?
7-18 什么是重放攻击?怎样防止重放攻击?
7-19 图 7-11 的鉴别过程也有可能被骗子利用。假定 A 发送报文和 B 联系,但不巧被骗子 P 截获了,于是 P 发送报文给 A:“我是 B”。接着,A 就发送图 7-11 中的第一个报文 “A, \(R_{A}\)”,这里 \(R_{A}\) 是不重数。本来,P 必须也发给 A 另一个不重数,以及发回使用两人共同拥有的密钥 \(K_{AB}\) 加密的 \(R_{A}\) ,即 \(K_{\mathrm{AB}}(R_{\mathrm{A}})\) 。但 P 根本不知道 \(K_{AB}\) ,只好就发送同样的 \(R_{A}\) 作为自己的不重数。A 收到 \(R_{A}\) 后,发给 P 报文 “\(K_{\mathrm{AB}}(R_{\mathrm{A}})\)”,P 仍然不知道密钥 \(K_{AB}\) ,也照样发回报文 “\(K_{\mathrm{AB}}(R_{\mathrm{A}})\)”。接着 A 就把一些报文发送给 P 了。虽然 P 不知道密钥 \(K_{AB}\) ,但可以慢慢设法攻破。试问 A 能否避免这样的错误?
7-20 什么是 “中间人攻击”?怎样防止这种攻击?
7-21 试讨论 Kerberos 协议的优缺点。
7-22 互联网的网络层安全协议族 IPsec 都包含哪些主要协议?
7-23 用户 A 和 B 使用 IPsec 进行通信。A 需要向 B 接连发送 6 个分组。是否需要在每发送一个分组之前,都先建立一次安全关联 SA?
7-24 在图 7-18 (b) 中,公司总部和业务员之间先建立了 TCP 连接,然后使用 IPsec 进行通信。假定有一个 TCP 报文段丢失了。后来在重传该序号的报文段时,相应的 IPsec 安全数据报是否也要使用同样的 IPsec 序号呢?
7-25 试简述协议 TLS 的工作过程。
7-26 在图 7-21 中,假定在第一步,顾客(客户 A)发送报文给经销商(服务器 B)时,误将报文发送到一个骗子处,而骗子就接着冒充经销商继续下面的步骤。试问在报文交互到第几个步骤时,顾客可以发现对方并不是真正的经销商?
7-27 电子邮件的安全协议 PGP 主要都包含哪些措施?
7-28 试述防火墙的工作原理和所提供的功能。什么叫作网络级防火墙和应用级防火墙?