消息完整性服务在SSL记录层的实现分析
2012-06-25张鑫燕
张鑫燕,叶 猛
(1.光纤通信技术与网络国家重点实验室,湖北 武汉 430074;2.武汉邮电科学研究院,湖北 武汉 430074;3.武汉虹旭信息技术有限责任公司安全产品部,湖北 武汉 430074)
在过去10年中,基于计算机网络的信息获取模式已经逐步取代传统模式被人们广泛应用,企业之间的信息交互也更多地依赖于计算机网络。各种网络增值服务和应用的使用率很大程度上取决于它们所能提供的服务安全,信息安全已成为人们评估各项网络服务的重要指标之一,成为互联网通信急需解决的问题之一。由Netscape公司提出的工作在传输层之上的安全套阶层协议SSL[1],可以在客户端和服务器端之间建立一条安全通道,保证通信不被窃听,并且始终对服务器进行认证,将传送的数据进行加密和隐藏,有效提高了应用程序之间数据的安全性,已成为事实上的标准。SSL分为两层,高层是SSL握手协议,允许通信双方在应用协议传输和接收第1个数据字节前彼此之间相互认证、协商加密算法、生成密钥等。低层是SSL记录协议层,由更高的层次那里接收需要传输的任意长度的应用报文,将接收到的信息分段成可管理的块,进行数据压缩、数据认证和加密等操作。
1 SSL记录层体系结构及工作过程
1.1 记录层协议概述
SSL协议可以为应用层通信提供独立的安全通道,包括身份验证、消息完整性和信息加密。其中后两者是由记录层提供的。信息加密性是指记录层协议会使用算法利用握手协议中提供的安全参数产生各种密钥,利用这些密钥将客户机和服务器之间传送的数据进行加密处理(DES、RC4等),对称加密所产生的密钥对每个连接都是唯一的[2],网络中的非法窃听者所获取的信息都将是无意义的密文信息,记录协议也支持非加密传输,机密性的实现在本章不做讨论。消息完整性服务是指通过特定的算法利用数据的原始信息计算出标识信息的特征值,此特征值在接收端通过验证说明消息没有遭到第三方篡改和破坏。
1.2 记录层中的消息完整性分析
MAC算法利用摘要算法,计算MAC的初始元素是消息的原始信息,消息被第三方修改后此信息会发生变化而不能生成相同的MAC。MAC传送时还需要依赖密钥,发送方发送数据时使用共享密钥对信息进行加密,添加一个也是基于该密钥构造的MAC,这样保证了接收方的身份,因为只有真正的接收方才与其共享解密时需要的密钥。而接收方也能确认发送方的身份,因为只有发送方才具有创建消息上的MAC时所需要的密钥,这样就可以保证消息的完整性。过程如图1所示。
图1 消息完整性原理图
1.3 SSL记录层协议操作过程
记录层所处理的数据主要是来自其上层协议握手层,握手层中的数据主要是身份验证数据,确定密钥参数和加密算法的数据以及其所承载的应用数据。记录层将数据进行SSL明文分段、SSL压缩、SSL密文这些步骤生成一系列的SSL数据段,每一个SSL数据段均是被单独保护且具有验证消息完整性功能的数据包。记录协议的操作过程如图2所示。
图2 记录协议的操作过程
分段是指将数据进行分块,每块最大长度为214byte,对于上层握手协议的数据包,因为其长度都没有超出需要分段的最大长度故不需要分段。压缩处理在记录层协议中是可选的,若没有定义压缩算法可以不压缩。压缩必须是无损的,并且不能使内容的长度大于1024 byte。
记录协议从高层SSL收到传输片段之前,根据经过压缩的数据片段计算出MAC值,并与数据连结在一起。通过在压缩数据上计算消息认证MAC可以进行信息完整性检查,以验证其消息是否遭到攻击。
加密的过程用于提供消息的机密性,对压缩数据和MAC进行加密,SSL记录层协议也支持明文传输,添加记录头生成记录数据。
1.4 可验证消息完整性的数据段结构
经过处理后的SSL数据段由记录头和长度不为0的记录数据组成的,结构体如图3所示。其中记录头包含了内容类型、协议版本号、长度。长度字段标识了记录的长度,接收方每次只取固定长度的消息,双方使用的版本磋商依靠版本号来进行。SSL需要在同一条受保护的通道中传输控制信息与用户数据,由内容类型来进行区分[3]。每一条记录数据段中共有3种类型的数据,即用于验证消息完整性的MAC数据、具有用户意图的应用数据和粘贴在尾部的填充数据。实际数据即为压缩后的用户数据和粘贴数据是一种填充数据,指在实际数据的尾部添加0数据,以保证数据长度是数据块长度的整数倍,MAC数据将会在下面进行详细介绍。
图3 保证消息完整性的数据结构
2 消息完整性实现
2.1 消息完整性实现总体思路
记录层接收到并为其服务的数据是它的上层协议握手层中的数据,所有初始的握手协议报文在传送时都是未保护的,在协商完成之后,会建立一条新的连接来传输应用数据,此连接将以客户端发出的一个报文Finished为开始。此数据包若被篡改和攻击,会影响整条应用数据流的安全性,因此必须对它添加一个标识身份的报文识别码(MAC),这个MAC是通过对握手过程中产生的所有被主密钥加密后的协商包计算得出的。只有在验证了Finished数据中的MAC数据之后,通信双方才真正开始传输应用层上的数据。除了Finished数据,必须保证代表用户真正意图的应用层的数据的消息完整性。因此MAC算法针对的是握手连接建立之后客户端传送的第一个Finished数据包,以及之后通信双方传送的应用数据包[4]。
消息完整性算法的实现需要计算出能唯一表征此消息的特征值,利用传输数据计算出的MAC就是针对此功能,对于MAC算法的设计有两点要求,第一是不可由特征值推算出原始数据,即要求MAC算法具有不可逆性。其次,不同的消息要可以生成不同的MAC,这样可以防止有消息窃听者将原始消息进行替换,即要求算法具有抗冲突性。这正是散列算法的特性,因此SSL采用的MAC算法一般是基于MD5或SHA的散列算法,这里详细介绍基于MD5算法的设计原理。
2.2 MD5散列算法分析
MD5散列算法的输入是长度为512位的数据分组[5],不同长度的消息在计算时需要确保分组各不相同,因此最后一个分组是由消息、填充字节以及一个64位的消息长度构成的。每一组又被划分为16个32位子分组,其输出是4个32位字的级联生成的128位散列值。
胡四一:《意见》共分5章20条,明确提出了实行最严格水资源管理制度的指导思想、基本原则、目标任务、管理措施和保障措施。主要内容概括来说,就是确定“三条红线”,实施“四项制度”。
MD5算法共有4轮,每一步都加入了前一步的结果且有唯一的加法常数,虽然MD5相较于MD4[6]算法更为复杂,运算速度相对要慢一点,但因为在抗分析安全性上的出色表现已经基本取代了MD4。MD5算法中主循环共4轮,而循环的次数由长度为512位的消息分组个数决定,4轮主循环中分别用到了下列非线性函数程序:
这4个非线性函数对进入主循环的16个32位分组进行4轮变换,具体操作如下:首先分别将每个512位的分组输入分割成4个链接变量(A,B,C,D),并创造一份这4个链接变量的副本(a,b,c,d),将4个副本中的3个经K,M,N,I非线性函数运算后的结果与第4个副本相加,再加上一个32位的加法常数,将相加得出的最终结果循环左移若干位,再任取a,b,c,d中任意一个与此值相加,即可返回更新A,B,C,D的数值,这样便进行了一次循环。
MD5中所用的32位加法常数靠创建一张i取值为1~64的表H[i]来定义,再取i的正弦绝对值,并对其做4294967296次方运算,得出的整数部分就是H[i],在变换中对i进行幂运算和正弦运算可以更好地消除MD5变换中的线性性[7]。
运算完所有的分组后即输出MD5算法的散列结果,将A,B,C,D进行级联运算后得到的就是最终结果。下面展示部分MD5算法结果的例子:
MD5散列函数的输入消息长度为512位,生成的固定长度的散列特征值为128位,从而使得几乎不可能存在函数的逆。
MD5散列函数的抗冲突性强度与生成的摘要值长度有关,一个64位的摘要值抗冲突的强度为32位,即128次操作里才可能出现一次冲突。因此两条不同消息能产生相同摘要值的概率是非常低的。
2.3 Finished数据的计算
握手层数据中客户端发出的Finished消息能确认握手过程的真实性,确认握手消息是否有被任何攻击者修改过,是第一条使用最新协商出的一组密钥加密实现自我保护的消息。且Finished消息也是第一条进行MAC计算的消息,该MAC算法与应用层数据的MAC算法相同。如图4所示,该算法采用两轮MD5散列算法,第一轮调用MD5的输入就是将所有握手消息、Sender常量、主密码以及一些填充字节进行组合。第二遍调用MD5的输入为主密码、一些填充字节以及第一次MD5计算输出的组合。Sender常量可以确保通信双方产生的Finished消息不会重复,避免第三方重发Finished消息的攻击[8]。
图4 Finished消息的算法
以MD5为基础的算法中pad_1和pad_2是两个数组,pad_1数组是由固定元素0x36填充,pad_2数组是由固定元素0x5c填充,且数组的长度为16 byte,由于MD5的分组长度为64 byte,所以1个16 byte的密钥就意味着需要48 byte的填充,即pad_1和pad_2的填充长度均为48 byte。使用填充的目的是确保MAC密钥与填充加在一起可以充满消息摘要第一块的整块空间[9]。
2.4 MAC算法实现
MAC实现总体方案是将用户的压缩数据进行散列(Hash)计算,具体选择哪种Hash算法是通过握手协议中选择的套件来决定的,由图5可看出一共经历了2轮Hash算法。参与计算的元素有密钥、pad_1、pad_2、内容类型、包长度、数据包以及seq_num组成。
图5 MAC算法的实现
MAC_secret_key分为 Client_write_MAC_secret和Server_write_MAC_secret,它们的使用者身份不同,客户端发送的数据进行MAC计算时会用到的key是Client_write_MAC_secret,服务器发送数据进行MAC运算时用到的key是Server_write_MAC_secret。若想有效地利用MAC算法验证消息完整性,必须保证密钥不被窃取和篡改。
seq_num是一个64位的序号,序号是一个可以被发送和接收双方递增的计数器,计算器可以循环使用且初始值全为0,即客户端与服务器所发送的第一条消息的序号为0。记录层协议需要计算MAC值的第一条消息是握手层数据中客户端发出的Finished消息,此时序号为初始值全0,之后数据每进行一次MAC计算,此序号的值就会一次递增,这样每个经过MAC运算的数据包都会按次序分配一个不重复的序列号来标识[8]。
2.5 MAC算法中密钥的管理
MAC算法需要密钥的参与,没有密钥的非法用户在改变消息的内容后,无法添加正确的MAC值,MAC值验证将会失败,从而保证非法用户无法随意修改消息内容。
SSL利用非对称密钥算法加密密钥的方法实现密钥交换,保证第三方无法获取该密钥。如图6所示,SSL客户端利用SSL服务器的公钥加密密钥,将加密后的密钥发送给SSL服务器,只有拥有对应私钥的SSL服务器才能从密文中获取原始的密钥。SSL客户端发送给SSL服务器的密钥并不能直接用来加密数据或计算MAC值,该密钥是用来计算对称密钥和MAC密钥的信息,称为Premaster Secret[10]。SSL客户端和SSL服务器利用Premaster Secret计算出相同的主密钥(Mastersecret),再利用Master Secret生成用于对称密钥算法、MAC算法等的密钥。SSL通常采用RSA算法加密传输密钥。
图6 密钥交换示意图
3 消息完整性服务的安全性分析
针对消息完整性服务的攻击有两种,分别是重放攻击和再排序攻击。
3.1 重放攻击
重放攻击指攻击者获取敏感有效数据并将它重复发送,通过身份验证欺骗服务器,以达到劫持会话的目的。对于这种攻击仅仅使用MAC是无法防御的,因为重复的信息包中MAC是正确的。SSL协议将传输的信息进行编号来增加消息的关联性,在通信过程中,将标示数据包顺序的序列号隐藏在生成的MAC中,双方序列号彼此相互依赖且由通信双方单独维护,每一次有新密钥交换时序列号均进行更新,攻击者在不能提供合法的序列号进行会话劫持肯定是失败的。
3.2 再排序攻击
再排序攻击指攻击者交换一条或多条记录的顺序,使用序号可以检测出这种攻击,但由于序号并不在记录中,所以无法对其加以纠正。因此,SSL必须运行于一种能够提供可靠传输的传输协议之上。TCP满足这些要求,基于TCP传输的数据可以以任何顺序到达,但是可以确保应用看到的是传输时的顺序,而UDP不是这样,因此SSL不能成功地在UDP上运行。基于UDP传输的任何记录都有可能顺序错乱或者丢失,这看上去就像针对SSL实施的主动攻击[11]。
4 小结
SSL记录层将握手层协议的数据进行封装提供消息完整性和不可读性。记录层采用的加密算法和MAC算法在握手层中完成协商。记录层还会为传送的每一条数据添加一个序列号,用于检测消息是否遭到丢失或重放。SSL记录协议还可以在握手层协商好压缩算法的基础上进行数据压缩。采用散列函数和机密共享的方法使SSL协议保证数据完整、准确地到达对端,从而提供了消息完整性服务。
[1]RFC2246,The TLS protocol version 1.0[S].1999.
[2]宋志敏,王卫京,南相浩.SSL V3.0及其安全性分析[J].计算机工程与应用,2000(10):145-147.
[3]SSL Protocol Version 3.03/4/96[EB/OL].[2011-11-13].http://www.snca.com.cn/Upload/200721216458844.doc.
[4]董智鹏.SSL协议的初步研究和应用[J].仪器仪表与分析监测,2010(2):15-20.
[5]RIVEST R L.The MD4 message digest algorithm[C]//Proc.10th Annual International Cryptology Conference on Advances in Cryptology.London:Springer-Verlag,1990:303-311.
[6]RFC 1321,The MD5 message digest algorithm[S].1992.
[7]黎琳.MD4算法分析[J].山东大学学报:理学版,2007(4):42-45.
[8]RESCORLA E.SSL与TLS[M].崔凯,译.北京:中国电力出版社,2002.
[9]张艺博.OpenSSL源码的记录层解析[J].电脑编程技巧与维护,2009(2):48-51.
[10]齐芳,贾维嘉,王国军.SSL握手协议中客户端平衡密钥交换算法[J]. 计算机工程与应用,2007(43):32-36.
[11]赵川,伍瑞卿,樊丰.一种精简TCP/IP协议栈的设计与实现[J].电视技术,2010,34(9):34-39.