张 昊,宋 杰,罗名君
(1.安徽城市管理职业学院 信息技术学院,安徽 合肥231635;2.安徽大学 计算机科学与技术学院,安徽 合肥230039;3.国防科技大学 电子对抗学院,安徽 合肥230031)
无线传感器网络(Wireless Sensor Network,WSN)是一种分布式传感网络,是由部署在一定范围内的多个价格低廉的微型传感节点组成,能以无线或有线方式相互通讯,形成一个自主系统的网络。目前,无线传感器网络应用广泛,主要适用于野外工作条件差,有线网络和无线网络无法覆盖的环境,如:军事领域的目标定位和追踪,民用领域的草原监测、医学护理等。WSN 通常应用于无人管理的区域中,很容易被攻击者侵入系统篡改和窃取数据,所以无线传感器网络的安全问题是其被广泛应用的一个重要瓶颈[1]。
针对以上问题,已经有不少公开发表的文献提出了各种解决方法,如:基于数字水印的安全传输技术[2]、基于能量优化的安全路由算法[3]、基于可信度的安全路由算法[4]、基于DV-Hop 的安全定位方法[5]等,可以有效地抵御针对WSN 的大多数攻击。然而以上研究多是在网络层面上进行的,数据比特流的完整性、准确性问题需要额外的手段加以保证,为此,笔者提出了一种基于MD5算法的分布式无线传感器网络数据安全传输方法,在发送端传输数据的末尾,附上一段用MD5算法生成的摘要,在接收端重新计算一次MD5 值,通过与接收到的MD5 值进行对比,可以检测出数据是否存在的删减、冗余、篡改等错误。MD5算法实现较为简单,便于能量受限的WSN 节点使用,且MD5算法生成的散列值对数据中的错误极其敏感,因此,可以有效地提高系统数据传输的安全性。
WSN不需依靠基础设备,可快速地的在一定区域内完成传感器节点的部署工作,用于检查周围情况变化并通过无线网络向数据监控中心汇报,网络组建灵活方便。通常部署一定规模的传感节点,彼此之间通过无线网络相互通讯,组成一个多跳自主无线网络系统。
无线传感器网络拥有数据众多的传感器节点,还包括功能较强的汇聚节点和管理节点。传感器节点拥有一个或多个组件,这些组件监测所处环境湿度、温度、压力等变化,对组件可以感知的数据进行初级处理。经过多次跳转后转发给汇聚节点,最终传输到后台数据监控中心。管理节点任务是对WSN 发送指令控制各节点正常有序运行。
限制分布式无线传感器网快速发展的主要原因是安全性,WSN 主要部署在野外困难的环境,安全条件差,获取的数据容易被篡改、被泄密。密钥技术、认证服务是保障WSN 安全工作的首选技术,但WSN 的局限性使得某些已成熟的网络安全手段无法在WSN 中实现。
WSN主要的局限性有以下几个方面:
(1)资源不足:因体积微小,传感器的节点无法配备更多的物理设备,最为突出的受限资源是电能。每步运行都消耗WSN 节点的电能,结果造成WSN 的公钥算法效果不佳。具体有:
①CPU能力不足:WSN 节点体积微小,不能安装功能强劲的CPU,以致即使运算量很少的处理,也将占据大量的CPU 资源。
②电力不足:WSN 采用电池供电,WSN 各节点主要部署在野外环境,很难对它们更换电池。因此,电力不足极大地减少了WSN 的使用寿命。
③内存不足:同样是因为体积微小,在WSN 上不能安装大空间的存储器,只能是128 KB 可编程Flash Memory 和4 KB 的RAM,即使附加了512 KB 的Flash Memory 后,仍无法比肩GB 数量级的其他电子设备。
(2)局部计算与通讯能力不足:分布式无线传感器是基于节点的局部计算与通讯,各类节点能够依据相邻节点之间传递的信息做出决断。但分布式局部计算和通讯与全局网络相比,无论在信息获取、运算能力、通讯速度等方面都凸显劣势。
(3)大规模部署困难:分布式无线传感器网需要放置数量众多的传感器节点来检测环境变化或监测特定目标。如何把成百上千的节点感知的信息发送给数据监控中心,且在安全保障的前提下尽量减小资源的占用,这需要将WSN 的CPU 运算、数据存储、信息转发等环节综合思考,协调处理。
在WSN中应用简单、高效的消息摘要算法,可以有效保护数据的完整性、可靠性。例如,在采样数据末尾附上一段单向散列值,让接收者可以对数据进行校验;节点设备还可以添加签名,便于网络内其他成员验证节点身份。
使用MD5算法,对WSN 传输的数据进行安全认证的过程如图1所示。
在发送端,计算一次待传输数据的MD5 值并附在数据末尾发送出去,接收端重新计算接收数据的MD5值,并与发送端计算得出的MD5 值进行比较,若明显不同则说明数据存在异常,可以启动重传机制,要求节点重新发送数据[6]。
2.2.1 数据预处理
MD5 加密操作是以512 比特为单位进行的,因此,在对数据进行摘要生成操作之前,首先要对其进行补位操作,使得补位之后的数据长度是512 比特的整数倍[7]。
设待加密的数据为d
其中di=0,1,i=1,2,…,N,表明数据长度是Nbits。补位的具体方法是:在数据结尾补1 个“1”,以及若干个“0”,直到数据长度满足
即此时N=(K×512+448) bits,其中K为一个自然数。将K用一个64 比特整数的形式附在数据的末尾。这时,数据被填补后的总长度为
将补位后得到的数据d′以512 比特为单位进行分段,可以得到K+1 个数据子段
2.2.2 参数定义
在MD5算法中,需要定义若干初始参数与函数,用于后续的变换操作[8]。
(1)设置4 个名为链接变量(Chaining Variable)的4 字节整型参数
然后,按以下规则使用链接变量对4 个新变量进行赋值
这样就得到了8 个初始变量A,B,C,D,a,b,c,d。
(2)定义4 个非线性函数(X,Y,Z为4 字节整数)
继续定义4 个分别用于四轮变换的函数。
对于一个512 比特的数据子段,将其分割为16 个子块Mj(j=0,1,2,…,15);<<
式(8)-(11)中的“=”为向左赋值符号。
2.2.3 基于MD5算法的数据加密过程
MD5算法主要流程叙述如下:原始数据经过补位,使得数据长度为512 bits 的整数倍;然后以512 bits长度的数据块为单位循环处理,每个数据块被划分为32 bits 长度的16 个子分组,每轮循环操作16 步。通过若干步运算与处理,算法将输出4 组32 位长度的散列值,通过级联得到128 bits 长度的数字签名[10]。
具体步骤如下:
这四轮(64 步)变换是:
第一轮
第二轮
第三轮
第四轮
第i步中,i的单位是弧度,ti是常量属于232×|sini|的整数部分。
将一轮64 步运算全部完成后,得到的4 个值a,b,c,d加到A,B,C,D上去,作为新的链接变量值,即:A←A+a,B←B+b,C←C+c,D←D+d。然后使用下一个512 bits 的数据块重复上述运算过程,当所有数据处理完成后,将A,B,C,D按比特流的形式级联,输出一个128 位的序列,即为所求的MD5 摘要值[11]。
2.2.4 算法伪代码
//说明:所有的变量都是32 位无符号整数,并按2^32 换模计算
int [64]m,n
m[0..15]:={8,20,8,24,8,20,8,24,8,20,8,24,8,20,8,24}
m[16..31]:={9,16,25,28,9,16,25,28,9,16,25,28,9,16,25,28}
m[32..47]:={6,11,18,27,6,11,18,27,6,11,18,27,6,11,18,27}
m[48..63]:={8,12,20,24,8,12,20,24,8,12,20,24,8,12,20,24}
for (i=0:i<=63:i++)
n[i]:=double(abs(sin(i+1))×2^32)
//初始化变量:
int k0 :=0x8659210A
int k1 :=0xBC89CE68
int k2 :=0x63EB72FD
int k3 :=0xF264DC78
//前期处理:
append the bit '1' to the message
append the bits '0' where length of message in bits≡448(mod 512)
append length of message(before pre-processing),in bits,as 64-bit little-endian integer
//在连续的512 位数据块中处理消息
break message into 512-bit chunks
for each chunk
break chunk into sixteen 32-bit little-endian words w[j],0<=j<=15
//初始化哈希值:
int a :=k0
int b :=k1
int c :=k2
int d :=k3
//主循环:
for (j=0:j<=63:j++)
{ if( 0<=j<=15)
{ p :=(x and y) or ((not x) and z)
q :=j}
else if 16<=j<=31
{ p :=(z and x) or ((not z) and y)
q :=(5×j+1) mod 16}
else if 32<=j<=47
{ p :=x xor y xor z
q :=(3×j+5) mod 16}
else if 48<=j<=63
{ p :=y xor (x or (not d))
q :=(7×j) mod 16}
temp :=z
z :=y
y :=x
x :=leftrotate((w+p+n[j]+w[q]),r[j])+x
w :=temp
}
//将哈希值添加到结果中
k0 :=k0+w
k1 :=k1+x
k2 :=k2+y
k3 :=k3+z
End For Each 512-bit chunks
int result :=k0 append k1 append k2 append k3
通过计算机仿真实验,将案例数据进行MD5 加密计算,得出的结果证明了文中提出的算法是可靠的、有效的。
硬件环境:Intel Core i7 4710HQ 平台计算机。
软件环境:Eclipse IDE for Java Developers,Version: Neon.1a Release (4.6.1)。
文中采用Java 语言实现MD5算法。
实验IMD5算法验证
为证明MD5算法的可靠性和有效性,采用了已知的几组MD5 值数据进行实验,验证结果见表1。“待加密信息”列是6 条常用的用于验证MD5算法的数据,“已知的参考MD5 值”列是已知的MD5算法计算结果,该仿真实验计算出的MD5 值在“计算出的MD5 值”列。
表1 MD5算法安全性验证
以上的MD5 值都采用16 进制形式列出,输出均是128 位单向散列值。对比可知计算无误,文中编写的程序可用于正确地计算MD5 值。
实验II算法安全性验证
下面对一条数据“GOLDEN_1dot6180339887”进行处理,在数据正确、缺失、冗余、篡改的条件下分别计算MD5 值,进而验证算法的安全性,结果见表2。
表2 算法安全性验证
在该实验中,受攻击的数据均与原数据有1 位的不同,而计算出的MD5 值完全不同。通过收、发两端的MD5 加密后的数据对比验证数据传输过程的安全可靠性。
WSN 节点设备通常安置在不安全的野外环境中,很容易被攻击者窃取、伪造、盗改传感器中采集的数据,降低了系统的安全性和有效性。在WSN 数据的末尾增加数字签名,将极大地增加了攻击者攻击数据的难度,提高了无线传感器网络系统的安全稳定性。该论文采用MD5算法为签名加密算法,以Java 为软件平台仿真了对数据计算摘要的过程。目前的硬件水平限制了传感器网络的性能,因而无法使用更为复杂的加密算法,但相信随着技术的发展,无线传感器网络的性能会越来越高,更安全、更复杂的算法可以应用到其中,WSN 将会更高效、更可靠。