在一个面向公共网络的项目中,安全无疑是项目面临的巨大挑战之一。在公网上,蛋疼份子与无聊人士无时无刻嗅探着我们的服务器,有些人是想要展示自己的能力,而还有着一部分不法分子,想要监听拦截我们的敏感信息,进入我们的主机进行各种各样的破坏与偷窃。这些人一旦得手,轻则降低系统的稳定性,重则使企业的敏感数据丢失,毁掉企业的信誉。所以,向用户提供可靠与稳定的服务,防止重要数据的丢失与盗取,是我们在构建一个面向公共网络的WEB系统中一定要做到的。

        要想构建一个安全的网络环境,首先我们必须了解安全威胁来自哪里。以下是有可能产生安全威胁的应用场景:

        1、用户A传送带有敏感信息的文件给用户B,用户C在局域网内监听截获未加密的数据报。

        2、网络管理者A远程发送命令给主机B(如添加用户的命令),攻击者C拦截了包含命令的数据报,并修改了这个数据包内的命令,然后发送给主机B。

        3、同场景2一样,主机B准备接受远程合法用户A的命令,但此时一个攻击者C自己构建了一个命令数据报并发送给B,B以为是用户A发送的命令,并执行了该命令,与场景2不同的是,攻击者C并不是截获修改数据报,而是直接构建数据报。

        4、一个关于股票交易的消息从客户A发送给TA的股票经纪B,股票经纪B按A的要求进行了相应的股票操作,但这个操作为客户A带来了损失,随后客户A否认发送了此消息给经纪B。


        分析场景1,如果A发送给B的消息经过了加密,此时就算C截获了消息,TA也不会知道消息的内容。这就涉及到消息的机密性。在场景2中,攻击者C对消息进行了篡改,然而主机B并不知道接受到的消息与合法用户A发送的消息不一致,所以该场景涉及到消息的完整性。在场景3中,主机B接受了任何人发送的消息,没有验证消息的来源,这就涉及到了消息的可验证性。在场景4中,很明显,客户A不承认发送了该消息,所以涉及到消息的抗抵赖性。

        对于以上提到的场景,我们可以总结来自于互联网的安全性服务可以大致归为以下几类:

        1、机密性

        2、完整性

        3、抗抵赖性

        对于不同的服务,我们需要不同的安全属性。有些比较敏感的信息,如用户进行一个电子交易的时候,更同时需要不同的安全服务保驾护航。下面,让我们一起来探讨一下系统是如何实现以上提到的这些安全属性的以及为了实现这些安全属性,我们需要用到的一些软件。这些软件可作为组件集成在系统中,为系统的安全提供保障。


        机密性

        消息的机密性是为了保证只有合法的接收方才能读懂消息的内容,其它的人即使通过非法手段获取消息,由于消息被加密,也不能读懂消息的内容。那么只能让合法的接收方读懂消息就是对消息机密性的要求。加解密示意图如下(对称加密):

网络安全简介_公钥加密

        对于消息机密性的研究有一段很长的历史,最早的经典加密技术是凯撒加密技术,这是一种单码替换技术,即每一个明文字母用另外一个字母替换,形成密文。然后把替换的法则提前告知合法的用户,这样,当合法用户获取密文后,按照事先约定好的法则,即可把密文翻译成明文。往后的传统加密算法(对称加密算法),都是由凯撒加密技术演变而来。但是凯撒密码有一个弱点,一段比较长的英文消息中,某个字母出现的频率是可以推算出来的,如”The”这个单词的出现频率就比较高,破译者甚至统计出了一张字母频度分析表。这样,破译者可以根据频度分析表来猜密文,试图将它转换成明文,如果转换后的明文读的通,那么该消息就被破译了。这种破译方法也被称之为频度分析。

网络安全简介_公钥加密_02

频度分析表


        为了抵御频度分析,1854年,查尔斯·惠斯通发明了一种多元替换加密方法,称之为Playfair。在使用时,首先需编制一个5X5的矩阵密码表,加密与解密都依靠该密码表来进行。所以这个5X5的密码表就相当于密钥了。它能有效的抵御频度分析,并在被当时的军方广泛使用,不过在一战时被破解了。随后又出现了一些加密机制,其中最有名的就是在二战中被德国使用的轮转机加密。在DES算法出现之前,最有名的加密算法就是它了。它通过多步替换加密形成密文,使密码分析更为困难。密码的历史就回顾到这,下面开始介绍在现代计算机网络中,被我们广泛使用的一些加密机制。


        DES

        DES的全称是Data Encryption Standard,是一种对称加密算法。对称加密算法的特点是,加解密都用同一个密钥,回顾之前所说的,从经典的凯撒加密到轮转机加密,加解密都是依靠用同一个密码表或规则来进行,所以都可以称之为对称加密。而这些密码表或规则可以理解就是所说的“密钥”。在DES中,密钥为一串计算机生成的字符序列。这串序列应该有一定的长度,使攻击者很难通过暴力破解或其它的方法获取,否则,如果密钥被第三方获取,那么加密消息将不存在任何安全性。因为密码的算法是公开的。

        DES的算法可以在百度百科或其它文献资料中查到,这里只对它的特性做一些介绍(其实我也只是了解算法过程,没有仔细研究过算法本身-_-!),DES的密钥长度为56位,在加密时将该密钥与64位为一组的明文消息作为输入,传入加密函数中,经过函数处理生成64位的密文完成明文到密文的转换。这种转换方式被称为块加密,由64位的明文块做整体转换,现代的加密算法基本都采用了这种块加密的方式。另外一种是流加密,所谓流加密就是一个字符或一个字节或按位bit by bit来进行转换,如老掉牙的凯撒加密就属于流加密,因为它是一个字母一个字母来进行转换的。

        DES加密的模式,DES加密有不同的模式,模式的不同导致了DES生成密文的安全性与速度有所不同,这里介绍三种不同的DES加密模式:

        1、ECB(Electronic Codebook),ECB模式对于同一明文,如果用同一个密钥加密,产生的密文是相同的,如"The"这个单词是一个64位的块,被同一个密钥加密后,产生的密文永远是"XUZ"。这种加密模式对抗密码分析就会比较弱。

        2、CBC(Cipher Block Chaining),为了克服ECB模式的缺点,CBC模式诞生了,CBC对于同一块明文产生的密文是不同的,所以要强于ECB模式。

        3、CFB(Cipher Feedback),由于DES本质上是基于块加密的,所以一定要整块整块的转换,而CFB模式可以将块加密转化为流加密,使密文可以一个字节一个字节的产生,达到了实时密文转换的目的,提到了密文生成的速度。

        DES加密的强度是由DES密钥的长度决定的,DES具有56位的密钥长度,也就是有2的56次方种组合,依靠单台计算机的运算能力来尝试暴力破解DES是需要很长时间的(或需要很大的费用),但现在由于分布式计算的发展,对于解56位长度的密钥也许就不那么困难了。所以现今,DES已经不算是很安全的加密算法,DES已逐渐被其它的加密算法所代替。


        TRIPLE DES(3DES)

        3DES是DES的升级,它对每个数据块应用三次DES加密算法。由于采用了三次DES加密算法,所以在3DES中需要三把密钥,而这三把密钥也有不同的组合方式。

        组合方式一:三个密钥是独立的,这种加密强度最高,相当于有3x56=168个密钥位。

        组合方式二:有两个密钥是独立的,这种安全性稍低,有112个密钥位。

        组合方式三:三个密钥完全相同,这种模式其实是为了兼容普通DES而存在的,在安全性方面与一般的DES没有任何区别,只有56各密钥位。


        IDEA

        IDEA全称为International Data Encryption Algorithm,是对称加密算法的一种。在近几年被建议取代DES。IDEA在近代安全体系中有一个广泛的应用,其中PGP就使用了IDEA算法。

        IDEA使用128位密钥对64位块加密,同时加强了密码的混淆性和扩散性,提高了安全度。混淆性的增强使得想通过明文的规律找出密文的规律更难,因为密文与明文不是一一对应的关系。而扩散性使得密文中的每一位受到明文中许多位的影响,为密码分析增加难度。


        Blowfish

        Blowfish是一种基于块的对称加密算法。它具有以下几种特征:

        快速:使用32位微处理器加密一个字节仅需18个时钟周期。

        简洁:运行Blowfish仅需少于5K的内存。

        简单:Blowfish的简单结构使得它的算法很容易被实现。

        变长:Blowfish的密钥长度是可变的,最多能产生448位的密钥,使得用户可以在高安全性与高加密速度两个方面做一个权衡。

        Blowfish可能是最好的对称加密算法,在许多安全产品上有所实现,经过了长时间的安全考验,所以Blowfish的安全性是不成问题的。

        以下是Blowfish与其它加密算法效率上的对比:


加密算法

每轮消耗时钟

转换轮数

每字节加密消耗时钟

Blowfish

9

16

18

RC5

12

16

23

DES

18

16

45

IDEA

50

8

50

3DES

18

48

108

        RC5

        RC5是一种基于块的对称加密算法。它具有以下几种特征:

        可用软件或硬件实现:仅仅使用处理器上支持的原始运算操作。

        快速:RC5的算法简单,每次进行的加密操作是以字为单位的。

        可变字长:RC5提供的第一个参数是用户可以设置一个字的长度,允许值为16,32,64,RC5以2个字为一块进行加密,所以RC5可选择块大小为32位,64位或128位进行加密。

        可变轮数:加密轮数是RC5提供的第二个参数,使用户可以在加密速度与高安全性方面做一个权衡。

        可变密钥长度:密钥长度是RC5提供的第三个参数,同样的,它使得用户可以在加密速度与高安全性方面做一个权衡,此参数以8位字节为单位,可选范围在0~255,因此密钥的最大长度为2040位,RC5的发明人Rivest建议我们使用64为块,12轮迭代,128位长度密钥的nominal模式进行加密。

        简单:RC5简单的结构使得它的算法很容易被实现。

        低内存消耗:较低的内存消耗使得RC5能用与如智能卡的一些硬件上。

        高安全性:RC5提供较高的安全性。

        RC5也提供几种加密模式,分别为:

        ECB:与DES的ECB模式一样。

        CBC:与DES的CBC模式一样。

        CBC-Pad:以CBC模式处理变长的明文,单个RC5块生成的密文比明文更长。


        CAST-128

        CAST是一种基于块的对称加密算法。它使用可变长的密钥,密钥的长度从40位到128位不等,按每8位递增。CAST加密进行16轮迭代,输入64位明文块并输出64位密文块。CAST将密钥分成两个子密钥。


        RC2

        RC2是一种基于块的对称加密算法。它使用64位的块及变长密钥,密钥的长度范围从8位到1024位。RC2被用在S/MIME协议中。S/MIME使用40,64,128位的密钥长度。


        以上讨论的加密算法都是为保证消息的机密性而存在的,它们能有效的保证经过加密后的消息不被第三方破解从而泄漏敏感资料。这些算法通常以模块的形式被集成在一些系统或软件中以支持一些安全协议或安全架构。如SSL协议就需要加密传送消息,那么WEB server和浏览器就需要集成这些加密算法以支持SSL协议的应用。但是,对于对称加密技术,密钥的保护是一个难以忽视的问题,无论是加密方与解密方,都是用的同一把密钥,如果密钥在传输过程中丢失或者被攻击者盗取,那么消息将失去机密性。在加密体系中,除了上述介绍的对称加密机制外,还有一种非对称加密机制,又称公钥加密。下面让我们来探讨一下公钥加密

        公钥加密算法可能算得上是近代密码学上真正的革命。它通过一把公共密钥与一把私有密钥进行加密和解密。公共密钥是公开的,任何人都可以使用,而私有密钥一般是解密人所有,需要保证机密性。明文用公共密钥进行加密,可以用私有密钥解密,也能用私有密钥加密,公共密钥解密。所以,如果A想发送一个加密消息给B,那么A只需要用B的公钥将消息加密,发送给B即可,B可以用他本地的私钥进行解密。B的公钥流出并不存在风险,而B的私钥无需流出。这就在一定程度上规避了丢失密钥的风险。公钥加密除了能用于消息加密外,还能用于“数字签名”与密钥管理,数字签名将在后面做介绍。

        那么,既然出现了公钥加密算法,还需要传统的对称加密算法么,公钥加密算法是否能代替对称加密算法呢?我们应该注意到一些错误的观点,有一种说法是,公钥加密与对称加密相比,提供了更高的安全性。其实无论是公钥加密还是对称加密,安全性依靠的是密钥的长度,与公钥加密和对称加密无关。还有一种说法是公钥加密可以作为通用加密手段替代对称加密,事实上,由于公钥加密的计算效率比对称加密低很多,如果有大量消息需要加密,用公钥加密是不实际的。公钥加密更多的是对对称加密密钥进行加密,以保证密钥的机密性,而不是加密数据。

网络安全简介_对称加密_03

公钥加密示意图

        公钥加密算法主要有RSA加密算法与椭圆曲线加密算法,其中RSA是使用最广泛,并且经过长时间考验被大众认可的公钥加密算法。它是由Ron Rivest,Adi Shamir和Lenard Adleman一起提出的。RSA就是他们三人姓氏的开头字母组合在一起。椭圆曲线加密算法,在系统开销上有一定优势,但由于还没有经历过长时间的密码分析考验,所以在使用性上没有RSA广泛。还有一种称为Diffie-Hellman的密钥交换协议,它本身不能加解密数据,但它能安全的使通讯双方生成密钥,然后通讯双方可以使用生成的密钥,利用对称加密机制进行加解密。


        完整性

        在文章开头描述的网络安全威胁场景2中,说明了消息在传输过程中有被篡改的可能,这就需要接收方能对消息的完整性进行验证,要保证接收到的消息是发送方发送过来的原始消息,否则可能会产生灾难性的后果。那么,如何保证消息的完整性呢?让我们通过下图来了解:

网络安全简介_公钥加密_04

         此图标明了一种保证消息完整性的方法,称为Message Authentication Code,消息验证码。简写为MAC。发送方A将明文消息与一个密钥作为参数传递至一个称为MAC(姑且先这么叫吧)的函数中,生成一段固定长度的值,这段值就称为消息验证码。然后将消息验证码与消息一起发送给接收方B。B将接收到消息和与A相同的密钥也传递到MAC函数中,生成新的消息验证码,然后将新生成的消息验证码与从A传送过来的消息验证码进行比较,如果一致,则证明消息没有被篡改过,否则消息的完整性被破坏,不能使用。MAC函数类似加密函数,但MAC函数是不可逆的,只能用于比较,不能通过密钥参数进行解密,所以MAC函数用于确保消息完整性比用加密函数的危险系数更小。

        除了MAC外,还有一种被称为Hash的函数也可用于保证消息完整性。验证的流程与MAC相似。Hash函数可将任意长度的消息转化为固定长度的散列值,这个散列值也被称为消息摘要。那么我们可能会想到,既然Hash函数可以将任意长度的消息转化为固定长度的值,那么如果用1000位的消息做输入,产生了128位的值,那么任意1000位消息的值当中,会不会有一些消息产生了相同的128位值?答案是会,这种情况被叫做冲撞,如果一个冲突被攻击者发现,那么消息的完整性会受到威胁。事实上,虽然Hash算法产生冲撞的机会很小,但是还是有机会,山东大学的王小云教授就“破解”了MD5、SHA-1(两种Hash算法),使得产生冲撞值的运算过程缩短了。当然目前来说,我们不必太担心,因为排除这些顶尖科学家,MD5与SHA-1还是比较安全的。

        MD5允许任意长度的消息作为输入,输出固定128位的消息摘要。SHA-1全称为Secure Hash Algorithm,安全哈希算法,它可以将最大长度为2的64次方位的消息作为输入,输出固定160位的消息摘要,由于它输出的消息摘要是160位,大于MD5的128位,所以SHA-1的安全性要高于MD5,现在SHA-1逐渐替代了MD5。此外还有一种被称为RIPEMD-160的消息摘要算法,它同样输出160位的消息摘要。

        

        抗抵赖性

        消息的机密性与完整性方案保护了通讯双方免受第三方的恶意攻击,然而,它不能保护通讯双方彼此之间的一些纠纷。那么,通讯双方会产生什么纠纷呢?让我们来看看下面的场景:

        1、A与B是合法的通讯双方,此时,A伪造了一个消息,并宣称这个消息来自与B,因为A可以使用与B共用的密钥创建一个合法的消息验证码。

        2、B否认发送了一个消息给A,因为A有可能得到的是一个来自于TA自己的伪造消息,没有任何证据证明B是否真正的发送过消息。

        和现实生活中一样,为了防止甲乙双方的这种抵赖行为,在做任何交易之前,都会有一纸合约,而合约上的签名就是双方不可抵赖的证据。在网络通讯中,也存在着类似这种签名的形式来抗抵赖。我们称之为数字签名。数字签名必须具有以下属性:

        1、它必须能核实签名的作者、日期与时间。

        2、它必须能验证签名时的消息内容。

        3、它必须被第三方认可,解决纠纷。

        数字签名提供两种类型的实现方法,直接与仲裁

        直接

        直接数字签名仅包含通讯双方,它假定接收方知道发送方的公钥。一个数字签名的形式可能是用发送者的私钥对消息整体进行加密,加密后的内容就被当成数字签名。还有可能是用发送者的私钥加密消息的散列值。这样如果接收方能用发送者的公钥解密,则能证明是正确的发送者发送的消息,因为只有发送者有私钥。

直接数字签名有一个弱点,这就是数字签名的安全性依赖于发送者私钥的安全性,如有一个发送者打算否认TA发送过某个消息,这发送者能宣称TA的私钥丢失了或被偷了以至于某个人仿造了TA的签名。另一个威胁是发送者的私钥在某个时刻T真的被偷了,而偷窃者在T时用发送者的签名发送了一个消息给接收者。

        仲裁

        为了解决直接数字签名的缺陷,仲裁数字签名诞生了。在仲裁数字签名中,增加了一个被称为仲裁者的新角色。仲裁数字签名的流程是这样的:

        首先,假设消息使用对称加密算法,假定发送者X与仲裁者A共享一个公共密钥Kax,接收者Y与仲裁者A共享一个公共密钥Kay,X的目的是发送消息M给Y。X先计算M的散列值,然后将X的某个代表自己身份的标识符(假设为IDx)与散列值结合形成数字签名,然后将数字签名用Kax加密与消息M一起发送给仲裁者A。A用Kax解密数字签名,并通过散列值验证消息M的完整性,以防在X发送给A的过程中,消息被篡改。然后A将X加密过的数字签名、IDx、消息M、与一个时间戳T一起用Kay加密发送给接收者Y。Y接收到数据后用Kay解密数据,拿到消息M。而经过X加密的数字签名,被存储在Y的系统内,留作证据。因为该数字签名是由Kax密钥加密的,Y无此密钥,所以篡改不了签名内容。而时间戳T,则是为了防止重放攻击。

        例子中的仲裁数字签名流程也存在一个问题,那就是仲裁者的权限太高了,发送、接收双方必须完全信任仲裁者,仲裁者也可以看到传送消息的明文。如果仲裁者被黑,那么消息将会暴露在攻击者的眼中一览无余。为此,仲裁数字签名诞生了另外两种模式,基于对称加密的对于仲裁者消息透明的数字签名与基于公钥加密的对于仲裁者消息透明的数字签名。

基于对称加密的消息透明型数字签名的流程是这样的:

        还是假设发送者X,接收者Y,仲裁者A。在这种模式中新增了一把X与Y的公共密钥Kxy,首先X将IDx,用Kxy加密的消息M,以及用Kax加密的X的数字签名发送给A,其中数字签名有IDx与用Kxy加密后的消息M的散列值组成。在A接收到数据后,用Kax解密数据,得到经过Kxy加密的消息M及其散列值,这样A就可以在无需知道消息明文M的情况下验证M的完整性。随后,A将用Kay加密的数据传送给Y,该消息由IDx,经过Kxy加密的消息M,X的数字签名组成。发送给Y后,Y可以通过Kxy密钥解密消息,获取明文。在这种流程下,即使仲裁者A被黑,攻击者也得不到明文消息M,因为A没有Kxy密钥。

基于公钥加密的消息透明型数字签名的原理与基于对称加密的消息透明型数字签名相似,其目的就是使仲裁者A无需了解消息明文就能对消息进行验证。

        在文章开头,我们谈论到,对于网络安全而言,有三类安全属性。消息的机密性,完整性与抗抵赖性,而实现安全属性的基础设施就是对称加密算法、公钥加密算法、MAC、Hash。大部分实现功能的安全架构、安全协议与安全系统都是由这些基础组件集成而来。在安全协议中,有分布在传输层的IPSec协议,分布在会话层的SSL/TLS协议,SET协议。用于主机服务器相互验证的Kerberos,用于密钥管理的X.509标准,还有Linux的PAM验证模块,这些安全体系或协议所实现的安全特性就是由这些基本的算法支撑的。以上,我们简单的谈论了下网络安全的基本属性,以及实现网络安全属性的基本方法。作为架构师,需要在不同的环境下了解哪些安全属性是需要的,哪些安全属性是不需要的,我们应该如何进行裁剪。并且应该知道使用哪些软件进行系统集成以达到我们的网络安全目标。后续我也将陆续介绍一些安全模型的配置方法,希望能为大家做一个介绍和参考。