为了提高内部网络数据的安全性,分析了网络驱动程序接口规范(NDIS)和Windows网卡驱动程序,提出了基于NDIS的网络数据链路层加密方案。
一、Windows环境下的网卡驱动程序。
1.网络驱动程序接口规范NDIS。
1989年,Microsoft和3com公司联合开发了网络驱动程序接口规范NDIS(NetworkDriverinterfaceSpecification)。NDIS规范了网络驱动程序之间的标准接口,使不同的传输能够以一种通用的方式访问不同制造商制造的网卡。网络驱动程序不是直接调用操作系统的例程,而是通过NDIS进行系统调用,而NDIS驱动程序所存在的环境是由NDIS库(NDIS.sys)创建的,该库输出一组标准接口,提供一个NDIS驱动程序无需直接与操作系统通信的系统函数集。
NDIS支持微端口驱动程序(Miniportdrivers)、中间驱动程序(In-tennediatedrivers)和协议驱动程序(Protocoldrir-ers)。NDIS各层驱动程序及其关系如图1所示:
2.网卡驱动程序。
在windows环境下,网卡驱动程序对应于NDIS的微端口驱动程序。。。微端口驱动程序工作在数据链路层,是与网络接口卡(NIC)结合最紧密的驱动程序。它调用NDIS库提供的接口函数来完成NIC与上层驱动程序之间的相互通信。NDIS库导出一组函数集(NDISXXX函数)来包装所有微端口需要调用的操作系统函数,微端口还输出一组MiniportXXX函数,供NDIS和上层驱动程序调用。
二、链路加密方案的设计与实现。
1.设计思想。
数据链路层是OSI系统结构的第二层。如果使用链路加密,则独立实现网络中每个通信链路的加密。不同的密钥可以用于每个链路,这样当链路被破坏时,其他链路上传输的加密信息就不会被解决。
NDIS微端口驱动位于网络链路层,是网络驱动中与网卡结合最紧密的驱动程序。因此,可以对微端口驱动程序进行改造,实现驱动程序中数据帧的截取,并调用加解密模块对数据进行加解密。如图2所示,驱动程序的改造可以分为两个步骤:截取数据帧和加解密模块。
(1)截取数据帧。
NDIS库为微端口驱动程序提供了一系列接口函数。微端口驱动程序可以利用这些函数在主机和网络之间建立联系,也可以利用这些函数截取数据。
在将本机数据发送到网卡之前,可以在微端口驱动程序中添加截取子程序截取数据帧,并将数据帧发送到加密模块进行加密,然后将加密后的密文发送到网卡缓冲区。接收数据时,从网卡缓冲区接收的密文被发送到主机内存,在发送到上层网络驱动程序之前被截取子程序截取,并调用解密模块解密成明文,然后将明文数据发送到上层处理。
(2)加密解密模块。
考虑到帧长度的限制,数据帧加密要求必须确保其明文和密文长度相等,因此在加解密模块中使用组密码算法,组密码工作模式是将明文分为固定长度组(块),用相同密钥加密每个块,输出也是固定长度密文,本文以DES为例。
考虑到软件加解密过程缓慢,为了提高速度,加解密模块直接嵌入微端口驱动程序,所有数据处理将在系统底部,大大提高数据处理效率,最后将所有模块集成,编译生成网卡驱动程序Mydriver.SYS文件,分别安装在两个主机中进行测试。
2.实现方案。
(1)实现工具和环境。
本方案建议对微端口驱动程序进行加解密,因此应选择适当的工具对微端口驱动程序进行改造。Driver网络驱动程序开发工具DriverStudio。
(2)数据的发送和截取。
数据发送由上层协议驱动。发送的数据信息用NDIS_PACKET包描述。NDIS库提供一些函数来提取包中的信息并处理它们。发送过程可分为两种情况:
1)当协议驱动程序有数据要发送时,启动传输操作,通过NIDS库调用微端口驱动程序的MydriverSend函数。该函数调用的参数是指向NDIS_PACKET包(描述要发送的信息)的指针。驱动调用NdisQueryPacket函数获取包的长度和存储在待发送包缓冲区的逻辑地址,然后设置MC上的寄存器发送包,返回成功发送的状态。
2)如果驱动程序不能立即发送包,则将其发送到待传输队列中,然后通过中断处理函数MydriverHandlelnterupt完成发送。
由于从上层传输到微端口层的数据包被放置在预先分配的缓冲区。通过NDIS提供的相应函数,可以得到缓冲区的第一个地址和数据长度。因此,可以在驱动程序中添加Send_lntercept子程序,并使用NDIS提供的函数来获得存储数据缓冲区的相应参数。然后调用加密模块接口函数DES_EN,子程序将加密的密文发送到网络上。
3.数据接收。
数据接收是将网络上的数据帧接收到网卡缓冲区,然后由驱动程序读取缓冲区中的数据内存。
网卡接收数据时会产生中断,因此驱动程序接收数据应首先在中断过程中进行。对于以太网卡,程序调用Ndismethreceivelndicate函数,将一个叫looka-head的数据传输给上层协议驱动,由协议驱动检查收到的数据是否符合协议要求。lookahead是指网卡中准备接收的数据的一部分,因为当协议驱动判断微端口接收的数据是否符合协议要求时,不需要判断所有数据,只需要判断部分数据。
如果协议驱动判断数据符合要求,将调用微端口的Mydrivertmnsferdata函数,将除looka-head外的剩余数据传输到内存中,然后交给上层驱动处理。当传输完成时,调用Ndismeth-mrivelndicatecomplete函数,通知上层驱动数据已被接收。如果协议驱动检查数据不符合要求,接收过程将终止。已传输到内存中的lookahead也将被下次收到的数据覆盖。
4.实现加解密。
实现加解密的主要思想是将加解密算法集成到驱动程序中,以传统的DES加解密算法为例。
数据在到加密模块之前,数据已经成帧,前14个字节存储源地址、目的地址和数据长度。发送截取函数Send_lntercept获得加密的数据长度和起始地址后,调用加密模块的接口函数DES_ENCRYPT,从数据的第15个字节开始加密,以加密除地址和数据长度以外的所有数据。数据加密后,驱动程序调用CardWrite函数将数据发送到网络中。
数据帧网卡缓冲区后,读者到内存中的前14个字节数据为源地址、目的地址和数据长度。这14个字节的信息以明文的形式存在。解密时,接收截取子程序Receve_lntercept,调用解密模块接口函数DES-DECRYPT,从密文数据中排名第一。