网络安全1.
OSI安全体系结构开放系统互连(OSI)安全体系结构是国际电信联盟电信标准部(ITU-T)在X.
800建议中提出的.
OSI安全体系结构集中在三个方面:安全攻击,安全机制和安全服务.
安全攻击是指任何损害信息安全的行为;安全机制是用于检测和预防安全攻击或从安全攻击中恢复的任何机制;安全服务是用于增强信息系统安全性及信息传输安全性的服务,安全服务使用一种或多种安全机制来提供服务.
(1)安全攻击安全攻击分为被动攻击(passiveattacks)和主动攻击(activeattacks)两类.
被动攻击试图从系统中获取信息,但它们并不影响系统资源;主动攻击则试图改变系统资源或影响系统的操作.
被动攻击只是静悄悄地监听正在进行的网络传输,不发出任何信号.
被动攻击有两类:偷听和流量分析.
偷听是为了获得正在传输的内容,流量分析则是为了从通信频度、消息长度等流量模式来推断通信的性质.
由于被动攻击不发出任何信号,因而这类攻击很难检测.
最好的办法是用加密来保护正在传输的信息,并且通过制造一些虚假的流量来蒙蔽对手.
因此,对付被动攻击的方法是预防而不是检测.
主动攻击涉及对数据流的修改及伪造等.
主动攻击分为四类:伪装(masquerade),重放(replay),消息修改和拒绝服务(denialofservice).
伪装是指一个实体假冒另一个实体.
伪装攻击通常还涉及其它类型的主动攻击,比如,截获一个有特权实体的身份鉴别序列并在合法的鉴别过程结束后重放,从而使得一个无特权的实体通过假扮一个有特权的实体而获得特权.
重放是指从网络中被动地获取一个数据单元(不影响该数据单元的正常传输),并在经过一段时间后重新发送到网络中,以获得越权的效果.
消息修改是指改变合法消息的部分内容、推迟发送消息或者改变消息的发送顺序等,以产生越权的效果.
拒绝服务是指阻止通信设施的正常使用或管理.
拒绝服务攻击可能有一个特定的目标,如抑制去往某个特定主机(如提供安全审计服务的主机)的所有消息;也可能是针对整个网络,比如通过发送大量的消息使网络过载,导致网络性能下降甚至瘫痪.
与被动攻击不同,要想完全阻止主动攻击非常困难,因为这要求对所有通信设施及路径进行物理保护.
对付主动攻击的主要方法是检测攻击,然后设法从攻击造成的破坏中恢复出来.
由于攻击检测具有一定的威摄作用,因此也有助于预防攻击.
(2)安全服务X.
800将安全服务定义为由开放系统的某个协议层次提供的用于确保系统或数据传输充分安全的服务.
X.
800将安全服务划分为五类共十四种服务.
第一类服务是鉴别.
鉴别的目的是要证实通信过程涉及的另一方确实具有他们所声称的身份,从而确保通信是可信的.
如果是针对单个消息(如一个警告或通知消息),则鉴别的作用是让接收者确信消息来自声称的发送者.
如果是针对一个将要开始的交互过程,如连接到一个主机,鉴别涉及到两个方面.
首先,在连接初始化阶段,该服务确保两个通信实体可以相互证实对方的身份.
其次,该服务确保不会有第三方能假冒其中任何一个合法实体进行越权传输或接收.
X.
800中定义了两种鉴别服务:对等实体鉴别:在连接建立及数据传输阶段对对等实体的身份进行证实,防止对等实体是假冒的或是一次重放攻击.
数据起源鉴别:该服务提供对消息起源的证实,但不能保护消息免遭修改或复制.
这类服务支持在通信实体之间没有预先交互的应用(如电子邮件).
第二类服务是访问控制.
在网络安全中,访问控制是限制和控制通过通信链路对主机系统和应用访问的能力.
为实现访问控制,每个希望访问系统的实体必须首先被鉴别,然后被授予适当的访问权限.
第三类服务是数据机密性,数据机密性服务保护被传输的数据免遭被动攻击.
X.
800定义了三种内容保护等级:(1)保护在一条连接上传输的所有用户数据,(2)保护在一个数据块中的所有用户数据,(3)保护一个连接或一个数据块中用户数据的某些域.
保护范围较窄的服务实现起来比较复杂,代价也高,而实际上并不如保护范围大的服务有用.
数据机密性的另一个方面是保护通信流量免受流量分析攻击,这要求隐藏数据传输的源和目的、数据发送频度、消息长度或其它流量特征.
X.
800定义了四种数据机密性服务:连接机密性,无连接机密性,选择域(selective-field)机密性和通信流量机密性.
前三种服务分别对应上面所说的三种内容保护等级,第四种服务保护可从通信流量中观察到的信息.
第四类服务是数据完整性.
和数据机密性一样,数据完整性可应用于一个消息流、一个消息或消息中的一些域;同样,最有用和最简单的方法是对整个流进行完整性保护.
面向连接的完整性服务保护一个消息流,它令接收方确信收到的消息与最初发出的消息是完全一样的,没有被复制、修改、重排序或重放.
无连接的完整性服务只保护单个消息,令接收方确信收到的消息没有被修改.
X.
800区分有恢复机制和无恢复机制的完整性服务.
由于完整性服务是为抵抗主动攻击而设计的,所以该类服务主要着眼于检测攻击而不是预防攻击.
假如检测到数据完整性的缺失,无恢复机制的完整性服务只是简单地报告这个事件,需要其它的软件功能或人工干预来进行恢复.
有恢复机制的完整性服务在检测到完整性缺失后,还试图从该状态恢复,这种集成了自动恢复机制的服务一般来说更有吸引力.
X.
800定义了五种数据完整性服务:有恢复机制的连接完整性:提供对一个连接上所有用户数据的完整性保护,并试图从数据完整性被破坏的状态中恢复.
无恢复机制的连接完整性:提供对一个连接上所有用户数据的完整性保护,没有恢复措施.
选择域连接完整性:提供对一个连接上的用户数据中某些域的完整性保护.
无连接完整性:提供对一个无连接数据块的完整性保护.
选择域无连接完整性:提供对一个无连接数据块中某些域的完整性保护.
第五类服务是不可否认性(nonrepudiation),该服务防止发送方或接收方否认已发送或已接收了一个消息的事实.
因此,当一个消息被发送后,接收方可以证明声称的发送者确实发送了消息;同样地,当一个消息被接收后,发送方可以证明声称的接收者已经接收了消息.
X.
800定义了两种不可否认性服务:源不可否认性(nonrepudiation,origin):证明消息由声称的发送者发送.
目的不可否认性(nonrepudiation,destination):证明消息已被指定的接收者接收.
X.
800定义可用性为系统或系统资源可被授权实体访问和使用的特性,许多攻击可导致可用性的降低或丧失.
自动对抗措施(如鉴别和加密等)可以用来对付一些攻击,另一些攻击则要求采取某些物理动作来防范,或者使失去可用性的部件重新恢复工作.
X.
800将可用性看成是与多种安全服务相关联的特性,然而,专门定义一种可用性服务也是有道理的.
可用性服务是保护系统以确保其可用性的服务,该服务解决由拒绝服务攻击引起的安全问题.
可用性服务要依靠适当的系统资源管理和控制,因而依赖于访问控制服务和其它安全服务.
表8-1安全服务与安全攻击之间的关系偷听流量分析伪装重放消息修改拒绝服务对等实体鉴别√数据起源鉴别√访问控制√机密性√通信流量机密性√数据完整性√√不可否认性可用性√(3)安全机制X.
800定义了13种安全机制.
这些安全机制被分成两类,一类称为特定(specific)安全机制,这类机制是在某一个特定协议层中实现的;另一类称为普遍(pervasive)安全机制,它们不限于某个特定的安全服务或协议层次.
特定安全机制包括:加密:使用数学算法对数据进行变换,使其不易理解.
数字签名:附加在一个数据单元后面的数据,允许接收者用来证明数据单元的起源及完整性,以防伪造.
访问控制:各种实施访问授权的机制.
数据完整性:用于保护数据单元或数据单元流完整性的各种机制.
鉴别交换:通过信息交换确信一个实体身份的机制.
流量填充:在数据流间隙中插入比特,以挫败流量分析的企图.
选路控制:允许为某些数据选择特定的物理安全路由,并在怀疑安全受到威胁的情况下改变路由.
公证:使用一个可信的第三方来确保数据交换的某些特性.
普遍安全机制包括:可信功能性(trustedfunctionality):根据某个安全标准被认为是正确的功能.
安全标签:与资源绑定、用于指定该资源的安全属性的一个标记.
事件检测:安全相关事件的检测.
安全审计形迹(securityaudittrail):为安全审计而收集的数据,这是对系统记录和行为的独立的回顾和检查.
安全恢复:处理来自安全机制的请求,如事件处理和管理功能,并采取恢复行动.
表8-2安全服务和安全机制之间的关系加密数字签名访问控制数据完整性鉴别交换流量填充选路控制公证对等实体鉴别√√√数据起源鉴别√√访问控制√机密性√√通信流量机密性√√√数据完整性√√√不可否认性√√√可用性√√密码学基本概念常用的加密模型如图8-2所示,明文P经加密函数E及加密密钥K作用后转换成密文C(用C=EK(P)表示),密文在信道中传输,接收端用解密函数D及解密密钥K作用到密文C上,输出明文P(用P=DK(C)表示),显然有P=DK(EK(P)).
在信道中密文可能被入侵者截获,入侵者分为被动入侵者和主动入侵者,被动入侵者只是窃听信息,而主动入侵者可能会修改、伪造信息或者将信息记录下来后重放.
破译密码的技术称为密码分析,密码设计(加密)与密码分析(解密)技术统称为密码学.
密码学的一条基本原则是必须假设破译者知道加密与解密的方法,也就是说在以上的加密模型中E和D是公开的.
这样密钥K就必须是保密的,密钥通常是由一个长度较短的字符串组成,密钥根据需要可以随时改变.
在这里,密钥的长度非常重要,密钥的长度越长,密钥空间就越大,使用强力破解法搜索整个密钥空间所需的时间就越长(与密钥长度成指数关系).
因此,密码学研究的基本原则就是算法是稳定和公开的,密钥是保密和经常改变的,密码的安全性要由强有力的算法与长密钥来保证.
从破译者的角度来看,密码分析问题有三个主要的变形.
当拥有一批密文但无相匹配的明文时,称为"只有密文"问题;当拥有一批相匹配的密文和明文时,称为"已知明文"问题;当破译者能够加密自已选择的任何明文时,称为"选择明文"问题.
一种密码系统仅当能够抵抗"选择明文"攻击时,这种系统才是可靠的.
传统加密方法分为两类,替换密码和换位密码.
替换密码是用密文字母来替换明文字母,但字母位置不变.
替换密码的例子包括循环移动字母表、单字母替换、多字母替换等.
破译循环移动字母表密码的方法是尝试所有可能的移动位数K,破译单字母替换及多字母替换密码的关键是使用自然语言的统计特性.
换位密码是保留明文字母不变,但改变字母的位置.
图8-3是一种常见的列换位密码,它将明文按行书写,每行的字母个数由密钥长度决定,根据密钥对列编号,然后按照编号顺序输出各列形成密文.
破译列换位密码的关键是猜测密钥的长度K、猜测可能的单词并结合使用英文词频统计法.
2.
对称密钥算法现代密码学也使用传统密码学的一些基本思想,如替换和换位,但它们的侧重点不同.
传统密码学中的算法很简单,它主要依靠算法保密或长密钥来保证密码的安全性.
而现代密码学的目标是使得算法异常复杂,再加上使用长密钥,使得破译密码从时效性的观点来看是不可能的.
对称密钥算法是指加密密钥和解密密钥相同的密码算法,我们重点讨论分组密码,即用n比特的明文块作为输入,输出n比特的密文块.
密码算法可以用硬件实现(速度快),也可以用软件实现(灵活性好).
用硬件电路实现替换和换位的方法见图8-6,其中实现换位的基本部件称为P盒,实现替换的基本部件称为S盒.
将P盒和S盒级联起来可以构成乘积密码,当级联的级数足够多时,输出函数可以变得非常复杂.
数据加密标准DES1977年美国政府批准了第一个通用的数据加密标准DES,此后该标准被众多的厂家采纳用于它们的安全产品中.
尽管DES的最初版本已不能起到保密作用,但修改后的DES版本至今仍然有着广泛的应用.
DES的工作流程如图8-7(a)所示.
DES是一种分组密码,它用64比特的明文块作为输入,输出64比特的密文块.
算法使用一个56比特的主密钥,包括19个处理阶段.
第一个阶段是与密钥无关的换位,最后一个阶段是与初始换位相反的一个逆变换,倒数第二个阶段将数据块的左右两部分进行对换,其余16个阶段是算法相同的迭代过程,每一次迭代过程如图8-7(b)所示.
每一次迭代使用一个不同的子密钥(48比特),子密钥是从主密钥中变换而来,且与所在的处理阶段有关.
DES是一种对称密钥密码,其解密密钥和加密密钥相同,且解密过程就是加密过程的逆过程.
有时使用一种称为漂白(whitening)的技术来增加DES的强度,即在将明文输入DES设备之前与一个随机的64比特密钥进行异或,密文输出后再与一个64比特的密钥进行异或,然后再发送.
由于漂白增加了密钥的长度,它使得穷尽密钥空间所用的时间更长.
三重DESDES的问题是密钥太短,迭代次数也太少,仍然存在着破译的可能.
一种广泛使用的用于增加DES强度的方法是三重DES,如图8-8所示.
它使用两个密钥进行三重DES,第一阶段使用密钥K1对明文P进行加密,第二阶段使DES设备工作于解码模式,使用密钥K2对第一阶段的输出进行变换,第三阶段又使DES工作于加密模式,使用K1对第二阶段的输出再进行一次加密,最后输出密文.
在这里只使用了两个密钥,这是因为112比特的密钥已经足够长了,没有必要使用三个密钥去增加密钥管理和传输的开销.
那么为什么不只使用两重DES(即EE模式)呢这是为了避免中途攻击.
假定攻击者已经拥有了一个匹配的明文密文对(P1,C1),则C1=EK2(EK1(P1)),令X=EK1(P1)=DK2(C1).
攻击者首先用所有256个可能的密钥值K1加密P1,把这些结果存在一个表中并按照X的值对表进行排序;然后用所有256个可能的密钥值K2对C1进行解密,在每次做完解密后都用结果在表中寻找匹配.
如果发生一个匹配,就用一个新的已知的明文密文对(P2,C2)对找到的两个密钥进行检验,如果两个密钥产生正确的密文,就把它们接受为正确的密钥.
采用中途攻击,破译112比特密钥的双重DES,其攻击的工作量(256)和单次DES(255)差不多.
为什么采用EDE模式而不是EEE模式呢这主要是为了同单次DES兼容,三重DES用户解密单次DES用户加密的数据,只需令K1=K2就行了.
分组密码的加密模式分组密码本质上是一种单字母替换密码,因为一个n比特的明文块被唯一地映射到一个n比特的密文块上,只不过它的字符很大(如有64比特).
为了在各种应用中使用分组密码,共定义了以下几种操作方式,下面以DES为例来进行说明.
最简单的方式是电子密码本ECB方式.
在这种方式下,明文被分成每64比特一个组,最后一个组需要填充至64比特,每个组使用同一个密钥进行加密.
ECB的最大特点是如果在整个报文中同一个64比特的明文组出现多次,它们会产生相同的密文.
因此,如果报文是高度结构化的,密码分析者就可能利用这些规律来篡改或重排分组,如图8-11的例子.
因此,ECB方式对于传输少量的数据是比较理想的,但对于传输长报文并不安全.
要挫败这种类型的攻击,可以使用密码块链接方式,如图8-12所示.
每个明文块在加密之前都与前一个密文块进行异或,第一个明文块与一个随机选择的初始矢量IV进行异或,IV随密文一起传送(用明文方式).
采用这种方式后,密文块i与明文块0(i-1都有关系,因此例8-11中的数据块替换会导致从被篡改的替换块开始解密的明文没有意义.
另外,同一个明文块映射到不同的密文块上,也给密码分析带来更大的困难.
密码块链接方式的缺点是,只有当所有的64比特块到达后才能开始解码.
如果需要按字节进行解码,可以使用密码反馈方式,如图8-13所示.
加密端维护一个64比特的移位寄存器,当一个明文字节到达时,加密盒对移位寄存器中的内容进行DES加密,所得密文块的最左边字节取出与明文字节进行异或,异或的结果即为密文字节,输出密文字节,同时该密文字节移入移位寄存器,算法开始时移位寄存器中需要一个初始矢量.
由于移位寄存器的内容与以前的明文历史都有关系,因此在明文中重复多次的形式在密文中出现时都不同.
密码反馈方式的缺点是,如果密文块中的一个比特在传输时出错,那么当这个出错的比特位于移位寄存器中时,解码出来的8个字节都是有错的.
如果要限制1比特出错的影响范围,可以使用流密码方式,如图8-14所示.
使用流密码的一个必要特性是密文的长度要和明文的长度相等.
开始时,加密盒使用密钥K加密一个初始矢量,输出结果称为密钥流;当一个明文字符到达时,明文字符与密钥流相异或,结果作为密文字符输出,同时密钥流重新进入加密盒,用于生成下一个密钥流.
密钥流只与初始矢量及密钥K有关,是独立于数据的,因此密钥流可以预先计算好,而且它不受数据传输错误的影响.
接收端解密时使用相同的初始矢量及密钥生成相同的密钥流,然后与收到的密文字符进行异或即可恢复明文字符,而且密文字符的1比特错误只会影响解码后的明文字符的1比特.
使用流密码时需要注意,在两次会话时不要使用相同的(初始矢量,密钥)对.
以上四种方式中,除了电子密码本以外其它方式均不支持随机访问.
当文件是以加密的形式存储在磁盘上,而应用需要按非顺序方式访问文件时(如读文件中的一个记录),那么必须解码该记录之前的所有记录(或者在流密码方式中计算出当前的密钥流),这是很麻烦的.
这时可以使用计数器方式,如图8-15所示.
开始时,加密盒使用密钥K加密一个初始矢量,其输出与第一个明文块异或生成密文块,以后每处理一个明文块时初始矢量加1,然后对新的矢量加密后的输出就与明文块作异或生成密文块.
这样当需要访问文件中的记录i时,只需将初始矢量加上i,然后用加密盒的输出对密文块异或即可.
在这里同样需要注意,在两次会话时不要使用相同的(初始矢量,密钥)对.
3.
公开密钥算法20世纪70年代后期之前,所有加密算法均为对称加密算法,要求通信双方共享一个用于加密和解密的秘密密钥.
这种方法带来的问题是双方必须就共享密钥达成一致,但是这样做的前提是需要通信.
传统上由一个中心密钥生成设备产生一对相同的密钥,然后由人工信使将其传送到各自的目的地,这种密钥分发方法在今天显然是不能令人满意的.
在当今的网络世界中,通信各方之间可能从未见过面,也不会在网络以外的任何地方见面或交谈,如何在没有预先商定共享密钥的条件下进行加密通信呢1976年,Diffie和Hellman论证了一个解决该问题的算法,现在称为Diffie-Hellman密钥交换算法,从根本上改变了人们研究密码系统的方式.
在Diffie和Hellman设想的密码系统中,加密密钥和解密密钥是不同的,并且从加密密钥不能推出解密密钥,从而加密密钥可以公开,这也是公开密钥算法名称的由来.
Diffie和Hellman提出了公开密钥算法必须满足的条件:从计算上说,生成一对加密密钥和解密密钥是容易的;从计算上说,已知加密密钥,从明文计算出密文是容易的;从计算上说,已知解密密钥,从密文计算出明文是容易的;从计算上说,从加密密钥推出解密密钥是不可能的;从计算上说,从加密密钥和密文计算出原始明文是不可能的.
公开密钥算法的使用在概念上相当简单.
每个希望接收秘密报文的用户生成一个加密密钥和解密密钥对,然后将加密密钥放在一个公开的文件中发布.
当两个完全陌生的用户希望进行秘密通信时,可从公开的文件中查到对方的加密密钥.
当A想向B发送一个秘密报文(如A选择的一个共享密钥)时,A用B的加密密钥和一个众所周知的(如已标准化的)加密算法对报文进行加密,然后将密文发送给B,B用自己的解密密钥及相应的解密算法解密报文,就可以得到这个共享密钥.
由于B的加密密钥是公开的,因此任何人都可以向B发送秘密报文,但只有B能够解密这些报文.
利用这种方法传递共享密钥既安全又方便.
在该算法中每个用户都使用两个密钥,一个是供其他人用来向他发送报文的加密密钥(公开的),另一个是自己用来对收到的密文进行解密的解密密钥(保密的).
通常用公开密钥(简称公钥)和私有密钥(简称私钥)分别称呼公开密钥算法中的加密密钥和解密密钥,以同常规加密算法中的秘密密钥相区分.
由于公钥是公开的,而私钥只由用户自己掌握,不需要分发给别人,因此公开密钥算法没有安全分发密钥的问题.
Diffie和Hellman只是提出了公开密钥算法的设想,并没有证明这样的算法存在.
由于公开密钥算法潜在的优越性,研究者们一直在努力寻找符合以上条件的算法.
已经有一些算法被提了出来,其中最著名的是由M.
I.
T.
的一个研究小组提出、并以三个发现者名字的首字母进行命名的RSA算法.
RSA算法建立在数论的基础上,在此我们不对算法进行理论上的推导,只是说明如何使用这种算法.
(1)选择两个大素数p和q(典型值为大于10100);(2)计算n=p*q和z=(p-1)*(q-1);(3)选择一个与z互质的数,令其为d;(4)找到一个e,使满足e*d=1(modz).
计算了以上参数后,就可以开始加密了.
首先将明文看成是一个比特串,将其划分成一个个的数据块P,且有0≤P
对C进行解密时,计算P=Cd(modn).
可以证明,对于指定范围内的所有P,其加密函数和解密函数互为反函数.
由于加密使用的参数为e和n,解密使用的参数为d和n,所以公钥由(e,n)组成,私钥由(d,n)组成.
为了演示RSA算法的使用,在此举一个简单的例子.
假设取p=3,q=11,则n=33,z=20.
由于7和20没有公因子,可取d=7;解方程7*e=1(mod20),得到e=3.
于是公钥为(3,33),私钥为(7,33〕.
假设要加密的明文为M=4,则C=Me(modn)=43(mod33)=31,于是对应的密文为C=31.
接收方收到密文后进行解密,计算M=Cd(modn)=317(mod33)=4,恢复出原文.
RSA算法的安全性建立在难以对大数提取因子的基础上.
如果破译者能对已知的n提取出因子p和q,就能求出z;知道了z和e,就能利用Euclid算法求出d.
所幸的是,300多年来虽然数字家们已对大数因式分解的问题作了大量研究,但并没有取得什么进展,到目前为止这仍是一个极其困难的问题.
据Rivest等人的推算,用最好的算法和指令时间为1微秒的计算机对一个200位的十进制数作因式分解需要40亿年的机器时间,而对一个500位的数作因式分解需要1025年.
即使计算机的速度每10年提高一个数量级,能作500位数的因式分解也是在若干世纪之后.
然而到那时,人们只要选取更大的p和q就行了.
应该指出的是,虽然RSA算法具有安全方便的特点,但由于RSA处理的都是很大的数,计算开销很大,速度很慢,所以一般仅用来加密少量的数据,如用于鉴别、数字签名或发送一次性的秘密密钥等.
大量数据的传输仍然使用对称加密算法.
4.
消息鉴别加密可以用来抵御被动攻击,抵御主动攻击则需要使用消息鉴别.
一个消息被称为是可信的,如果它是真实的并且来自声称的源.
消息鉴别是一种允许通信各方检验收到的消息是否可信的过程,它要验证两个方面:传输的内容是否被修改过,以及源是否可信.
因此,消息鉴别涉及数据起源鉴别和数据完整性检查两个方面.
如果通信的双方共享一个秘密密钥,那么采用常规加密算法进行消息鉴别是可能的.
发送方用共享的密钥加密整个消息,发送给接收方;如果接收方能够正确解密收到的消息,则消息必是可信的,因为假冒者不会知道这个密钥.
然而这么做混淆了保密和鉴别两个概念,有时候我们只需要知道消息是否可信,消息本身并不需要保密,加密整个消息会带来不必要的计算开销.
比如,网络管理员要向全网用户发送一个通告,这个消息不需要保密,但用户需要判断这个消息是否可信.
解决这个问题的较好方法是,发送者用明文发送消息,但在消息后面附上一个标签,允许接收者利用这个标签来鉴别消息的真伪.
消息鉴别标签必须能够检查消息的完整性.
消息的完整性可以用消息的"数字指纹"来保护,而"数字指纹"可以用散列函数来生成.
将一个散列函数H作用到一个任意长的消息m上,生成一个固定长度的散列值H(m).
由于散列值是消息中所有比特的一个函数值,当消息中任意一个比特或若干比特发生改变时,都将导致散列值发生变化,因此这个散列值称为消息的"数字指纹",也称消息摘要(messagedigest,MD).
发送者对发送的消息计算一个消息摘要,并和消息一起发送给接收者;接收者对收到的消息也计算一个消息摘要,并和收到的消息摘要进行比较,就可以验证消息的完整性.
为使消息鉴别标签可以用来鉴别消息,标签本身还必须是可信的,即标签必须是不可伪造的.
如果发送方和接收方共享一个秘密密钥,那么发送方可先用常规加密算法对消息摘要进行加密,然后将加密后的消息摘要(鉴别消息标签)附在消息后面发送;接收方先用相同的散列函数对收到的消息计算消息摘要,然后与解密标签得到的消息摘要进行比较,两者相同则表明消息是可信的.
第二种方法是使用公开密钥算法加密消息摘要,这时得到是实际上是一个数字签名.
以上两种方法都用到了加密.
虽然与加密整个消息相比,仅加密消息摘要的计算开销要小很多,但是开发一个不需要加密算法的消息鉴别技术仍然是非常必要的.
这是因为:(1)加密软件通常运行得很慢,即使只要加密少量的数据;(2)加密硬件的代价是不能忽略的;(3)加密算法可能受专利保护(如RSA),因而使用代价很高;(4)加密算法可能受到出口控制(如DES),因此有些组织可能无法得到加密算法.
这个问题可用加密散列函数(cryptographichashfunction)来解决,加密散列函数在计算消息摘要时需要包含一个密钥,但它并不使用加密算法,因而在没有加密算法的环境下也能使用,并且运行速度很快.
例如,A和B之间共享一个秘密密钥KAB;当A想向B发送一个带鉴别标签的消息时,A将KAB和消息M串接在一起计算消息摘要MD,即MD=H(KAB||M),然后将M和MD发送给B;B将自己的密钥与收到的消息串接在一起计算消息摘要,然后与收到的MD进行比较,即可判断消息的真伪.
散列函数有很多种,用于消息鉴别的散列函数H必须满足以下特性:H能够作用于任意长度的数据块,并生成固定长度的输出;对于任意给定的数据块x,H(x)很容易计算;对于任意给定的值h,要找到一个x满足H(x)=h,在计算上是不可能的,这个特性称为单向性;对于任意给定的数据块x,要找到一个y≠x并满足H(y)=H(x),在计算上是不可能的;要找到一对(x,y)满足H(x)=H(y),在计算上是不可能的.
前两个特性是对散列函数应用于消息鉴别的实用性要求.
单向性是指从给定的x计算H(x)很容易,但反过来,从H(x)反推出x是不可能的.
这个特性对于使用加密散列函数进行消息鉴别很重要.
在使用加密散列函数进行消息鉴别时,虽然密钥并不随消息一起传输,但是如果散列函数的单向性不好,攻击者可以通过以下方法找到密钥.
攻击者首先截获消息M和消息鉴别标签MD=H(KAB||M),然后从MD反推出KAB||M;由于已知M,这时得到KAB是很容易的事.
第四个特性保证不可能找到另一个与原始消息不同的消息,使得两者的消息摘要相同.
这个特性对于使用加密的消息摘要进行消息鉴别(第一和第二种方法)非常重要,如果该特性不成立,攻击者可以通过以下方式伪造消息.
首先截获消息M及加密的消息摘要,其次对收到的消息M计算不加密的消息摘要H(M),然后找到一个不同于M的消息M',使得H(M')=H(M),最后用消息M'替换M即可.
满足前四个特性的散列函数称为弱散列函数,如果最后一个特性也满足,则称强散列函数.
强散列函数可抵抗一种称为生日攻击的复杂攻击行为.
目前使用最多的两种散列函数是MD5和SHA-1.
MD5接受任意长度的消息作为输入,输出128比特的消息摘要.
随着处理器速度的提高,128比特散列码的安全性受到质疑.
据推测,寻找有相同消息摘要的两个消息的计算难度为264次操作量级,而寻找具有给定消息摘要的一个消息的计算难度为2128次操作量级.
从安全的角度来说,第一个数值太小,而且许多密码分析攻击也发现了MD5的一些弱点.
安全散列算法SHA-1(SecureHashAlgorithm)是美国联邦政府的标准,它接受长度不超过264比特的输入消息,输出长度为160比特的消息摘要.
较长的输出长度使得SHA-1比MD5更安全.
MD5和SHA-1并不能直接用做加密散列函数,因为它们不依赖于密钥.
如何将一个秘密密钥包含到一个已有的散列算法中,已有许多方案提出来,其中获得最多支持的方案称为HMAC(HashedMessageAuthenticationCode).
HMAC建立在已有散列算法的基础上,它将已有散列算法看成是一个"黑盒",已有散列算法的实现只是作为一个模块集成在HMAC的实现中,任何时候都可以用一个新的散列算法来替换原先的散列算法.
HMAC已经发布为RFC2104,并已应用到许多安全协议中,如IP安全协议(IPSecurity)、传输层安全协议(TransportLayerSecurity)和安全电子交易(SecureElectronicTransaction)等.
5.
数字签名数字签名应该具有以下三个功能:接收方能够验证发送方声称的身份;发送方过后不能否认他发过报文;接收方不能够伪造报文.
对称密钥签名这种方法需要一个所有用户都信任的中心机构,每个用户和这个机构有一个共享的秘密密钥,除此之外,该机构还有一个对任何用户都保密的密钥.
当用户A希望向B发送一条签名的报文时,A用与中心机构共享的秘密密钥对报文进行加密,发送给中心机构.
中心机构解密后,用自已的密钥对报文进行加密形成签名,然后将签名附加在报文后面,再用与B共享的秘密密钥加密所有内容,发送给B.
过程如图8-18所示.
为防止重放攻击,报文中还需要加上序号和时间戳.
公开密钥签名使用对称密钥签名需要一个大家都信任的中心机构,公开密钥签名没有这个限制,但使用公开密钥签名对公开密钥算法有一个额外的要求,就是必须满足E(D(P))=P.
当A希望向B发送一条签名的报文P时,他发送EB(DA(P)),DA(P)就是A的数字签名.
B用自已的私有密钥DB解密EB(DA(P)),保存好DA(P),然后用A的公开密钥EA解密DA(P),得到P.
过程见图8-19.
通过加密消息摘要进行签名以上两种签名方案将鉴别和保密混在了一起.
有时候我们只想用签名来表示报文是有效的,而并不想对报文进行加密,将报文整个加密会增加很多的开销.
将签名和保密区分开来可以使用消息摘要.
发送方在计算出消息摘要后,使用对称密钥算法或公开密钥算法对其加密,就生成了数字签名.
比如在图8-18的例子中,中心机构在发给Bob的消息中用KBB(A,t,MD(P))来代替KBB(A,t,P).
实际中最常用的数字签名方法,是用发送方的私钥对消息摘要进行加密,如图8-20.
采用公开密钥算法进行签名的有效性是建立在私钥保密的前提下的,一旦私钥泄露或被故意公开,则签名的有效性就不存在了,另外用户也可能会定期地改变他的密钥,因此需要有一个可信任的密钥管理机构来记录密钥的改变及改变的时间.
6.
公钥管理使用公开密钥算法的一个关键问题是如何可靠地发布公钥.
如果只是将公钥简单地发布在一个可公开访问的文件中,那么很容易受到欺骗攻击,如图8-23的例子.
因此,为使公钥密码体系有实际应用,每个实体必须能够确定它得到的公钥确实来自声称的实体.
证书为了使密钥分发具有可扩展性,没有使用集中式的密钥分发中心,而是引入了证书机制,即用证书来证明某个主体(如个人、公司、组织等)拥有某个公钥,颁发证书的机构称为认证机构(CA).
证书的主要作用是将一个公钥绑定到一个主体上,证书本身并不需要保密,因此当一个主体获得证书后,可以将证书放在任何可公开访问的地方,比如他的主页上.
由于证书上有CA的签名(对证书内容进行SHA-1散列,并用CA的私钥对报文摘要加密),因此任何人都无法篡改证书的内容,因而图8-23例子中的攻击会被挫败.
尽管证书的标准功能是将一个公钥绑定到一个主体上,但证书也可以将一个公钥绑定到一个属性上,这一点在安全系统中特别有用,因为在安全控制中常常是基于属性而不是单个的主体来授予对资源的访问权限.
当证书的持有者想要访问某个资源时,必须提交相关的证书.
访问控制模块要对访问者进行认证,方法是选取一个随机的大数,用证书中的公钥加密后发给访问者,访问者用私钥解密后将这个随机数返回,访问控制模块检查这两个数是否相同,相同则说明访问者确实拥有这个证书,然后根据证书中携带的属性授予访问者相应的资源访问权限.
X.
509X.
509是通用的证书标准,它规定了证书的格式,X.
509v3是最新的版本.
证书中主要的一些域列于表8-25中,其中主体名字在第3版中可以使用DNS名字,在扩展域中可以放入主体的属性.
X.
509建立在公开密钥算法和数字签名的基础上,数字签名方案要求先使用一个散列函数,除此之外,X.
509没有规定必须采用哪种公开密钥算法(建议采用RSA)和散列算法.
当Bob获得了Alice的公钥证书后,如果Bob有签发该证书的CA的公钥,则可用以下方法鉴别证书.
Bob用CA的公钥解开证书的签名,得到证书内容的散列码;然后Bob对收到的证书内容计算一个散列码;如果与解密得到的散列码相同,Bob可以确信这就是Alice的公钥证书,而证书中的公钥就是Alice的公钥.
公钥基础设施PKI从可扩展性和安全性的角度出发,采用统一和集中式的CA签发证书是不合适的,目前采用的技术称为公钥基础设施PKI.
它包含由不同组织运行的CA,每个CA拥有自己的私钥,负责为一部分用户签发证书.
PKI由多个要素组成,包括用户、CA、证书和目录等.
PKI提供了一种组织这些要素的方法,并为各种文档和协议制订标准.
PKI的一种最简单的形式是分级的CA结构,如图8-26所示.
它包括三个等级(实际情况可能与此不同),根CA证明第二级CA,第二级CA证明第三级CA,第三级CA向组织或个人颁发X.
509证书.
当根CA授权一个第二级CA时,它会生成一个X.
509证书,声明批准这个CA,证书中放入这个第二级CA的公钥,签名后发送给新的CA.
类似地,第二级CA授权一个第三级CA时,它也会生成并签名一个包含新CA公钥的证书,声明它批准这个CA,然后将证书发送给新的CA.
在图8-26的例子中,假定A希望获取B的公钥以便与B进行通信,A进行查找并找到一个由CA5签发的包含有B的公钥的证书.
但A从没听说过CA5(因而也没有CA5的公钥),于是他要求CA5出示它的证书,于是CA5出示由RA2签发的包含有CA5公钥的证书.
有了CA5的公钥,A可以验证B的证书确实是由CA5签发的.
如果A信任RA2(即有RA2的公钥),他可以验证CA5证书的合法性,从而确信B的证书是合法的.
如果A不信任RA2(没有RA2的公钥),他可以要求RA2出示它的证书,于是RA2出示由根CA签发的包含有RA2公钥的证书,有了RA2的公钥,A可以验证CA5确实是RA2签发的.
如果A信任根CA(有根CA的公钥),A就可以验证RA2证书的合法性,从而CA5证书及B证书的合法性.
但是A又从哪儿获取根CA的公钥呢根CA是信任的始点,系统中所有的实体都以根CA的公钥作为它们的信任锚,也就是它们对所有证书验证决策的信任始点.
系统中每个实体都必须拥有根CA的公钥,该公钥的安装是在这个模型中为随后进行的所有通信进行证书处理的基础,因此必须通过一种安全的带外方式来完成,例如通过安全的物理途径(纸质信件、打电话、派人)取得这个密钥.
实际上A可能并不需要逐级地获取证书,B通常会收集所有必需的证书,如CA5和RA2的证书,连同自已的证书一起发送给A.
A利用自已掌握的根的公钥验证RA2证书,利用RA2的公钥验证CA5的证书,再用CA5的公钥验证B的证书.
由于所有的证书都是签名的,因此A很容易可以判断证书的完整性.
从叶结点到根的一系列证书有时称为信任链或证书路径,这种技术在实践中广泛使用.
谁可以来运行根CA呢实践中常采用分布式的信任结构,即有许多的根CA,每个根CA下是严格的层次结构,用户可以自行决定信任哪个根CA,所有根CA间可以进行交叉认证.
实际上,许多根CA的公钥被预装在了浏览器上,这些根CA由浏览器厂商认证并嵌入到软件中,随软件一起发布.
虽然浏览器提供了检查和修改(增加或删除)根密钥的方法,但是几乎没有用户对于PKI和安全问题精通到可以理解和修改浏览器这一方面行为的程度.
PKI的另一个问题是证书存放在哪儿一种方案是使用DNS作为证书目录,因为当需要与一个用户通信前,通常必须利用DNS查找该用户的IP地址,那么同时让DNS返回用户的整个证书链也是很方便的,该方案已有一个标准,称为DNSSEC.
另一种方案是使用专门的目录服务器存放证书,相应的标准为LDAP.
每个证书都有有效期,证书过期后自然就失效了.
但有时需要CA显式地撤消证书(如密钥泄露了),这要求CA定期地发布证书撤消表CRL,表中给出已经撤消的证书序列号.
每个用户在使用一个证书前都要去获取CRL,检查该证书是否在CRL中.
CRL可以与证书存放在一起,CA定期地将CRL推进目录,由目录负责将CRL中列出的证书清除掉.
7.
通信安全通信安全是网络安全中需要解决的最重要问题之一,它涉及如何将数据秘密而完整地从发送端传送给接收端,并且如何将有害的数据拒之门外.
因特网协议栈上的每一层都可以提供安全服务,如果在某个特定的应用层协议(如电子邮件、Web等)上提供安全服务,则使用这一协议的所有应用程序都能够得到安全保护;如果在某个传输层协议(如TCP)上提供安全服务,则所有使用这一传输层协议的应用程序都可以得到安全保护;如果在网络层上提供安全服务,则所有传输层报文都可以得到安全保护;如果在某段链路上提供安全服务,则所有经过这个链路的数据包都能得到安全保护.
一般来说,较低层上的安全服务比在较高层上的安全服务提供更广泛的安全覆盖.
IPSecIP层是TCP/IP网络中非常关键的一层,其安全机制可对上层的各种应用服务提供透明的覆盖式安全保护.
因此,IP安全是整个TCP/IP安全的基础,是Internet网络安全的核心.
但是IPv4在最初设计时并没有怎么考虑安全性,它缺乏对通信双方真实身份的鉴别能力,缺乏对网上传输的数据的完整性和机密性保护,加上IP地址可软件配置以及基于源IP地址的认证机制,IP层上的数据流很容易被监听、捕获和篡改,IP层也很容易遭受IP地址欺骗攻击.
为了实现安全IP,IETF专门成立了一个IP安全协议工作组来制定和推动一套称为IPSec的IP安全协议标准,其目标是把安全特征集成到IP层,以便对Internet的安全业务提供低层的支持.
IPSec是指IETF以RFC形式公布的一组安全IP协议集,它实际上提供了一个用于集成多种安全服务、密码算法及安全控制粒度的安全体系结构框架.
IPSec提供的安全服务主要包括访问控制、无连接完整性、数据起源认证、抗重放攻击、机密性等,安全服务全都基于对称密钥加密,因为这样可以获得很高的性能.
IPSec的安全机制都是独立于算法的,这样在选择和改变算法时不会影响其它部分的实现.
多种安全控制粒度使得IPSec既可以用于保护一条TCP连接的通信,也可以用于保护一对主机间的通信,也可以用来保护一对安全路由器之间的所有通信等.
IPSec是面向连接的,在IPSec的上下文里"连接"指的是安全关联SA.
SA是通信对等方之间对某些要素的一种协定,如使用的IPSec协议、协议的操作模式、使用的密码算法、密钥及密钥的生存期等.
SA是两个通信端点间的一个单工连接,由一个安全参数索引(SPI)唯一标识,如果在两个方向都需要安全通信,则需要建立两个SA.
SPI携带在数据包中,由数据包的处理进程用来查找密钥及相关信息.
从技术上说IPSec主要包括两个部分,一部分是IPSec安全协议,另一部分是密钥管理协议.
IPSec安全协议定义了如何通过在IP数据包中增加扩展头和字段来保证IP包的机密性、完整性和可认证性,它包括AH和ESP两个协议.
密钥管理协议定义了通信实体间进行身份认证、创建SA、协商加密算法以及生成共享会话密钥的方法,该协议称为Internet密钥交换协议IKE.
以下只介绍IPSec安全协议.
IPSec可用于两种模式,传输模式和隧道模式.
在传输模式中,IPSec头被插入到原始数据包的IP头和传输层头之间,原始IP头中的protocol域修改为指向IPSec头,而IPSec头中的nextheader域指向传输层头.
在隧道模式中,整个原始数据包被封装在一个新的IP包中,IPSec头被放在新的IP头和原始IP头之间,隧道的端点(新IP头中的地址)通常是IPSec防火墙、安全网关或路由器.
使用隧道技术可以对外隐藏内部网络的细节,而且内部网络上的主机也可以不运行IPSec,它们的安全性由防火墙或网关来保证.
隧道模式也可用于将一束TCP连接聚合成一个加密流,从而有效地防止入侵者进行流量分析.
AH协议鉴别头部(AH)协议用于提供无连接的完整性、数据起源认证和抗重放攻击服务,但它不提供机密性服务,即不对数据进行加密.
AH头中重要的域包括:SPI:SPI是一个32比特的数,它和源地址或目的地址、IPSec协议(AH或ESP)一起唯一地标识一个SA.
序号:序号是一个32位的整数,用于对SA上发送的数据包进行编号.
建立SA时序号初始化为0,每用这个SA发送一个数据包序号就加1,重发数据包时序号也加1,接收端利用这个序号来检测重放攻击.
对于一个特定的SA来说,它的序号不能循环,因此当在一个特定的SA上传输的数据包数量达到232个之前,必须协商一个新的SA以及新的密钥.
鉴别数据:这是一个包含数据鉴别码的可变长度域,对于IPv4包它必须是32的整数倍,对于IPv6包它必须是64的整数倍,必要时需要添加填充比特使之达到所需要的长度.
计算消息鉴别码使用的算法及密钥都包含在SA中,从计算速度考虑,这里使用了对称密钥算法.
为保证互操作性,AH强制所有的IPSec实现都必须支持HMAC-MD5和HMAC-SHA-1.
值得一提的是,AH的完整性检查还覆盖了IP头中的一些域.
在传输模式中,完整性检查覆盖了IP头中那些在逐跳传输过程中不变的域,如源和目的地址、版本号、分组标识等,可变的域在计算时置为0.
而在隧道模式中,完整性检查覆盖内部IP头的所有域及外部IP头的不变域.
因此,AH还可用于提供数据起源认证.
ESP协议封装安全载荷(ESP)协议提供数据机密性、数据起源认证、无连接完整性、抗重放攻击和有限的数据流机密性服务.
实际上,ESP提供的服务和AH的类似,另外还增加了两个额外的服务,数据机密性服务和有限的数据流机密性服务.
机密性服务通过加密IP包的相关部分来实现,数据流机密性则由隧道模式下的机密性服务提供.
ESP数据包大致分为ESP头、载荷数据、ESP尾和ESP认证数据几个部分.
ESP头包含SPI和序号;载荷数据部分含有实际的载荷数据(即数据包加密部分的密文),如果加密算法需要初始化矢量(IV),也放在载荷数据中传输;ESP尾包括填充(需要的话)、填充长度和下一个头,ESP尾也要被加密;鉴别数据包含对ESP头、载荷数据和ESP尾计算的消息鉴别码,若使用HMAC-MD5该域长128比特,若使用HMAC-SHA-1该域为160比特.
传输模式和隧道模式下的ESP见图8-28.
在传输模式下,ESP被放在原始IP头之后,原始数据包的载荷部分被加密,认证数据覆盖除认证数据域以外的整个ESP,因而可以提供数据机密性服务、无连接完整性和抗重放攻击.
但是由于原始IP头未被加密,因此它不能提供数据流机密性服务.
另外原始IP头也没有被认证数据覆盖,因此在传输的过程中可能被修改,如果修改后头校验和计算正确,目的主机将无法检测到修改.
因此,ESP传输模式下认证服务所提供的安全性就不如AH传输模式.
在隧道模式下,ESP被插在原始IP头之前,整个原始数据包被加密成为ESP的载荷,另外生成一个新的IP头插在ESP之前.
由于整个原始数据包被加密(包括源和目的IP地址),因此可提供数据流机密性服务,另外认证数据覆盖除认证数据域以外的整个ESP,因而也提供无连接完整性、数据起源认证和抗重放攻击.
ESP隧道模式认证和加密服务所提供的安全性要强于ESP传输模式.
虚拟专用网VPN在公用数据网络出现之前,许多公司利用电信专线将分散在各地的计算机(网络)连接起来形成专用网络,如图8-30(a)所示.
专用网络是非常安全的,但是租用线路非常昂贵.
当因特网出现之后,这些公司希望将它们的数据业务搬到因特网上,但希望仍然拥有象专用网那样的安全性.
实现这一目标的设想就是虚拟专用网VPN,VPN是建立在公用网上的一个虚拟网,它具有专用网的大部分特性.
典型的VPN结构如图8-30(b)所示,在每个局域网上设置一个安全网关,在每一对安全网关之间创建一条穿过因特网的隧道.
如果在隧道中使用IPSec,那么可以将两个局域网间的所有通信流都聚合到同一个认证和加密的SA上,从而在这两个局域网间提供完整性控制及机密性服务,甚至对流量分析也有相当的抵御能力.
系统建立时,每一对安全网关必须协商它们的SA参数,包括安全服务、工作模式、加密算法及密钥等.
一旦在一对安全网关之间建立了一个SA,这一对安全网关之间的数据流就可以绑到这个SA上.
对于因特网中的路由器来说,沿VPN隧道传输的数据包与普通数据包是一样的,唯一的不同是在普通IP头后面有一个IPSec头.
但由于路由器只根据外层IP头来转发,因而这个IPSec头对于路由器来说是不可见的.
VPN的优点是它对于用户软件是完全透明的,当系统管理员配置好安全网关以后,就由安全网关来自动建立和管理SA,不需要用户软件做任何事情,而用户就好象是在使用一个租用专线的专用网络一样.
由于许多局域网使用防火墙作为安全网关,而防火墙一般都具有内置的VPN能力,将安全隧道的端点放在防火墙上是很自然的选择.
因此,防火墙、VPN和IPSec(特别是隧道模式下的ESP)是实践中最常见的组合.
防火墙现在越来越多的组织(如高校、公司、政府机构等)建立了自己的信息系统.
对于大多数组织来说,因特网连接不再是一个可有可无的选项,而是关系到其生存发展的必要条件.
然而,因特网访问在为这些组织带来好处的同时,也使得这些组织的信息系统暴露在外部世界面前,易于遭到各种安全攻击.
尽管有可能在内部网的每个工作站和服务器上配备最安全的保护措施(如入侵检测),但这种方案在实际中是无法实现的,不仅代价昂贵,而且难以管理.
目前普遍采用的做法是在内部网和外部网之间插入一个安全控制点,管理员在这个点上集中实施对整个内部网络的安全保护.
防火墙是在内部网络和因特网(外部网络)之间执行访问控制策略的一个或一组系统(包括硬件和软件),目的是保护内部网络免受来自因特网的攻击.
本质上,防火墙遵循的是一种允许或阻止业务往来的通信安全机制,即提供可控的通信过滤服务,只允许合法的通信.
防火墙的设计目标是:(1)所有进出网络的流量必须通过防火墙,(2)只允许合法的流量通过防火墙,(3)从理论上说,防火墙是穿不透的.
满足以上设计目标的典型的防火墙结构如图8-29所示.
防火墙由两个分组过滤路由器和一个应用网关组成,分组过滤器路由器根据分组的IP头及传输层报头的某些域过滤分组,应用网关则根据应用层信息过滤分组,只有满足安全策略的分组才被转发.
典型地,内部网和外部网上各有一个分组过滤路由器,内部网上的分组过滤路由器过滤输出的分组,而外部网上的分组过滤路由器过滤输入的分组,每个通过第一关检查的分组进入应用网关进行进一步检查.
将两个分组过滤路由器放在不同的网上并通过应用网关相连,目的是迫使每个分组必须通过应用网关的检查.
在实际使用时,应用网关通常运行在一个称为堡垒主机的独立的计算机系统上.
堡垒主机必须是非常安全的,其操作系统必须具有较高的安全级别,并且只安装被系统管理员认为必需的网络服务.
防火墙使用两种基本机制:分组过滤和应用代理.
分组过滤路由器按照系统管理员配置的访问控制列表(AccessControlList,ACL)转发或丢弃分组,ACL列出了过滤分组的规则.
分组过滤通常基于分组的以下域进行:源/目的IP地址,源/目的传输层端口,协议字段.
对于已知的不良站点,通过将这些站点的IP地址列入禁止的通信端点,可禁止内部用户访问这些站点.
由于因特网服务一般使用固定的熟知端口,通过允许或禁止某些端口可达到开放或关闭某些服务的目的.
比如,允许TCP端口25和80相当于开放电子邮件和Web服务,而禁止TCP端口23可防止外部入侵者远程登录到内部主机上.
但是当服务使用动态指定的端口时,根据端口来过滤分组就比较困难.
ACL也可以禁止某一种协议报文通过,比如过滤UDP包是常用的过滤策略,这是因为UDP通信较难进行安全控制.
对于不匹配ACL中任何一条规则的分组,应明确规定是执行转发还是丢弃操作.
如果缺省操作是丢弃,则防火墙的安全策略比较保守,所有允许的通信必须在ACL中明确定义.
但这对端用户的使用来说不太方便,因为新的通信必须在ACL中定义后才能使用.
如果缺省操作是转发,则满足新的通信需求比较方便,但系统的安全性也降低了.
对于每一种新的安全威胁,管理员必须及时将新的过滤规则加入到ACL中.
分组过滤的控制粒度是比较粗的.
比如,某个网络的安全策略希望仅允许有限的一组用户使用FTP,并且禁止用户下载被认为是有害的文件.
如果使用分组过滤,则只能根据地址及端口(协议)来过滤包,而不能基于用户的身份进行过滤,也不能基于消息的内容来过滤,这样以上的安全策略就无法实施.
另外,当允许内部主机直接访问外部服务器时,内部主机的网络地址会暴露.
对于攻击者来说,主机的网络地址是非常有用的信息.
为了实现基于用户身份和消息内容的访问控制,并且隐藏内部网络的细节,可以使用代理服务.
代理是运行在堡垒主机上的特定应用程序或服务程序,其作用是中继应用层流量.
代理接受用户对某个因特网服务器(如Web服务器)的请求,如果安全策略允许用户执行该操作,代理负责将请求转发到实际的外部服务器,然后接收外部服务器的响应,并将响应转发给请求的用户.
在这里,用户和外部服务器没有建立直接的TCP连接,用户只与堡垒主机建立连接,而堡垒主机与外部服务器建立连接.
对于外部服务器来说,它只能看到堡垒主机,因而内部网络的细节对外是完全屏蔽的.
对于用户来说,代理服务给出用户直接使用真正的服务器的假象.
但代理服务并不是将用户的所有服务请求都提交给因特网上的真正服务器,而是根据安全规则和用户的请求来判断哪一个能执行,哪一个不能执行.
代理服务能够对不同的用户执行不同的安全规则,而不是执行同一个标准.
代理服务的缺点是必须为每一个支持的应用安装代理,并进行安全配置,这些应用包括FTP、Telnet、Web、电子邮件等.
对于每一个这样的代理,系统管理员必须编辑三个文件建立自己的规则.
一个文件指定系统支持哪些服务以及这些服务运行在哪个端口上(管理员在这里设置代理将要运行的端口),一个文件指定当外部请求某一特定服务时激活哪个特定服务程序(管理员在这里指定代理,用它们替换缺省服务),第三个文件指定谁可以使用所提供的服务.
每一个应用会话都必须被代理,这意味着繁重的开销,因而应用代理对网络速度的影响很大.
防火墙并不能解决所有的安全问题.
比如,若防火墙仅允许接受某些站点来的数据包,则入侵者通过伪造数据包的源地址,可使数据包蒙混过关.
再比如,若入侵者想要向外传递一些机密文件,他可以对文件进行加密,或者将文件扫描成JPEG文件送出,这些都可以逃过字符过滤器的检查.
另外,约70%的攻击来自于防火墙的内部,而这些攻击是防火墙不能防范的.
还有一类攻击是防火墙无法对付的,那就是拒绝服务攻击(DoS).
攻击者通过向目标主机发送大量的合法数据包使主机崩溃,比如向目标主机发送大量的TCP连接请求(称为SYNFlood攻击),耗尽主机的资源,使主机不能提供有效的服务.
通常这些请求包中的源地址是假的,因此入侵者很难被追踪.
当入侵者攻陷了多个主机,并且令多个主机同时向目标主机发动DoS攻击时,这称为分布式拒绝服务攻击(DDoS).
这种攻击更难抵抗,因为数据包来自于多个主机,这使得攻击的特征变得不明显.
即使被攻击的主机能够很快识别出假请求,它也需要时间处理和丢弃这些请求,当到来的请求很多时,CPU可能会花费所有的时间去处理它们.
8.
鉴别协议鉴别是用来验证通信对方身份的一种技术.
要在一个不安全的网络上验证一个远程实体的真实身份是一件很困难的事,需要使用基于密码技术的复杂协议.
所有的鉴别协议经常使用的一个模型是,通信的发起方A向另一方B或者一个可信任的密钥分发中心KDC发送一个消息,开始鉴别过程;此后双方或三方互相交换消息进行身份验证和协商会话密钥;在此过程中主动的入侵者可能会截获消息、篡改消息并进行重放攻击;但是当鉴别过程结束后,每一个通信实体都确认了对方的身份,同时双方之间也建立起了一个会话密钥.
8.
1KerberosKerberos要解决的问题是:在一个开放的分布式环境中,工作站用户要访问分布在网络中的应用服务器.
我们希望应用服务器只被授权用户访问,因而服务器应能鉴别用户的服务请求.
为减轻应用服务器的负担,Kerberos没有让应用服务器承担复杂的鉴别工作,而是提供一种集中式的鉴别服务,即由网络中的一台或几台鉴别服务器专门为用户和服务器提供双向鉴别服务.
和大多数鉴别协议不同的,Kerberos只依靠对称加密算法进行鉴别,而没有使用公开密钥算法.
目前使用的Kerberos有第4版和第5版两个版本,第4版的Kerberos仍在广泛使用,第5版的Kerberos纠正了第4版中的一些不足,并作为提议的因特网标准发布在RFC1510中.
下面我们按照由简单到复杂的顺序来讨论鉴别过程中出现的问题,这有助于我们理解Kerberos协议中的许多设计考虑.
一个简单的鉴别方案首先考虑一种最简单的情形.
一个鉴别服务器(authenticationserver,AS)知道网络中所有用户的口令,并将这些口令保存在一个集中式的数据库中.
AS与每个应用服务器都有一个共享密钥,AS与不同服务器的共享密钥是不同的,这些密钥已通过某种安全方式分发到每一个服务器上.
当某个用户在工作站上向服务器V请求服务时,以下是一个简单的鉴别过程:(1)C→AS:IDC||PasswordC||IDV;(用户ID||用户口令||服务器ID)(2)AS→C:Ticket;Ticket=EKv[IDC||ADC||IDV],ADC为工作站地址(3)C→V:IDC||Ticket工作站上的客户进程C(client)首先要求用户输入口令,然后构造一个包含用户ID、用户口令和服务器ID的消息,以明文方式发送给AS.
AS查找数据库,检查用户口令是否正确以及该用户是否有访问服务器V的权限.
如果上述检查均通过,AS构造一个包含用户ID、工作站网络地址和服务器ID的票据(ticket),并用AS与服务器V共享的秘密密钥KV对票据进行加密,然后发送给客户进程.
有了票据之后,客户进程就可以向服务器请求服务了.
客户进程向服务器V发送一个包含用户ID和票据的请求消息.
服务器V用KV解密票据,检查票据中包含的用户ID和消息中携带的用户ID是否相同;如果两者相同,表明用户已被鉴别过,服务器向用户提供所需的服务.
加密票据的目的是为了防止票据被修改或伪造,在票据中包含服务器ID是为了让服务器核实其解密的结果是否正确,在票据中包含用户ID是为了表明该票据是签发给哪个用户的.
在票据中包含工作站的网络地址是为了防止以下攻击:攻击者截获票据,然后冒用IDC的名字在另一个工作站上向服务器V发送服务请求,服务器V将收到一个有效的票据(票据中的用户ID匹配消息中的用户ID),于是服务器准许另一个工作站上假冒IDC的攻击者访问服务器.
AS将请求票据的工作站地址包括在票据中,这样仅当票据从同一个工作站上发出时才是有效的.
一个更安全的鉴别方案以上的简单方案存在两个问题:(1)用户每请求一次服务,就要输入一次口令以获得一个票据,也就是说票据不能重用;(2)用户口令用明文形式发送,很不安全.
为解决这两个问题,我们引入一个新的鉴别方案.
该方案引入一个授予票据服务器TGS(ticket-grantingserver),专为那些经过AS鉴别的用户签发票据.
为此,客户进程首先为用户向AS请求一个准予票据的票据(ticket-grantingticket,Tickettgs),并将得到的Tickettgs保存在本地.
每当用户请求一个新的服务时,客户进程为用户向TGS请求一个访问该服务的票据,Tickettgs被客户进程用来向TGS表明用户的身份.
如果该用户有访问该服务的权限,TGS为用户签发一个访问特定服务器的票据(service-grantingticket).
客户进程将每个准予服务票据保存在本地,每当用户请求一个特定服务时,客户进程用相应的准予服务票据向服务器发出请求.
具体鉴别过程如下:(用户每次登录时执行(1)和(2))C→AS:IDC||IDtgs(2)AS→C:EKc[Tickettgs];Tickettgs=EKtgs[IDC||ADC||IDtgs||TS1||Lifetime1](用户每次请求一种新的服务时执行(3)和(4))(3)C→TGS:IDC||IDV||TickettgsTGS→C:Ticketv;Ticketv=EKv[IDC||ADC||IDv||TS2||Lifetime2](用户每次请求一个服务时,执行(5))(5)C→V:IDC||Ticketv当用户登录时,客户进程将用户ID和TGSID发送给AS,为用户请求一个Tickettgs.
AS为用户创建一个包含用户ID、工作站地址和TGSID的Tickettgs,加密后发送给客户进程.
加密Tickettgs使用的密钥KC是从用户口令中获取的,而用户口令是AS根据用户ID从数据库中找到的.
当客户进程收到响应消息后,提示用户输入口令,然后从用户口令中生成密钥,解密收到的响应消息.
如果用户提供了正确的口令,则可以顺利得到Tickettgs.
由于只有正确的用户知道这个口令,因此只有正确的用户能够恢复出Tickettgs,在这个过程中我们避免了通过网络来传输口令.
Tickettgs被客户进程用来请求多个准予服务票据,因此Tickettgs是可重用的.
注意到Tickettgs中还包括了一个时间戳TS(签发票据的时期和时间)和生存期Lifetime(票据有效的时间长度),这是为了防止以下形式的攻击.
攻击者截获Tickettgs,等用户注销后,假冒该用户的IDC登录到工作站C上,或干脆修改自己的工作站地址为ADC,向TGS发送Tickettgs,骗取所需要的准予服务票据.
当客户进程有了一个可重用的Tickettgs后,每次用户请求服务时就不需要再输入口令了.
另外,Tickettgs中的信息是用AS与TGS共享的密钥Ktgs加密的,这样可防止Tickettgs被修改.
而Tickettgs又用基于用户口令的密钥加密,保证了Tickettgs只能被正确的用户解密,提供了鉴别的作用.
当用户请求一种新的服务时,客户进程向TGS发送一个包含用户ID、服务器ID和Tickettgs的消息,为用户请求一个准予服务票据.
TGS解密Tickettgs,检查票据中是否包含TGSID(以此判断解密是否成功),检查票据的生存期,检查票据中的IDC和消息中携带的用户ID是否匹配,以及票据中的ADC与消息的发送地址是否匹配(以此来鉴别用户).
如果用户允许访问服务器V,TGS签发一个准予访问V的票据Ticketv.
Ticketv具有与Tickettgs相同的结构,也有时间戳和生存期,这样当用户过后请求一个相同的服务时,客户进程可以使用先前得到的Ticketv(如果尚未过期的话).
注意Ticketv中包含的内容是用TGS和服务器V之间的共享密钥加密的,以防止Ticketv被修改.
当用户有了特定的Ticketv之后,就可以访问服务器V了.
客户进程向服务器V发送一个包含用户ID和Ticketv的消息,服务器V通过使用票据中的内容来鉴别用户.
KerberosV4的鉴别过程新的鉴别方案比第一种方案增加了安全性,但仍有两个问题存在:(1)Tickettgs中的生存期设置多长比较合适如果生存期太短,用户就会被反复要求输入口令;如果生存期太长(如几个小时),就增加了攻击者实施重放攻击的机会.
Ticketv中的生存期设置过长也有同样的问题.
(2)用户可能也需要鉴别服务器.
如果没有这样的鉴别,攻击者可能会通过某种攻击手段将发往某个服务器的消息导向一个虚假的服务器,从而达到盗取用户信息以及拒绝服务攻击的目的.
票据生存期太长的安全隐患是攻击者可能截获票据,并在票据失效前使用它.
为此,服务器必须能够证明使用票据的人就是被授予票据的人.
解决该问题的一种方法是让AS同时向用户和TGS提供某个秘密信息,过后用户通过向TGS展示这个秘密来证明自己的身份.
Kerberos使用密钥作为这个秘密信息,这个密钥在Kerberos中称为会话密钥(sessionkey).
Kerberos鉴别过程的示意图见8-12,具体描述如下:(鉴别服务交换:获取Tickettgs)(1)C→AS:IDC||IDtgs||TS1(2)AS→C:EKc[Kc,tgs||IDtgs||TS2||Lifetime2||Tickettgs]Tickettgs=EKtgs[Kc,tgs||IDC||ADC||IDtgs||TS2||Lifetime2](授予票据服务交换:获取Ticketv)(3)C→TGS:IDv||Tickettgs||Authenticatorc(4)TGS→C:EKc,tgs[Kc,v||IDv||TS4||Ticketv]Tickettgs=EKtgs[Kc,tgs||IDC||ADC||IDtgs||TS2||Lifetime2]Ticketv=EKv[Kc,v||IDC||ADC||IDv||TS4||Lifetime4]Authenticatorc=EKc,tgs[IDc||ADc||TS3](客户/服务器鉴别交换:获得服务)(5)C→V:Ticketv||Authenticatorc(6)V→C:EKc,v[TS5+1](用于相互鉴别)Ticketv=EKv[Kc,v||IDC||ADC||IDv||TS4||Lifetime4]Authenticatorc=EKc,v[IDc||ADc||TS5]和前面的鉴别方案一样,当用户登录时,客户进程向AS发送一条消息,请求获取Tickettgs;而AS返回一条包含Tickettgs的消息,该消息用基于用户口令的密钥KC进行加密.
与之前方案不同的是,被加密的消息中还包含一个会话密钥Kc,tgs(下标表示这是用户与TGS之间使用的会话密钥),并且Tickettgs中也包含这个会话密钥.
由于这个会话密钥被包含在加密的消息和Tickettgs中,只有知道密钥KC的客户进程和拥有密钥Ktgs的TGS能看到,这样,会话密钥就被安全地分发到了客户进程和TGS.
注意到在第一个消息中包含了一个时间戳TS1,这个时间戳由AS用来判断该消息是否过时.
第二个消息中还包含了票据中的若干信息,这是为了让客户进程确认这是用于访问TGS的票据,并且知道这个票据的有效期.
有了Tickettgs和会话密钥之后,客户进程就可以和TGS通信了.
和前面的鉴别方案一样,客户进程向TGS发送一个包含服务器ID和Tickettgs的消息.
不同的是,消息中还包含一个鉴别码,鉴别码是用会话密钥Kc,tgs对用户ID、工作站地址和一个时间戳加密得到的.
和票据可以重用不同的是,鉴别码只使用一次,因此其生存期非常短.
TGS用密钥Ktgs解开Tickettgs,得知它和客户C之间的会话密钥为Kc,tgs,于是TGS用Kc,tgs解开鉴别码,检查鉴别码中携带的用户ID和工作站地址与票据中携带的是否匹配,以及ADc与输入消息中的发送地址是否匹配.
如果所有这些全都匹配,那么TGS可以确信票据的发送者就是票据的拥有者.
注意到票据并不证明任何人的身份,它只是一种安全分发密钥的方式,证明用户身份的是鉴别码.
由于鉴别码只使用一次,而且寿命非常短,因此攻击者试图截获票据和鉴别码进行重放攻击是不可能的.
TGS返回的消息格式与AS返回的消息格式类似.
该消息用TGS和C之间的会话密钥Kc,tgs加密,消息中包含客户C和服务器V的会话密钥Kc,v、服务器V的ID以及签发票据Ticketv的时间戳,Tickettgs中同样包含会话密钥Kc,v.
C现在有了一个可重用的访问服务器V的准予服务票据Ticketv.
当C请求服务器V的服务时,C发送的消息中同样必须包含一个鉴别码.
服务器V解密票据,取得会话密钥,然后解密鉴别码,进行用户身份鉴别.
如果需要相互鉴别,服务器取出鉴别码中的时间戳值并加1,然后用会话密钥加密后返回.
C解密这个消息,得到加1后的时间戳值.
由于消息是用C和V之间的会话密钥加密的,C可以确信该消息一定来自V,并且消息的内容保证这不会是一个来自以前响应消息的重放攻击.
至此,客户C和服务器V之间拥有了一个会话密钥,该密钥可用来加密随后要发送的数据,也可以用来协商一个新的会话密钥.
Kerberos域由一个Kerberos服务器、许多应用服务器和许多客户组成的一个全服务(full-service)Kerberos环境需要满足以下条件:Kerberos服务器的数据库中必须有所有用户的ID和(散列的)口令,所有用户都要向Kerberos服务器注册.
Kerberos服务器必须与每个应用服务器有一个共享的密钥,所有应用服务器都要向Kerberos服务器注册.
这样的一个环境称为是一个域(realm).
典型情况下,不同管理机构的服务器和客户组成不同的域,一个管理域中的用户和服务器不会注册到另一个管理域的Kerberos服务器上.
然而,一个域中的用户可能需要访问另一个域中的应用服务器,有些应用服务器也愿意向其它域的用户提供服务,只要那些用户被鉴别.
Kerberos提供了一种支持域之间鉴别的机制,两个支持域间鉴别的域必须满足第3个条件:每个互操作域中的Kerberos服务器必须与另一个域中的Kerberos服务器共享一个密钥.
两个Kerberos服务器相互注册.
该方案要求一个域(如B)中的Kerberos服务器信任另一个域(如A)中的Kerberos服务器为其鉴别用户;此外,B域中的应用服务器必须愿意信任A域中的Kerberos服务器.
有了这些基本规定之后,我们可以描述域之间的鉴别过程如下(见图8-13).
客户进程首先按照通常的方法获得访问本地TGS的票据Tickettgs,其次用Tickettgs向本地TGS请求访问远程TGS的票据Tickettgsrem,第三步用Tickettgsrem向远程TGS请求访问远程服务器V的准予服务票据Ticketvrem,第四步用Ticketvrem向远程服务器请求服务.
远程服务器V发现这是一个来自其它域的服务请求,它可以决定是否允许该用户访问.
该方案的缺点是可扩展性不好.
如果有N个域,为了使得每个域都能与其它域进行互操作,总共需要N(N-1)/2个域间共享的密钥,也即需要N(N-)/2次安全的密钥交换.
KerberosV5解决了这个问题,并对V4的协议做了轻微的修改,使得Kerberos独立于特定的加密算法(V4只使用DES)和网络协议(V4只使用IP地址).
8.
2X.
509鉴别服务X.
509定义了三种鉴别程序,供不同的应用选用:单向鉴别,双向鉴别和三向鉴别.
单向鉴别单向鉴别涉及从一个用户(A)到另一个用户(B)的一次消息传输.
单向鉴别只鉴别发送者身份.
A→B:tA||rA||IDB||sgnData||EKUb[Kab]||signatureA鉴别消息至少包括一个时间戳tA、一个序号(nonce)rA和B的标识IDB,然后用A的私钥对整个消息进行签名.
时间戳由消息的产生时间和到期时间组成,B可据此判断消息是否过时.
序号主要用于检测重放攻击,序号的值在消息有效期内必须是唯一的,这样B可以保存这个值直至消息过期,在此期间内拒绝接收具有相同序号的消息.
如果纯粹为了鉴别,则消息仅是用来出示发送者的身份证明.
事实上,消息中也可以包含要传输的信息(即sgnData),这个信息要被签名覆盖以保证真实性和完整性;如果这个消息需要保密,则还可以用B的密钥进行加密.
该消息还可以用来将一个会话密钥Kab传递给B,会话密钥用B的公钥KUb进行加密,确保只有B能够得到.
双向鉴别双向鉴别允许通信的双方相互鉴别.
A→B:tA||rA||IDB||sgnData||EKUb[Kab]||signatureAB→A:tB||rB||IDA||rA||sgnData||EKUa[Kba]||signatureB第一个消息与单向鉴别中的消息一样,第二个消息的格式与第一个消息基本相同,只是还包括了从A收到的序号rA,这个序号用于将响应消息绑定到它的原始消息.
三向鉴别在三向鉴别中,前两个消息与双向鉴别相同,最后一个消息仅包含rB及签名.
A→B:tA||rA||IDB||sgnData||EKUb[Kab]||signatureAB→A:tB||rB||IDA||rA||sgnData||EKUa[Kba]||signatureBA→B:rB||signatureA这个消息不包括时间戳,原因是通信双方可以从对方返回的序号(rA或rB)中检测重放攻击.
当没有同步时钟时,这个消息被用来作为同步.
9.
电子邮件安全电子邮件几乎是所有分布式环境中使用最多的网络应用,也是唯一跨平台和跨网络体系结构使用最多的分布式应用.
用户可以将邮件发送给任何与因特网直接相连或间接相连的用户,而不用考虑主机操作系统或通信协议的差异.
随着人们对电子邮件越来越强的依赖性,电子邮件的安全也越来越受到重视,电子邮件的安全包括真实性和机密性两个方面.
目前最流行的两个安全电子邮件协议是PGP和S/MIME.
9.
1PGP发布于1991年的PGP(PrettyGoodPrivacy)是一个完整的安全电子邮件软件包,它以易于使用的方式提供对邮件的保密、鉴别、数字签名和压缩服务.
PGP建立在安全性非常好的加密算法上,如用于公开密钥加密的RSA和DSS,用于对称加密的CAST-128、IDEA和3DES,以及散列函数SHA-1等.
PGP可在多种主机操作系统上使用,特别是,PGP是一个开放源码的软件包,因此PGP得到了非常广泛的使用.
PGP提供的服务PGP提供5种服务:鉴别,机密性,压缩,兼容电子邮件,分段.
1.
鉴别PGP使用基于公开密钥的数字签名提供鉴别服务.
发送方在创建了电子邮件(消息)之后,首先用SHA-1计算消息的散列码,然后用发送者的私钥对散列码进行加密(如采用RSA),将得到的签名附在消息的前面,与消息一起发送.
接收方使用发送方的公钥对签名进行鉴别.
尽管签名一般和受其保护的消息或文件放在一起,但有时将签名与消息分开保存和传输是非常有用的.
比如,用户可能希望将已发送或收到的消息的签名单独放在一个日志里保存;一个分开放置的可执行程序的签名过后可用来检测程序是否染上了病毒;当一个文件(如法律合同)需要多方签名时,使用分开的签名可使各个签名相互独立,否则这些签名就必须被嵌套在一起.
PGP支持签名与消息的分离.
2.
机密性PGP使用对称密钥算法保护邮件或文件的机密性.
对称密钥算法必须解决密钥分发问题.
PGP使用一次性会话密钥,对于每个要传输的消息生成一个随机的128比特数作为会话密钥,用接收方的公钥对会话密钥加密后,与消息一起发送给接收方.
具体过程如下:发送方生成一个消息和一个随机的128比特数(会话密钥),先用会话密钥加密消息,再用接收方的公钥加密会话密钥,将加密后的会话密钥放在消息前面,与消息一起发送.
接收方首先用私钥解开会话密钥,然后用会话密钥解密消息.
在上面的过程中,PGP使用公开密钥算法解决了安全传递会话密钥的问题;此外,一次性对称密钥的使用可有效抵抗密码分析,因为攻击者无法收集到足够多的用同一个密钥加密出来的密文.
当同时使用鉴别和机密性服务时,过程如下:首先对明文消息计算一个签名,将签名加在消息的前面;然后用会话密钥对签名和明文消息一起加密;最后用接收方的公钥加密会话密钥,放在消息的前面.
选择对明文消息而不是加密后的消息进行签名,是因为将签名和明文消息保存在一起更方便日后的验证.
3.
压缩缺省地,PGP在完成签名之后、在加密消息之前对消息进行压缩,以节省传输的数据量或文件存储空间.
压缩算法采用ZIP.
在压缩消息之前计算消息的签名是为了方便日后对消息的验证;选择在加密消息之前进行压缩,一方面可以减少要加密的数据量,另一方面压缩后的消息冗余很少,使得密码分析更加困难.
4.
兼容电子邮件当使用PGP时,传输的消息中至少有一部分是被加密过的.
比如,若只使用鉴别服务,则签名部分是被加密的;若使用机密性服务,则整个消息是被加密的.
加密的结果是消息中包含任意的8比特字节(即非ASCII字符),但是许多电子邮件系统只允许使用ASCII文本.
为解决这个问题,PGP提供将二进制数据流转换成可打印ASCII文本的服务,方法即是7.
3.
1中介绍的基64编码.
虽然基64编码会造成消息长度增加33%,但是消息中的内容会被压缩,据称ZIP的数据压缩率平均能达到2,因而压缩后整个消息的长度仍比原始消息要小.
另一个问题是基64编码算法只是盲目地将输入流转换成基64编码格式,而不管消息中的内容是否为ASCII文本,这样接收方如果不使用PGP就无法正确阅读信件(即使消息没有被加密).
为解决这个问题,PGP可被配置为仅对消息中的某些部分(如签名部分)进行基64编码转换.
提供前面4种服务的消息处理过程如下:发送方先对明文消息计算一个签名,将签名加在消息的前面;签名与明文一起被压缩;用会话密钥对压缩后的数据块进行加密,将加密后的会话密钥放在消息的前面;整个数据块被转换成基64编码格式.
当接收方收到一个消息后,先进行编码格式转换,接着用私钥解出会话密钥,用会话密钥解密消息,然后解压缩整个消息,最后验证签名.
5.
分段和重组许多电子邮件系统能够接收的最大消息长度不超过50,000字节,超过这个长度的消息必须被分成较小的片段传输.
为适应这种长度限制,PGP在完成对消息的全部处理之后,自动将超过长度的消息分成小块传输,会话密钥和签名只在第一个片段中出现.
接收端去掉每个片段的信头,然后将所有的片段重新组装成一个数据块.
PGP的密钥管理PGP使用4种密钥:一次性会话密钥,公开密钥,私有密钥,基于短语(passphrase)的对称密钥.
对于这些密钥有以下要求:(1)会话密钥必须是不可预测的.
(2)用户可以同时拥有多个公钥/私钥对.
这是因为用户可能需要使用不同的密钥与多方通信,另一方面,使用多个密钥可减少由同一个密钥产生的密文数量,给破译密文增加难度.
但是这样做的结果是用户与他们的公钥就不是一一对应关系了,需要有一种方法来标识不同的密钥.
1.
会话密钥的产生一次性会话密钥只用来加密和解密一个消息.
对于一个新生成的消息,发送方生成一个随机的128比特数作为该消息的会话密钥.
下面以使用CAST-128加密算法为例,说明会话密钥的产生过程.
作为会话密钥的128比特随机数是由CAST-128自己产生的.
随机数生成器的输入由一个128比特的密钥和两个64比特的数据块组成,这两个64比特的数据块作为明文被加密,生成的两个64比特密文块被串接在一起构成一个128比特的数,这个数就是会话密钥.
作为"明文"输入的128比特数据(两个64比特数据块)是从一个128比特的随机数流中获得的,而这些随机数来源于用户的键盘输入,击键的时间及键值被用来产生这些随机数.
因此,如果用户按照自己的速度击键的话,就会产生一个相当"随机"的输入.
这个随机输入与CAST-128前一次输出的会话密钥相结合,就形成了随机数生成器使用的加密密钥.
按照这种方法生成的会话密钥随机性非常好,是不可预测的.
2.
密钥标识一次性会话密钥是用接收者的公钥加密的,如果每个用户只使用一个公钥/私钥对,那么接收者自然知道该用哪个私钥解密.
如果一个用户允许同时使用多个公钥/私钥对,那么接收者如何知道该用哪个私钥解密呢一种简单的方法是将公钥随消息一起发送到接收方,接收者根据公钥来确定应该使用哪个私钥.
但是公钥往往比较长,如RSA的公钥是一个几百位的十进制数,这会增加传输的开销.
另一种方法是为每个密钥分配一个标识,该标识至少对于接收方来说是唯一的.
也就是说,使用用户ID和密钥ID来标识一个密钥,这样只要传递一个很短的密钥ID就可以了.
但是这种方法又会产生密钥管理开销,需要为每个密钥指定一个ID,并且发送方和接收方都必须保存密钥ID和公钥的映射关系.
PGP采用的方法是为每个公钥指定一个对于接收方来说不大可能发生冲突的ID,即将公钥的最低64比特作为该公钥的ID,64比特的长度足以保证出现相同的密钥ID的概率非常小.
密钥ID对于数字签名来说也是需要的.
由于发送者可以使用多个私钥中的一个进行签名,接收者需要知道应该用发送者的哪个公钥进行解密.
为此,数字签名部分包括了用于验证该签名的公钥的ID,接收方根据用户ID和密钥ID找到正确的公钥.
事实上,消息的签名部分包括了4个字段:(1)生成签名的时间戳;(2)用发送者私钥加密的消息摘要(签名);(3)消息摘要的前两个字节,供接收者判断他使用的公钥是否正确;(4)发送者公钥的ID.
另外,消息的会话密钥部分也包含2个字段:(1)用接收者公钥加密的会话密钥;(2)接收者公钥的ID.
3.
密钥环(KeyRing)为了高效地存储和使用众多的密钥,PGP在每个节点上使用两个数据结构来保存密钥,分别称为私钥环和公钥环.
私钥环用于保存用户自己的公钥/私钥对.
如果将环看成一张表,则每个表项对应一个公钥/私钥对.
每个表项包含以下信息:(1)密钥对生成的日期/时间;(2)公钥的ID;(3)公钥;(4)私钥,该字段是加密的;(5)用户ID.
私钥环由用户ID或密钥ID索引.
尽管私钥环只打算存放在创建和拥有这些密钥对的用户的机器上,并只打算让这个用户访问,但是令私钥尽可能安全的想法还是有道理.
实际上,私钥是用CAST-128(或IDEA或3DES)加密后再放入密钥环的.
具体过程如下:用户选择一个用于加密私钥的短语.
当系统使用RSA生成一个新的公钥/私钥对时,它要求用户输入一个短语,然后用SHA-1得到该短语的散列码(160比特),将短语丢弃.
系统用散列码中的128比特作为密钥,采用CAST-128算法对私钥进行加密,然后将散列码丢弃.
加密过的私钥存放在密钥环中.
过后,当用户想要访问密钥环获取一个私钥时,他必须提供相应的短语;PGP计算短语的散列码,从中得到密钥,然后解密私钥.
公钥环用于保存其他用户的公钥.
公钥环的每一项对应一个公钥证书,除了包括时间戳、公钥ID、公钥、用户ID以外,还包括用于公钥管理的信息(在下面介绍).
公钥环使用用户ID或密钥ID索引.
4.
公钥管理PGP使用公钥算法签名和加密会话密钥.
当某个用户希望和其他用户通过PGP交互时,他必须建立一个公钥环,包含所有这些用户的公钥.
公钥环中公钥的安全性成为PGP安全的关键.
考虑到PGP可能用于任何正式或非正式的环境中,PGP没有建立严格的公钥管理,即不使用公钥证书管理机构.
那么在这种情况下,用户如何保证他得到的公钥是可信的呢PGP使用一种以用户为中心的信任管理模型,依靠用户产生并分发他们的公钥.
用户之间相互签发证书,一个用户可以让多人为他签发证书.
当Alice希望与Bob通信时,她应尽可能多地收集Bob的证书,然后根据自己对这些证书的签发者的信任程度来决定对Bob的公钥的信任程度.
比如,Bob可将自己的公钥发给Mike,如果Mike认识Bob,他为Bob创建一个公钥证书,用自己的私钥对证书进行签名,然后将证书发给Bob.
Alice收集到Bob的公钥证书,如果Alice已有Mike的公钥,则可以验证Bob的证书.
如果Alice也认识Mike,并且非常信任Mike,则Alice信任Bob拥有该公钥.
反之,如果Alice不认识Mike或者不了解Mike,则她对Bob拥有该公钥的信任度就较低.
可见,用户对证书签发者的信任程度完全由该用户决定,因此这是一个以用户为中心的信任模式.
为支持这种公钥管理机制,公钥环中的每个表项(对应一个公钥证书)除了包含用户ID、公钥ID、公钥及时间戳以外,还包括密钥合法性(keylegitimacy)、证书签名(signature)、签名信任(signaturetrust)、拥有者信任(ownertrust)几个字段.
密钥合法性指示PGP信任该公钥的程度,信任程度越高,公钥和用户ID的绑定就越强,该值由PGP计算.
与每个公钥相联系有零个或多个签名,这是PGP用户收集到的证明用户ID持有该公钥的证书的签名.
每个签名与一个签名信任关联,签名信任表示PGP用户信任签名者对该公钥签名的程度,密钥合法性即从该表项的签名信任集合得到.
公钥环的每个表项将一个公钥绑定到一个用户ID,拥有者信任表示PGP用户对该公钥的持有者(即用户ID)对其它公钥所签名的信任程度,该字段的值由PGP用户指定.
某个表项的签名信任字段实际上来自其它表项的拥有者信任字段.
下面以用户A的公钥环为例,简要说明信任处理的过程.
(1)当A将一个新的公钥加入他的公钥环时,PGP必须为该表项的ownertrust字段指定一个值.
如果该公钥的拥有者就是A,也就是说该公钥会进入私钥环,则PGP自动将"最大信任"(ultimatetrust)赋给这个字段.
否则,PGP会要求A输入一个表示信任程度的值,如"用户未知"、"通常不信任"、"通常信任"、"总是信任"等.
(2)当一个新的公钥加入公钥环时,可能有一个或多个签名与它相联系,更多的签名可能会在以后加进来.
当将一个签名加入表项时,PGP搜索公钥环,看签名者是否是某个已知公钥的持有者.
若是,该签名的签名信任值就是签名者的拥有者信任值,否则签名信任值为"未知用户".
(3)根据该表项的签名信任集合计算密钥合法性.
如果签名集合中至少有一个签名的签名信任值为"最大信任",则密钥合法性为"完全可信".
否则,PGP计算所有签名信任值的一个加权和,为每个"总是信任"的签名分配一个权值1/X,为每个"通常信任"的签名分配一个权值1/Y,X和Y是用户配置的参数.
如果所有签名信任值的加权和达到1,则该公钥是可信的,设置密钥合法性为"完全可信".
因此,即使没有"最大信任"的签名,只要有至少X个"总是信任"的签名或者Y个"通常信任"的签名,也可以表明密钥是可信的.
PGP必须定期维护公钥环以保持一致性.
这是一个从上到下的过程,从拥有最大信任的公钥开始,对于每个公钥的ownertrust字段,PGP扫描整个公钥环寻找该公钥拥有者的签名,将他的每个签名的签名信任值更新为他的拥有者信任值.
当公钥环中所有的签名信任字段都更新完成后,重新计算所有公钥的密钥合法性.
用户可能希望撤销当前正在使用的公钥,比如由于定期更换密钥的需要或怀疑密钥已泄露.
撤销公钥的一般做法是公钥拥有者发布一个带有自己签名的公钥撤销证书,然后在尽可能大的范围内尽可能快地分发这个证书.
撤销公钥是整个系统最薄弱的环节,由于公钥的分发及公钥撤销证书的分发都是非正式的,因此不能保证知道这个公钥的用户都能及时收到公钥撤销证书.
另外,公钥撤销证书需要用户的签名,如果用户丢失了自己的私钥,则无法撤销公钥.
9.
2S/MIMES/MIME(Secure/MultipurposeInternetMailExtension)是基于公钥加密技术对MIME所做的安全扩充.
PGP和S/MIME都在IETF的标准化过程中,看起来S/MIME较可能作为一种工业标准被商业组织或一些机构使用,而PGP则更多地用于个人电子邮件安全.
从一般的功能性来看,S/MIME和PGP很类似,都提供签名和/或加密消息的能力.
S/MIME提供以下功能:(1)数据加密(envelopeddata):对消息内容及加密消息内容所用的加密密钥进行加密.
(2)数据签名(signeddata):对消息内容首先计算一个消息摘要,然后用发送者的私钥对消息摘要加密,最后对内容和签名采用基64编码方案进行编码.
被签名的消息只能被有S/MIME能力的接收者阅读.
(3)清晰的数据签名(clear-signeddata):与signeddata一样对消息内容计算数字签名,不同的是,只对数字签名使用基64编码.
因此,没有S/MIME能力的接收者能够阅读消息的内容,但不能验证签名.
(4)数据签名和加密(signedandenvelopeddata):加密的数据可以被签名,以及签名或清晰签名的数据可以被加密.
S/MIME包括三种公开密钥算法,DSS(DigitalSignatureStandard)是首选的数字签名算法,Diffie-Hellman是首选的用于加密会话密钥的算法,而RSA既可用于数字签名也可用于加密会话密钥.
对于签名所用的散列函数,S/MIME要求使用160比特的SHA-1,但推荐接收方支持128比特的MD5以与较早版本的S/MIME兼容.
在数据加密算法方面,S/MIME建议使用3DES,但遵从美国出口控制的S/MIME实现必须支持40比特的RC2,RC2是一种较弱的加密算法.
S/MIME规定了发送方与接收方协商加密算法的过程.
大体上说,发送代理需要做出两个决策:(1)接收代理能否用指定的加密算法进行解密;(2)如果接收代理只能接收弱加密的消息内容,那么使用弱加密算法发送消息对于发送方来说能否接受.
为支持这种决策过程,发送代理按照优先级从高到低的顺序通报它的解密能力(支持的加密算法),接收代理保存这些信息供日后使用.
发送代理必须按照以下顺序与原则进行决策:(1)如果发送代理有接收代理的解密能力表,它应当选择列表中它能够使用的最高选择.
(2)如果发送代理没有接收代理的解密能力表,但从接收方收到过一个或多个消息,则输出消息应使用最近一次收到的被签名和加密的消息中所用的加密算法.
(3)如果发送代理不知道接收代理的解密能力,但愿意承担接收代理可能无法解密消息的风险,发送代理应当使用3DES.
(4)如果发送代理不知道接收代理的解密能力,并且不愿意承担接收代理可能无法解密消息的风险,发送代理必须使用RC2/40.
如果一个消息要发给多个接收者,而又不存在一个被所有接收者支持的加密算法,则发送代理需要发送两个消息.
在这里需要注意的是,以较低的安全性发送一个消息,则消息的安全性会打折扣.
S/MIME使用签名和/或加密来保护MIME实体.
一个MIME实体可以是整个消息(RFC822头除外),或者如果MIME内容类型为multipart(即MIME内容由多个子部分组成)的话,MIME实体是其中一个或几个子部分.
MIME实体按照MIME的规则被创建,然后同一些安全相关的数据(如算法标识和证书等)一起交给S/MIME处理,产生一个PKCS(Public-KeyCryptographyStandards)对象.
随后,PKCS对象被当作消息内容处理,并被封装到MIME中(被分配一个适当的MIME头).
S/MIME定义了几种新的MIME内容类型,包括EnvelopedData、SignedData、ClearSigning、RegistrationRequest(请求一个公钥证书)、Certificates-OnlyMessage(只携带证书或证书撤销列表).
S/MIME使用符合X.
509v3标准的公钥证书.
S/MIME的公钥管理方案介于严格的X.
509证书等级和PGP的信任网络之间.
和PGP类似,S/MIME管理员和/或用户必须为每个客户配置一个可信任的公钥列表和证书撤销表,也就是说维护公钥证书的责任在本地.
和PGP不同的是,S/MIME的公钥证书由认证权威签发.
10.
Web安全针对Web应用的安全攻击有很多.
按照主动攻击和被动攻击进行分类的话,被动攻击包括监听浏览器与服务器之间的网络流量,主动攻击包括假冒他人、修改在网络中传输的数据以及修改网站上的信息等.
如果按照攻击发生的位置进行分类的话,有三类攻击:针对Web服务器、针对Web浏览器以及针对浏览器与服务器之间的网络流量.
服务器与浏览器安全属于计算机系统的安全问题,而流量安全属于网络安全问题,因此本节只讨论流量安全.
有许多方法可以提供Web安全,这些方法在提供的安全服务及使用的安全机制上是相似的,但是它们的适用范围以及在TCP/IP协议栈中的位置不同,下图解释了这些方法的不同.
第一种方法是利用IPSec提供Web安全(图8-15(a)),这种方法的好处是提供了一种通用的安全解决方案,它对端用户及应用是透明的.
此外,IPSec包括一个过滤能力,使得只对指定的流进行IPSec处理.
另一种相对比较通用的方案是在TCP上实现安全(图8-15(b)),最早的方案是安全套接字层(SecureSocketsLayer,SSL),然后是一个称为传输层安全(TransportLayerSecurity,TLS)的因特网标准,这一层上有两种实现选择.
如果要提供完全的通用性,可以将SSL(或TLS)作为下层协议族的一部分,这样SSL(TLS)对应用程序是透明的.
也可以将SSL嵌入到特定的应用软件包中,如Netscape和微软的IE浏览器就内嵌了SSL,而大多数的Web服务器都实现了这个协议.
应用特定的安全服务嵌在特定的应用中,如图8-15(c)所示.
这种方法的优点是安全服务可针对特定的应用需求而量身定制.
在Web安全领域,这种方法的一个重要例子是安全电子交易(SecureElectronicTransaction,SET).
下面主要介绍SSL/TLS.
SSL/TLSSSL最早在Netscape中出现.
在参照了公众及工业界的意见之后,SSLv3作为一个因特网协议草案被公布.
之后,IETF成立了TLS工作组,以SSLv3为蓝本开发一个公共标准.
TLS的第一版非常接近并向后兼容SSLv3.
SSL依靠TCP提供可靠的端到端连接.
SSL不是一个协议,而是涉及到两个层次的一组协议,如图8-16所示.
SSL记录协议(SSLRecordProtocol)为各种高层协议提供基本的安全服务,特别是Web应用协议HTTP可运行在该协议上;SSL的其它三个高层协议用于SSL交换管理.
在SSL中,SSL连接和SSL会话是两个重要的概念.
SSL连接是对等实体间的一种联系,SSL连接是暂时的,每个SSL连接与一个SSL会话关联.
SSL会话是客户和服务器之间的一个关联,由SSL握手协议创建.
SSL会话定义了一组安全参数,这组安全参数可在多个SSL连接间共享.
使用SSL会话的目的是为了避免在每次建立新的连接时都协商新的安全参数.
在任何一对通信实体(如HTTP客户和服务器)之间可能存在多个安全连接.
从理论上说,在一对通信实体之间也可能同时存在多个会话,但实践中没有使用这种特性.
SSL记录协议为SSL连接提供机密性和完整性两种服务.
机密性是通过加密SSL载荷实现的,完整性通过消息鉴别码来保护,加密数据及计算消息鉴别码使用的共享密钥通过握手协议协商.
SSL记录协议的操作过程如下:从上层接收一个要传输的应用消息,将消息划分成长度不超过214字节的数据块.
对数据块进行压缩.
这是一个可选的操作,在SSLv3及当前的TLS版本中,没有规定压缩算法,因此缺省的压缩算法为空.
使用加密散列函数(MD5或SHA-1)对压缩后的数据块(若未压缩,则为原始数据块)计算消息鉴别码(MAC).
使用对称密钥算法对压缩的数据块及消息鉴别码进行加密,对称加密算法可以是DES、3DES、IDEA、RC算法等.
在处理完的数据块前加上SSL头,SSL头包括内容类型(指明处理SSL数据块的高层协议)、SSL版本号、压缩数据块的长度.
SSL中最复杂的协议为握手协议,该协议允许服务器和客户之间相互鉴别,并协商数据传输过程中要使用的加密算法、MAC算法及密钥等.
握手协议由客户和服务器之间一系列的消息交换组成:(1)浏览器向服务器发送一个建立SSL会话的请求消息,消息中指出浏览器可支持的SSL协议的最高版本、会话ID、浏览器支持的加密算法(按优先级从高到低排列)和压缩方法等,还包含浏览器选择的一个随机数Rc.
(2)服务器从浏览器给出的选择中确定合适的SSL版本号、加密算法和压缩方法,连同服务器选择的一个随机数Rs一起发送给浏览器.
(3)服务器向浏览器发送它的公钥证书;如果公钥证书不是由某个众所周知的CA签发的,则服务器还将一个可以追溯到某个众所周知CA的证书链发送给浏览器.
服务器接着可以发送其它消息,比如请求客户的公钥证书等.
当所有消息发送完后,服务器发送一个结束消息通知客户,然后等待客户的响应.
(4)每个浏览器都预装了大约一百个CA的公钥.
当浏览器收到服务器的证书后,检查签发该证书的CA是否在浏览器的可信CA列表中.
如果不在列表中,浏览器向用户警告该问题;如果在列表中,浏览器使用该CA的公钥来验证证书,得到服务器的公钥.
昔日数据怎么样?昔日数据新上了湖北十堰云服务器,湖北十堰市IDC数据中心 母鸡采用e5 2651v2 SSD MLC企业硬盘 rdid5阵列为数据护航 100G高防 超出防御峰值空路由2小时 不限制流量。目前,国内湖北十堰云服务器,首月6折火热销售限量30台价格低至22元/月。(注意:之前有个xrhost.cn也叫昔日数据,已经打不开了,一看网站LOGO和名称为同一家,有一定风险,所以尽量不要选择...
最近发现一个比较怪异的事情,在访问和登录大部分国外主机商和域名商的时候都需要二次验证。常见的就是需要我们勾选判断是不是真人。以及比如在刚才要访问Namecheap检查前几天送给网友域名的账户域名是否转出的,再次登录网站的时候又需要人机验证。这里有看到"Attention Required"的提示。我们只能手工选择按钮,然后根据验证码进行选择合适的标记。这次我要选择的是船的标识,每次需要选择三个,一...
也有在上个月介绍到糖果主机商12周年的促销活动,我有看到不少的朋友还是选择他们家的香港虚拟主机和美国虚拟主机比较多,同时有一个网友有联系到推荐入门的个人网站主机,最后建议他选择糖果主机的迷你主机方案,适合单个站点的。这次商家又推出所谓的秋季活动促销,这里一并整理看看这个服务商在秋季活动中有哪些值得选择的主机方案,比如虚拟主机最低可以享受六折,云服务器可以享受五折优惠。 官网地址:糖果主机秋季活动促...