目 录 论文总页数:23页 1 引言 1 2 网络数据加密技术 1 2.1 链路加密 1 2.2 节点加密 2 2.3 端到端加密 2 3 系统的总体分析 3 3.1 网际协议分析 3 3.2 套接字结构分析 5 3.3 Linux下IPv4的实现 6 3.4 DES算法介绍 8 4 系统的设计与实现 12 4.1 系统的总体设计 12 4.2 模块部分的设计与实现 13 4.3 DES算法实现 15 4.4 对内核函数的修改 18 5 网络层加密系统的测试 18 结 论 21 参考文献 21 致 谢 22 声 明 23
1 引言 随着网络技术的发展,网络安全也就成为当今网络社会的焦点中的焦点,几乎没有人不在谈论网络上的安全问题,病毒、黑客程序、邮件炸弹、远程侦听等这一切都无不让人胆战心惊。病毒、黑客的猖獗使身处今日网络社会的人们感觉到谈网色变,无所适从。 但我们必需清楚地认识到,这一切一切的安全问题我们不可一下全部找到解决方案,况且有的是根本无法找到彻底的解决方案,如病毒程序,因为任何反病毒程序都只能在新病毒发现之后才能开发出来,目前还没有哪能一家反病毒软件开发商敢承诺他们的软件能查杀所有已知的和未知的病毒,所以我们不能有等网络安全了再上网的念头,因为或许网络不能有这么一日,就象“矛”与“盾”,网络与病毒、黑客永远是一对共存体。 现代的网络加密技术就是适应了网络安全的需要而应运产生的,它为我们进行一般的电子商务活动提供了安全保障,如在网络中进行文件传输、电子邮件往来和进行合同文本的签署等。其实加密技术也不是什么新生事物,只不过应用在当今电子商务、电脑网络中还是近几年的历史。 当今网络社会选择加密已是我们别无选择,其一是我们知道在互联网上进行文件传输、电子邮件商务往来存在许多不安全因素,特别是对于一些大公司和一些机密文件在网络上传输。而且这种不安全性是互联网存在基础——TCP/IP协议所固有的,包括一些基于TCP/IP的服务;另一方面,互联网给众多的商家带来了无限的商机,互联网把全世界连在了一起,走向互联网就意味着走向了世界,这对于无数商家无疑是梦寐以求的好事,特别是对于中小企业。为了解决这一对矛盾、为了能在安全的基础上大开这通向世界之门,我们只好选择了数据加密和基于加密技术的数字签名。 2 网络数据加密技术 2.1 链路加密 对于在两个网络节点间的某一次通信链路, 链路加密能为网上传输的数据提供安全保证。对于链路加密(又称在线加密), 所有消息在被传输之前进行加密, 在每一个节点对接收到的消息进行解密, 然后先使用下一个链路的密钥对消息进行加密, 再进行传输。在到达目的地之前, 一条消息可能要经过许多通信链路的传输。 由于在每一个中间传输节点消息均被解密后重新进行加密, 因此, 包括路由信息在内的链路上的所有数据均以密文形式出现。这样, 链路加密就掩盖了被传输消息的源点与终点。由于填充技术的使用以及填充字符在不需要传输数据的情况下就可以进行加密,这使得消息的频率和长度特性得以掩盖, 从而可以防止对通信业务进行分析。 尽管链路加密在计算机网络环境中使用得相当普遍, 但它并非没有问题。链路加密通常用在点对点的同步或异步线路上, 它要求先对在链路两端的加密设备进行同步, 然后使用一种链模式对链路上传输的数据进行加密。这就给网络的性能和可管理性带来了副作用。 在线路/信号经常不通的海外或卫星网络中,链路上的加密设备需要频繁地进行同步, 带来的后果是数据丢失或重传。另一方面, 即使仅一小部分数据需要进行加密, 也会使得所有传输数据被加密。 在一个网络节点, 链路加密仅在通信链路上提供安全性, 消息以明文形式存在, 因此所有节点在物理上必须是安全的, 否则就会泄漏明文内容。然而保证每一个节点的安全性需要较高的费用, 为每一个节点提供加密硬件设备和一个安全的物理环境所需要的费用由以下几部分组成: 保护节点物理安全的雇员开销, 为确保安全策略和程序的正确执行而进行审计时的费用, 以及为防止安全性被破坏时带来损失而参加保险的费用。 在传统的加密算法中, 用于解密消息的密钥与用于加密的密钥是相同的,该密钥必须被秘密保存, 并按一定规则进行变化。这样, 密钥分配在链路加密系统中就成了一个问题, 因为每一个节点必须存储与其相连接的所有链路的加密密钥, 这就需要对密钥进行物理传送或者建立专用网络设施。而网络节点地理分布的广阔性使得这一过程变得复杂, 同时增加了密钥连续分配时的费用。 2.2 节点加密 尽管节点加密能给网络数据提供较高的安全性, 但它在操作方式上与链路加密是类似的:两者均在通信链路上为传输的消息提供安全性,都在中间节点先对消息进行解密,然后进行加密。因为要对所有传输的数据进行加密,所以加密过程对用户是透明的。 然而,与链路加密不同, 节点加密不允许消息在网络节点以明文形式存在,它先把收到的消息进行解密, 然后采用另一个不同的密钥进行加密, 这一过程是在节点上的一个安全模块中进行。 节点加密要求报头和路由信息以明文形式传输, 以便中间节点能得到如何处理消息的信息。因此这种方法对于防止攻击者分析通信业务是脆弱的。 2.3 端到端加密 端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在。采用端到端加密(又称脱线加密或包加密), 消息在被传输时到达终点之前不进行解密, 因为消息在整个传输过程中均受到保护, 所以即使有节点被损坏也不会使消息泄露。 端到端加密系统的价格便宜些, 并且与链路加密和节点加密相比更可靠,更容易设计、实现和维护。端到端加密还避免了其它加密系统所固有的同步问题, 因为每个报文包均是独立被加密的, 所以一个报文包所发生的传输错误不会影响后续的报文包。此外,从用户对安全需求的直觉上讲, 端到端加密更自然些。单个用户可能会选用这种加密方法, 以便不影响网络上的其他用户, 此方法只需要源和目的节点是保密的即可。 端到端加密系统通常不允许对消息的目的地址进行加密, 这是因为每一个消息所经过的节点都要用此地址来确定如何传输消息。由于这种加密方法不能掩盖被传输消息的源点与终点, 因此它对于防止攻击者分析通信业务是脆弱的。 3 系统的总体分析 3.1 网际协议分析 3.2 套接字结构分析 在Linux系统TCP/IP协议栈设计中的一个基本概念就是套接字缓存,称作sk_buff,在整个联网代码中用于存储各种信息。它满足了网络协议对内核的存储器管理能力提出的很多要求。这些要求包括能方便的操作可变长缓存,能在缓存的头部和尾部填加数据,能从缓存中移除数据,并能尽量减少这些操作所做的数据复制。它被定义在include/linux/skbuff.h中,其结构表示如图2: 由图2可见,套接字缓存由两部分组成: 报文数据:该存储区域保存了实际在网络中传输的数据; 管理数据:当一个报文在Linux内核中进行处理时,内核需要额外的数据,这些数据没有必要存储在实际的报文当中。这些主要是实现方式中特有的数据(指针、计数器等)。他们构成了协议实例间交换的接口控制信息。 套接字缓存是用来定位和管理一个报文在内核中被处理的整个周期的。当应用程序向一个套接字传输数据后,该套接字就创建相应的套接字缓存并将有效数据的地址存入此结构的变量中。在报文穿过层的过程中,每一层的报文的头信息被插入到有效数据之前。由于为报文头申请了足够的空间,所以避免了在报文头之后对有效数据的多次拷贝。有效数据只被拷贝了两次,一次是从用户空间到内核空间,一次是到达网卡的时候。 3.3 Linux下IPv4的实现 对于基于TCP/IP协议实现的网络来说,IP层是完成数据传输的必要层,网络层以上的包都要经过网络层。数据包可以从三处进入具体的网络层: 通过网络适配器抵达计算机的包会存储在对应的输入队列中。判定了数据链路层中的三层协议后,上层协议为IP的包会传递给ip_rcv()函数。 第二处入口位于传输层协议接口处。这些是TCP、UDP等协议用到的包。这些协议使用ip_queue_xmit()函数将他们打包成IP包并发送出去。还有一些其他函数也能生成IP包。 第三种情况就是:IP层自动主动生成IP包。这些包主要是新的多播包、大型包的碎片及不含专门有效负载的ICMP包或者IGMP包。这些包是用特殊的方法创建的(如icmp_send())。 包一旦进入了网络层,就会有多种退出选择。对IP而言,我们一般只区分计算机可扮演的两种不同角色,其中第一种是第二种的特例。 终端系统:Linux计算机正常情况下会配置成终端系统——它会用作工作站或者服务器。主要负责的任务是运行用户应用程序或者提供应用程序服务。终端系统的基本属性是,它们不会转发IP包。也就是说,如果系统实际上只有一块网络适配器,即可认定它是终端系统。即使有多种网络访问的系统也可以配置成终端系统——只要禁用包转发即可。 路由器:路由器将抵达一块网络适配器的IP包传递给另一块网络适配器。也就是说,路由器拥有多块在本地接口之间转发包的网络适配器。包抵达路由器之后,一般有两种选择:可以本地投寄(即传递给上层协议处理);或者,可以转发包。因此,路由器可以看作是终端系统的一般化,它还有额外的包转发功能。与终端系统相反,路由器一般不会启动任何应用程序,以此确保尽可能快的转发包。 Linux内核中IP包流经网络层时,其主要途径如图3。 首先分析传入包的情况。Ip_rcv()进行一些IP协议工作。首先,该函数丢弃那些并非去往本地计算机的包;接着过滤掉包头错误的包,主要是检验它的尺寸是否至少相当于IP包头,包是否是IPv4,检验和是否正确,包的长度是否错误。然后再把包传递给ip_rcv_finish()。 Ip_rcv_finish()中激活ip_route_input()函数以决定包的路由。接下来,ip_rcv_finish检查IP头是否含有选项。如果确定含有选项,则分析这些选项并创建一个ip_options的结构;所有选项设置都会有效的存储在这个结构中。 最后在ip_rcv_finish()中,IP流程走到了一个岔路口:包是去往本地还是被转发: 遇到应该投递给本地计算机的单播包或多播包时,则进入ip_local_deliver(); 遇到需要转发的单播包则进入ip_forward(); 遇到需要转发的多播包则交给ip_mr_input()处理; 由于这里路径出现分支,而针对个人计算机,一般不开启转发功能,在这里只描述包的本地投寄。不需要转发的数据包被ip_rcv_finish()传递给ip_local_deliver()。Ip_local_deliver()的首要任务是利用ip_defrag()组装那些分片后的包。 接着,流程流向ip_local_deliver_finish()。在这里会需要为下一步处理判定传输协议。 在这里,分析包的传出流程。本地创建的包在处理时与传入时是完全独立的。首先,创建IP头的函数不只一个,而是多个,其中包括了ip_queue_xmit()、ip_build_and_send_pkt()和ip_push_pending_frames()。每个函数针对某项特殊用法进行了定制和优化。其中ip_build_and_send_pkt()只处理TCP连接过程中的SYN/ACK等包,而ip_queue_xmit()函数来自上层协议的其他包,ip_push_pending_frames()处理ip层自身的包。它们首先会检查套接字结构中路由。若尚未选择路由,则启用ip_route_output()选出一个路由。接着会填充IP包的各个字段(版本、包头长度、TOS字段、碎片偏移量、地址级协议字段)。然后,会由ip_options_build()添加可能存在的IP选项。最后计算检验和。然后流程流经ip_queue_xmit2()等函数,最后到达链路层,由链路层继续处理。 3.4 DES算法介绍 美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的(通常称为DES 密码算法要求)主要为以下四点: 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改: 具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握; DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础; 实现经济,运行有效,并且适用于多种完全不同的应用。 结 论 本文从网络加密技术分类谈起,对各种网络加密技术的优势缺点做了分析比较。讲述了DES算法的过程,描述了IP的功能和结构,并对Linux最新内核版本2.6.21的IP层实现进行了分析。在此基础上给出了采用DES算法的IP层加密系统的实现方案并予以实现。此系统能够实现基于IP地址的端到端加密传输。通过这次实践,我加深了对TCP/IP协议栈的认识,了解了Linux网络协议栈的 实现过程。对Linux环境下的程序开发流程有了更深的了解。由于对Linux环境下的程序开发处于初级阶段,所以该系统没有商用价值,但可以作学习交流用途。 参考文献 [1] Klaus Wehrle[美].Linux网络体系结构[M].北京:清华大学出版社,2006 [2] W.Richard Stevens[美].TCP/IP详解卷一:协议[M].北京:机械工业出版社,2004 [3] Gary R.Wright[美],W.Richard Stevens[美].TCP/IP详解卷二:实现[M].北京:机械工业出版社,2006 [4] Kurt Wall[美].GNU/Linux编程指南[M].北京:清华大学出版社,2005 [5] 毛德操[中] 胡希明[中].Linux内核源代码情景分析上册[M].杭州:浙江大学出版社,2001 [6] Christian Benvenuti[意]. 深入理解Linux网络内幕[M].南京:东南大学出版社,2006 [7] Wenbo Mao[英].现代密码学理论与实践[M].北京:电子工业出版社,2004 [8] W.Richard.Stevens[美].UNIX环境高级编程[M].北京:机械工业出版社,2006 |