目录
十六、安全
16.1 引言
我们生活在信息时代,需要保存生活中的各种信息。信息是一种有价值的资产,作为资产,信息需要保护,免受攻击。为了安全,信息需要避开未授权的使用(机密性),保护信息不受到未授权的篡改(完整性),并且对于得到授权的实体来说是需要时可用的(可用性)。
16.1.1 安全目标
首先讨论3个安全目标:机密性、完整性和可用性。
1. 机密性
机密性是指没有得到授权的实体无法使用或者得到信息的内容。机密性也许是信息安全中最通常的方面,机密性不仅适用于信息的存储,在信息的传输中也得到了应用。当我们将信息发送至远程计算机或从远程计算机检索时,需要在传输时对信息进行隐藏。
2. 完整性
完整性指没有得到授权的实体无法改变信息的内容,也就是说,信息的变化只应该由授权的实体通过授权的机制来完成。例如,银行账户余额只有本人能够进行合法的存取,不允许其他人或是本人非法改变。完整性冲突不一定是由于恶意行为造成的,也可能是系统出现的问题造成意料之外的改变。
3. 可用性
一个组织创建和存储的信息对授权的实体来说应该是可用的。如果信息不可用,那么信息就是无用的。信息对于授权实体来说必须是可用的,不可用性对组织是有害的,就像缺乏机密性和完整性一样。例如,你不能访问你的银行账户,这会带来什么问题?
16.1.2 攻击
三个安全目标会受到安全攻击的威胁。攻击可以有不同的分类方法,但是下面按照安全目标进行分类。
16.1.2.1 威胁机密性的攻击
1. 嗅探
嗅探是指对数据的非授权访问或侦听。例如,一个通过因特网传输的文件可能含有机密信息,一个非授权的实体可能侦听到传输,并使用其中的内容谋取利益。可以使用加密技术使信息对于侦听者来说难以理解。
2. 流量分析
通过加密技术可以使数据对侦听者来说难以理解,但是他们仍然可以通过在线流量监控获得其他类型的信息。例如,他们能找到发送者和接收者的电子地址,收集多对请求和响应,猜测交易的本质。
16.1.2.2 威胁完整性的攻击
1. 篡改
侦听或访问信息后,攻击者篡改信息的内容,使得信息对他们有利。例如,篡改银行账户的余额。有时攻击者可能仅仅是删除或延迟这个信息来危害整个系统或使他们受益。
2. 假冒
当攻击者冒充他人时,假冒或哄骗就发生了。例如,攻击者伪装成银行网站使受害者向自己汇款。
3. 重放
攻击者得到用户发送信息的副本,过后设法重放它。例如,一个用户向银行发送了给攻击者汇款的请求,之后,攻击者再次发送这条消息,希望得到另一次汇款。
4. 抵赖
抵赖是一种不同于其他类型的攻击,它是由通信双方中的一个来进行的:发送者否认发送了消息或者接收者否认自己收到消息。例如,银行否认用户在银行进行了一次存款,或者用户否认了从银行取出了存款。
16.1.2.3 威胁可用性的攻击
1. 拒绝服务
拒绝服务(DoS)攻击是很常见的,它可能减慢或完全中断系统的服务。攻击者能使用这几种策略取得这样的效果:发送大量虚假的请求使系统异常忙碌而崩溃;或者他们监听并删除服务器对客户端的响应;或者他们使客户端多次发送请求使服务器变得非常忙碌。
16.1.3 服务与技术
为了达到安全目标和防止受到安全攻击,ITU-T定义了一些安全服务的标准。这些服务中的每一个都是为了在维护安全目标时防止一个或多个攻击而设计的。实际完成安全目标需要一些技术手段,如今流行的两种技术:一种是非常普通的密码术;一种是特殊的隐写术。
1. 密码术
密码术意思是“秘密书写”。我们使用这个词是指为了信息安全并对攻击免疫而进行转换的科学和艺术。在过去密码术只是指使用密钥进行消息的加密和解密,但如今被定义成三种不同的机制:对称密钥密码、非对称密钥密码和散列。
2. 隐写术
隐写术意思是“掩饰书写”。密码术就是通过加密将消息中的内容隐藏起来;而隐写术是通过在消息上覆盖其他内容而隐藏消息。本书只介绍了简单的密码术。
16.2 机密性
机密性可以通过使用密码达到,密码术可以分为两大类:对称密钥密码和非对称密钥密码。
16.2.1 对称密钥密码术
对称密钥密码术使用了同一个密钥进行加密和解密,并且这个密钥可以用来进行双向通信。对称密钥密码也称为保密密钥密码术。
从Alice到Bob的原始消息称为明文,而通过通道发送的消息称为密文。为了从明文创建密文,Alice使用了加密算法和一个共享密钥。
为了从密文创建明文,Bob使用了解密算法和相同的密钥。
在对称密钥密码术中,加密和解密是互逆的两个操作。对明文加密再解密会得到明文,对密文解密再加密会得到密文,这两个操作是可以抵消的。
我们可以把对称密钥密码分成两大类:传统对称密钥密码和现代对称密钥密码。传统对称密钥密码很简单,面向字符的密码对现在的标准而言是不安全的,现代对称密钥密码是更安全的复杂的面向位的密码。
16.2.1.1 传统对称密钥密码
传统对称密钥密码分为替换密码和移位密码。
1. 替换密码
替换密码用一个符号替换另一个符号。例如,用'F'替换'A'、用'4'替换'6'等。替换密码主要分为单字母密码和多字母密码。
单字母密码:
在单字母密码中,相同的字符在密文中用相同的字符替换,与该字符在明文中的位置无关。例如,如果'A'会被替换成'F',那么所有的'A'都会替换成'F'。明文中的字符和密文中的字符是一一对应的。
最简单的单字母密码就是加法密码。在字母表中,每一个字母都赋予了一个模26中的整数,在进行加密时,每个字母向上(或向下)移位k个字符,被另一个字符所替换。尤利乌斯·凯撒(Julius Caesar)与他的军官使用密钥为3的加法密码进行通信,所以,加法密码有时也称凯撒密码。在加法密码中,明文、密文和密钥都是模26中的整数。
多字母密码:
在多字母密码中,字符的每一次出现都使用不同的替换码。明文和密文中的字符是一对多的,明文中不同位置的相同字符在密文中可能会被替换成不同的字符。多字母密码具有可以隐藏原有语言字母频率的作用。
为了创造一个多字母密码,我们对每一个密文字符的确定不仅取决于相应的明文字符,还取决于它在明文中的位置。这意味着我们的密钥应该是子密钥流,这个子密钥流中的每一个子密钥都在某种程度上取决于该子密钥加密的字符在明文中的位置。
为了更好的解释密钥的位置依赖性,讨论一个叫作自动密钥密码的多字母密码。在这个密码中,密钥是一个子密钥流。第一个子密钥是事先设定好的值,第二个子密钥是明文中第一个字符的值,第三个子密钥是明文中第二个字符的值,以此类推。这些子密钥都是在加密过程中通过明文字符自动创造的。
2. 移位密码
移位密码不是用一个符号替换另一个符号,而是改变符号的位置。明文中的第一个字符可能出现在密文中的第十个,换句话说,移位密码就是符号的重新排序。
假设Alice需要向Bob发送消息 Enemy attacks tonight。加密和解密过程如图,我们在消息末尾加上一个额外的字符,这样字符数就是5的倍数。
每一列都利用同一个密钥进行变更,密文通过一列一列读第二张表得到。Bob通过反向操作得到明文。这里用来加密和解密的密钥是相同的,但是算法使用密钥的顺序是互逆的。
16.2.1.2 流密码和分组密码
对称密码分为两大组:流密码和分组密码。
1. 流密码
在流密码中,加密和解密都是一次只对一个符号进行。我们有一个明文流(P)、一个密文流(C)和一个密钥流(K)。
2. 分组密码
在分组密码中,一组大小为m(m>1)的明文符号被加密在一起,创造一组同样大小的密文。在每一个分组密码中,整个分组是由一个单独的密钥进行加密,即使这个密钥由多个值构成。在分组密码中,密文的分组取决于明文的分组。
在实际操作中,每个明文分组是分别加密的,但是同时密钥流被用来对整个消息按照分组依次加密。当我们单独看每一个分组时,它是分组密码,但我们从整个明文来看,这个一个以分组为单位进行加密的流密码。
16.2.1.3 现代对称密钥密码
由于计算机的进步,我们需要面向位的密码。这是由于需要加密的消息已经不仅仅是文本,它有可能包括数字、图表、音频和视频数据。在这个情况下,更方便的办法是把这些类型的数据转换成比特流然后对流进行加密。现代密码可以是分组密码也可以是流密码。
1. 现代分组密码
对称密钥现代分组密码对大小为n位的明文分组进行加密或对同样大小的密文分组进行解密。当消息的长度小于n位时,消息后会加上补丁使消息达到一个n位的分组;如果消息长度大于n位,消息就会被分成多个n位的分组进行加密,如有必要,相应的补丁会添加到最后一个分组使它达到n位。n常用的取值是64、128、256和512.
2. 现代流密码
现代流密码和现代分组密码的差别类似于传统的流密码和分组密码之间的差别。在现代流密码中,加密和解密都是每次对r位进行。流密码比分组密码更快,它的硬件实现也简单一些。当我们需要对二进制流加密并将加密后的流匀速传输时,流密码是一个更好的选择。流密码对于传输中发生的损毁也有很好的免疫力。
最简单也最安全的同步流密码是吉尔伯特·弗纳姆发明并取得专利的一次一密乱码。一次一密乱码每次加密时使用随机选择的密钥流。加密和解密都使用单一的异或操作。基于异或操作的性质,加密和解密是互逆运算。密码中的异或操作每次只操作一个比特。同时这个随机生成的密钥流也需要发送给对方。
一次一密乱码是一个理想化的密码,它很完美,不仅敌手无法猜测密钥或者明文与密码的统计,明文和密文之间也没有任何联系。即使明文有规律,密文也是真正的比特乱码流。除非尝试了所有可能的随机密钥流,否则不可能破解这个密码。但是这个完美的理想密码很难实现,它有一个安全性较低的版本,一个较常见的版本叫作反馈移位寄存器。
16.2.2 非对称密钥密码术
在对称密钥密码术中,密钥必须在双方共享。在非对称密钥密码术中,密钥是个人私有的,每个人都保守自己的密钥。对称密钥密码基于共享保密,非对称密钥密码基于个人保密。
在加密以外还有其他方面需要使用非对称密钥密码术,这些方面包括身份验证和数字签名。
与对称密钥密码术基于符号的替换和排列不同,非对称密钥密码基于数学函数在数学上的应用。对称密钥密码对字符进行排列或替换,而非对称密钥密码对数字进行操作。在非对称密钥密码中,明文和密文都是数字,加密和解密的过程就是使用数学函数处理数字并产生其他数字的过程。
在非对称密钥密码术中使用两个分开的密钥:私钥和公钥。私钥和公钥是对应的,相应的公钥上的锁只有相应的私钥才能打开。虽然有些书上会用密钥代替私钥,但是我们只有讨论对称密钥密码时会使用密钥,私钥和公钥是非对称密钥密码的特有术语。非对称密钥密码有时也被称为公钥密码。
16.2.2.1 主要思想
下图展示了非对称密钥密码术进行加密时的主要思想。
图中说明了几个重要事实。首先,它强调了密码系统的非对称性。提供安全的重担落在了接收者头上,这里是Bob。Bob需要创建两个密钥:一个私钥和一个公钥。他有义务将公钥分发给团体,这可以通过公钥分发通道来完成。虽然此通道不需要保证安全,但它必须提供身份验证和数据完整性,这样攻击者就无法将自己的公钥假冒为Bob的公钥分发给别人。
非对称密钥密码术意味着Bob和Alice在双向通信中不能使用同一组密钥,在通信中每个个体都需要有自己的私钥和公钥。 Bob只需要一个私钥就可以从其他人那里接收信息。如果Alice要向n个人发送信息,那么她就需要有n个公钥(公钥环)。
1. 明文/密文
在非对称密钥密码中,明文和密文被当作整数来对待。在加密之前,消息必须被编码成一个整数,在解密之后,整数必须被还原为消息。非对称密钥密码通常被用来加密和解密小段信息,例如对称密钥密码中的密钥。换句话说,非对称密钥密码术通常起到辅助作用而不是加密消息的作用,这个辅助作用在当今的密码术中发挥了重要的作用。
2. 加密/解密
在非对称密钥密码中的加密和解密是作用在表示明文和密文的数字上的数学函数。密文可以被看成,明文可以看成,其中加密函数只用来解密,解密函数只用来解密。
非对称密钥密码术的提及不代表着对对称密钥密码术的需求会减少,因为非对称密钥密码比对称密钥密码慢得多。对称密钥密码仍然用于较长消息的加密。对称密钥密码的速度快也没有减少对非对称密钥密码的需求。身份验证和数字签名等仍然使用非对称密钥密码。这意味着,我们需要将对称密钥密码和非对称密钥密码配合起来使用才能应用于安全性的每一个领域。
16.2.2.2 RSA密码系统
虽然有几种非对称密钥密码系统,但最常用的公钥算法之一是RSA密码系统(以发明者Ron Rivest、Shamir和Adleman命名)。RSA使用两个指数 和 ,其中 是公钥, 是私钥。假设代表明文, 代表密文,那么Alice使用 从明文建立密文,Bob通过从密文还原明文。在密钥生成的过程中创造了一个很大的数作为模数。
过程:
Bob选择两个素数,计算,。然后Bob选择,使得。Bob的公钥是 和 ,私钥是 。任何人都可以通过
加密一条消息发送给Bob,而Bob则通过来解密消息。攻击者没有办法在 很大时破解这个消息(他不知道 )。
16.2.2.3 应用
虽然RSA可以用于对实际消息进行加密和解密,但如果消息很长加密的速度会很慢。因此。RSA加密适用于短消息。RSA特定用于数字签名以及其他不需要使用对称密钥密码来对较短信息进行加密的密码,RSA也可用于身份验证。
16.3 其他安全服务
16.3.1 消息完整性
有些场合我们不需要保密,但是需要完整性:消息未被授权应该是不受改动的。例如,Alice可能写一份遗嘱在她死后分配财产,遗嘱不需要被加密,但必须保证它是完整的没有被改动过的。
1. 消息和消息摘要
保证文档完整性的一种方法是通过指纹。Alice在她的文档底部印上指纹,当接收者拿到文档,将文档上的指纹与接收者有的指纹副本对照,就可以确定文档是否是来自Alice的。文档和指纹对的电子等价物就是消息和消息摘要对。为了保证消息完整性,消息通过一个称为密码散列函数的算法,函数建立消息的摘要。为了检查消息或文档的完整性,Bob再次运行密码散列函数,并比较新的摘要和传输过来的摘要,如果相同,则说明消息没有被篡改。文档和指纹是链接在一起的,消息和消息摘要不需要链接在一起,最重要的是消息摘要需要保证安全,免受篡改。
2. 散列函数
散列函数将任意长度的消息加密成固定长度的消息摘要。所有的散列函数加密都需要从长度不一的消息中创造出长度固定的消息摘要。要有这样一个功能最好用迭代完成,创造一个有固定输入值并且可以使用必须次数的函数(每次处理一部分),而不是使用输入值大小可变的的散列函数。这里的固定输入函数指的是压缩函数,它将 n 位一串字符压缩并创造成 m 位的字符串,这里 n 通常大于 m。 该方案称为迭代加密散列函数。
罗恩·李维斯设计的几个散列算法被称为MD2、MD4和MD5,这里的MD代表消息摘要。MD5是MD4的加强版,它可以将消息分成长度为512位的分组并创造大小为128位的摘要。事实证明128位的消息摘要太小了,并不能阻挡攻击。
为了应对MD散列算法的不安全性,安全散列算法诞生了。安全散列算法(SHA)是由国家标准与技术研究所(NIST)研制的一个标准。
16.3.2 消息验证
Alice使用散列函数从消息和密钥的连接中创建了一个MAC(消息验证码),即。她在不安全的通道上把消息和MAC发送给Bob。Bob使用散列函数从接收到的消息和密钥中创建一个MAC,如果这个MAC与Bob接收到的MAC一致,那么消息没有被篡改过。在这种情况下,不需要使用两条通道。即使攻击者得到MAC和消息,也不能进行篡改,因为他不知道密钥。
HMAC:国家标准与技术研究所(NIST)发布了新一代MAC标准,通常称HMAC(散列消息验证码),HAMC的实施比简化的MAC更复杂。
16.3.3 数字签名
MAC使用密钥来保证消息完整性,数字签名使用一组公私钥来保证消息完整性。
我们都熟悉签名这个概念,当一个人在文档上签名就表示该文档是源于他或是他同意的。文档上的签名就是身份验证的标记,它验证通过,文档就可信。
当Alice向Bob发送消息时,Bob需要检查发送者的身份,他需要确信消息来自Alice而不是攻击者。Bob可以要求Alice对信息进行电子签名。一个电子签名能证明Alice作为消息发送者的身份,我们把这种签名称为数字签名。
1. 对比
数字签名和普通签名有几点不同。
包含:普通签名是包含在文档中的,是文档的一部分。数字签名作为一个单独的文档来发送。
验证手段:普通签名需要有一个副本作为比较,如果相同,则文档就是可信的。对于数字签名,接收者收到消息和签名,需要应用验证技术来组合消息和签名,从而验证发送者的身份。
关系:对于普通签名,签名和文档是一对多的关系,一个人使用相同的签名签署多个文档。对于数字签名,签名和消息是一对一的,每一个消息都有它自己的签名,不能使用一个签名去验证另一个消息。
复制性:普通签名允许签名和签名副本有些许不同,而数字签名没有这样的不同,除非数字签名中包含时间因子(时间戳等)。
2. 过程
发送者使用签名算法去签署消息,消息和签名被发送给接收者。接收者收到消息和签名,对收到的内容进行验证,如果为真就接收,否则就拒绝消息。
签署者使用私钥去签署文档,接收者使用公钥验证文档。当一个文档被签署,任何人都可以验证它,因为任何人都能知道公钥。不能使用公钥签署文档,因为这样任何人都可以伪造签名。
我们不能用对称密钥来签署和验证签名。首先,密钥只有双方知道(这里是Alice和Bob),如果Bob需要签署一个文档发送给另一个人,那么他需要另一个密钥。其次,为一个对话创建密钥涉及验证,而验证要使用数字签名。最后,Bob可能会伪造Alice的签名签署一个文档并发送给其他人。
在密码系统中使用接收者的私钥和公钥,接收者使用私钥解密密文,发送者使用公钥加密明文;在数字签名中使用签署者(发送者)的公钥和私钥,签署者使用私钥签署文档,而接收者使用公钥进行验证。
3. 签署摘要
在数字签名系统中,消息通常比较长,但非对称密钥密码处理长消息的效率低下。解决的方法是签署摘要。一个仔细选择的消息摘要和消息具有一对一的关系。发送者可以签署消息摘要,接收者可以验证消息摘要,两者的效果是相同的。
4. 服务
下面讨论几个安全服务,包括消息验证、消息机密性、消息完整性和不可抵赖性。
消息验证:一个安全的数字签名模式就像一个安全的普通签名一样能提供消息验证,也成为数据源验证。
消息完整性:如果我们签署消息或消息摘要,消息的完整性就能被保护,如果消息改变了,我们就不能得到相同的摘要。如今的数字签名模式在签署和验证算法中使用了散列函数,这样更好的保护了消息完整性。
不可抵赖性:如果Alice签署了一个消息,然后否认它,这时候有什么办法吗?前面介绍过的模式没有办法解决这个问题。Bob收到从Alice处发来的消息,在Alice否认后,Bob需要使用Alice的公钥去建立原始消息以便证明是由Alice发出的,但是在这个过程中,Alice可能更换了私钥和公钥。一个可行的方法是可信的第三方。人们可以在他们之间建立可信中心。在这种模式下,Alice签署一个消息并发送给可信中心,可信中心使用Alice的公钥验证这个消息是Alice发出的,然后可信中心使用它自己的私钥签署这个消息并发送给Bob,Bob可以使用可信中心的公钥验证消息。当Alice事后抵赖时,可信中心就会拿出证明Alice撒谎的证据。
机密性:数字签名不提供机密通信,如果机密性是需要的,那么消息和签名就应该使用对称密钥密码或非对称密钥密码进行加密。签名人Alice首先通过一个商定好的散列函数从消息中创建一个摘要,然后通过加密技术对摘要进行加密。然后将消息和摘要都发给Bob,Bob首先对摘要解密,然后通过同样的散列函数得到新的摘要,与接收的摘要对比,如果相同,则接收消息。
16.3.4 实体验证
实体验证是指使一方能够证明另一方标识的技术。例如,一个人使用银行卡去银行取款,那么银行首先要验证这个人的身份是否是卡主。需要证明身份的实体称为要求者,视图证明要求者者身份的称为证明者。
16.3.4.1 实体验证与消息验证
实体验证与消息验证有两点区别:
① 消息验证可能不会发生在实时系统中,但实体验证会。Alice发送一条消息给Bob,在Bob验证消息时,Alice可能在或者不在通信中。当Alice请求实体验证时,她必须在线参加这个过程,只有等到通过验证,她才能进行会话,在通过验证之前,是没有消息传递的。例如,Alice在银行取款时,她必须等待自己的身份被验证才能继续继续进行取款。
② 消息验证简单地验证一条消息,这个过程需要对每条新的消息重复。实体验证在整个会话开始之前验证一次要求者的身份。
16.3.4.2 验证分类
在实体验证中,要求者需要向证明者标识自己。可以使用三种证据的一种:所知道的、所拥有的和所固有的。
所知道的:这是一种要求者知道的秘密,例如密码等。
所拥有的:这种东西能证明要求者的身份。例如身份证等。
所固有的:这是要求者内在固有的特性。例如指纹、视网膜模型等。
所知道的这种验证通常用于远程(在线)实体验证,另外两种则通常在要求者个人出现时使用。
16.3.4.3 密码
最简单最古老的实体身份验证是基于密码的身份验证,密码是要求者知道的一些东西。当用户需要访问系统资源时,他就需要一个密码。每个用户都有一个用户标识,这是公开的;有一个密码,这是私有的。但是,密码在攻击面前很脆弱,可能被窃取、截获或猜出等。
16.3.4.4 质询-响应
在密码验证中,要求者通过展示他们知道的密码来证明他们的身份。但是要求者暴露了这个秘密,就容易受到攻击者的截获。在质询-响应身份验证中,要求者要证明他们知道秘密而不暴露它。换句话说,要求者并没有将秘密发送给证明者,但他向证明者证明自己知道这个秘密。质询是一个随时间变化的值,如随机数或时间戳,它由证明者发送给要求者。要求者对质询运用一个函数,把结果(称为响应)发送给证明者。响应表明要求者知道秘密。
1. 使用对称密钥密码
有几种方法可以利用对称密钥密码来进行质询-响应身份验证。这里共享的秘密是要求者和证明者都知道的共享密钥。使用对称密钥密码的作用是对质询应用加密算法。
第一个消息告知证明者要求者想要进行质询,第二个消息是质询。RB是证明者(Bob)为了质询要求者随便挑选的随机数。要求者将随机数通过只有要求者和证明者知道的共享密钥进行加密,并将结果发送给证明者。证明者对消息进行解密,如果得到的随机数和证明者发送的相同,Alice就得到进入许可。在这个过程中,证明者和要求者要对他们使用的共享密钥保密,证明者也要保存给要求者发送的随机数直到返回响应。
2. 使用非对称密钥密码
在非对称密钥密码中,证明者使用要求者的公钥对质询进行加密,要求者收到质询后,使用他的私钥对质询解密并返回响应。
3. 使用数字签名
实体验证可以通过使用数字签名达到。当数字签名用在实体验证时,要求者使用他的私钥进行签名。Bob发送明文,Alice签署响应。
16.3.5 密钥管理
16.3.5.1 对称密钥分发
在对大量消息进行加密时,对称密钥密码的效率要高于非对称密钥密码,但是通信双方需要一个共享密钥。
如果Alice和n个人通信,那么她需要n个密钥。如果n个人相互需要通信,假定双向通信可以使用同一个密钥,那么总共需要数量级的密钥。这个通常称为问题。
密钥的数目不是唯一的问题,它的分发是另一个问题。如果Alice和Bob需要通信,那么他们选择一种方式交换密钥,如果Alice要和100万人通信呢,这时候如何交换密钥?使用互联网肯定不是一个安全的办法。显然我们需要一种有效的方法来维护和分发密钥。
1. 密钥分发中心(KDC)
一个实用的解决方案是使用可信的第三方,称为密钥分发中心。为了减少密钥的数量,每个人与KDC建立一个共享的密钥。Alice和Bob发送机密消息的过程如下:
Alice向KDC发送请求,说明她需要与Bob通信;
KDC告诉Bob关于Alice的请求;
如果Bob同意,KDC就为两人创建一个会话密钥。
每个人与KDC的共享密钥是为了向KDC验证自己的身份,KDC会验证通信双方的身份,然后为这次会话创建一个密钥。
2. 多密钥分发中心
当使用同一个密钥分发中心的人数增多时,系统会变得难以管理并导致瓶颈。为了解决这个问题,可以使用多密钥分发中心。我们将世界划分成区域,每个区域有一个或多个KDC。现在Alice想发机密消息给另一个区域的Bob,她首先和本区域的KDC联系,然后和Bob所在地区的KDC联系。两个KDC创建他们之间通信的密钥。这些可能是本地KDC、本国KDC或者国际KDC。当Alice想与另一个国家的Bob联系时,她先联系本地KDC,然后本地KDC联系本国KDC,本国KDC联系国际KDC,最终找到Bob,并建立他们的会话密钥。下图展示了一个分级KDC布局。
3. 会话密钥
KDC为每一个成员建立一个密钥,这个密钥只可以在成员和KDC之间使用。如果Alice要和Bob通信,他们需要两人之间的会话密钥。KDC可以在验证两人身份后为两人建立会话密钥,这个会话密钥在通信终止后就不再有效,也就是说,一个双方间的会话对称密钥只被使用一次。
下图展示了最简单的创建对话密钥的方法。
① Alice发送明文消息给KDC来得到她和Bob之间的对称会话密钥。这个消息包含她的注册信息和Bob的身份。KDC不在乎这个消息是不是加密或者公开的。
② KDC检索接收到的消息创建存根,这个存根使用Bob的密钥进行加密,里面包含Alice和Bob的身份和会话密钥。存根和会话密钥的副本发送给Alice。Alice收到消息,解密并提取出密钥(这时Alice通过了KDC的验证,因为只有她能解密),但她无法打开存根,因为是用Bob的密钥加密的。这条消息使用了双重加密,存根是加密的,整条消息也是加密的。
③ Alice将存根发送给Bob,Bob解密并拿到密钥。Bob也通过了KDC的验证,因为只有Bob能解密存根。Alice也通过了Bob的鉴别,因为Bob信任KDC而且KDC将有Alice身份的存根发送给了Bob。
16.3.5.2 公钥分发
在非对称密钥密码中,人们不需要一个对称的共享密钥。如果Alice想要给Bob发送消息,她只要直到Bob的公钥,这个公钥是对公众公开的,任何人都可以使用。在公钥密码术中,每个人有权访问别人的公钥,公钥对公众可用;每个人都隐藏自己的私钥,只有自己知道私钥。公钥像密钥一样,也需要分发,这样才有用。
1. 公开声明
最朴素的方法是公开声明公钥。Bob可以将他的公钥放到网站上,或者在地方或国家的报纸上发表声明。但是这种方法不安全,它可能被伪造。例如,攻击者可能伪造了这个声明,将Bob的公钥替换成自己的公钥,这样他就可以拿到本来发送给Bob的消息。攻击者也可以使用相应的伪造的私钥签署一份文档,使所有人相信是Bob签署的。如果Alice直接向Bob请求公钥,这种方法也是脆弱的。攻击者可能截获Bob的回应,用她自己伪造的公钥替换Bob的公钥。
2. 认证机构
最常用的分发公钥的方法是建立公钥认证。Bob想要两件事情:人们知道他的公钥,没有人能假冒他的公钥。Bob可以去认证机构(CA),它是一个把公钥和实体捆绑在一起并处理认证的机构。
CA本身有一把众所周知的公钥,这把公钥不能伪造。CA先检查Bob的身份,然后CA向Bob要公钥,并把它写在证书上。为了防止证书被伪造,CA用它的私钥签署证书。现在Bob可以上载签署证书,任何需要Bob公钥的人就可以下载签署证书,并使用中心的公钥解密出Bob的公钥。
3. X.509
虽然CA的使用可以解决公钥骗局的问题,但它也产生了副作用。每个证书的格式可能都不一样,如果Alice想利用程序来自动下载不同的证书,这个程序不一定能做到。普遍的使用必须依赖通用的格式,为了消除这个副作用,ITU设计了X.509,一个在经历部分修改之后被因特网广泛接受的建议。X.509是一个结构化描述证书的方式,它使用叫作ASN.1的一个众所周知的协议。
16.4 防火墙
前面的安全测试都无法防止攻击者向系统发送有害消息。我们需要防火墙来控制对系统的访问。防火墙是一个安装在内部网络和因特网其他部分之间的设备(通常是一个路由器或计算机)。防火墙是为了推进一些数据包而过滤其他数据包所设计的。例如,防火墙可能会过滤所有目标为特定主机或服务器的数据包。防火墙也可以用来阻拦对组织内特定主机或服务的访问。防火墙通常分为包过滤防火墙和代理防火墙。
16.4.1 包过滤防火墙
防火墙可以用作数据包过滤器。它可以基于网络层和传输层的信息:源和目标的IP地址,源和目标端口地址以及协议的种类(TCP或UDP)来推进或阻拦数据包。包过滤防火墙是一个使用过滤表单决定哪些数据应该丢弃的路由器。
由上图,以下数据包被过滤:
来自网络131.34.0.0的数据包被阻拦了;
目标为任何国际TELNET服务器(端口23)的外发数据包被阻拦了;
目标为内部主机194.78.20.8的数据包被阻拦了,该组织希望这个主机只用于内部;
目标为HTTP服务器(端口80)的外发数据包被阻拦了,该组织不希望员工浏览因特网。
16.4.2 代理防火墙
包过滤防火墙是基于网络层和传输层的信息建立的,但是,有时我们也需要基于消息自身携带的信息(应用层上)进行过滤。例如,一个组织相对自己的网页试试以下政策:只有那些之前与本公司建立商业联系的因特网用户可以访问;其他用户必须阻拦。这个情况下,数据包过滤防火墙就不可行,因为它无法区分到来数据包的不同,它只能根据特定的条件拦截或推进数据包。
一个解决措施是安装代理计算机(有时也称应用网关),代理计算机位于客户计算机和公司计算机之间。当客户进程发送消息时,应用网关运行服务器进程来接收请求。服务器在应用层打开数据包并且查找这个请求是否合法。如果合法,那么服务器运行客户端进程将消息发送给公司中真正的服务器,否则这个消息会被丢弃并且错误信息会发给外部用户。通过这个方法,外部用户的请求基于内容在应用层进行筛选。下图展示了一个HTTP的应用网关实现。