发明内容
本发明的目的是提供一种6LoWPAN网络密钥建立方法,计算量小,节省通信时间。
根据本发明的一个方面,提供一种6LoWPAN网络密钥建立方法,包括:
步骤1、内部路由器节点Rx接收到第一个来自路由器节点Ru的DIO消息后,向节点Ru发送消息请求得到组密钥,该消息为:
Rx→Ru:k+{f(k+Δ1)||KI}f(k)
其中,k为Rx的Rank值,也表示为Rank(Rx),KI为初始密钥,||表示串接,{f(k+Δ1)||KI}f(k)表示根据AES加密算法用f(k)加密f(k+Δ1)和KI串接后的数据;并且,
f(k)=F(f(k-1)||salt(k))
其中,k>1,salt(k)表示进行第k次Hash计算所用的加盐值,F(f(k-1)||salt(k))表示对f(k-1)||salt(k)进行Hash函数值计算;
步骤2、Ru收到消息后,根据消息中的k值计算f(k)和f(k+Δ1);
步骤3、Ru使用f(k)解密{f(k+Δ1)||KI}f(k)信息,然后把解密出的f(k+Δ1)与自己计算的值进行比较,如果相等,则Ru对Rx认证通过,否则认证不通过;
步骤4、如果Rx认证通过,则Ru把KI作为与Rx之间的对密钥进行保存,并且向Rx回应消息:
Ru→Rx:{KG||f(Rank(u))||salt(Rank(u)+1)||Rank(u)||IIu}KI
其中,salt(Rank(u)+1)表示进行第Rank(u)+1次Hash计算所用的加盐值;
步骤5、Rx收到回应消息后,通过KI解密整个消息,得到Ru的接口标识IIu,然后和数据包源地址中的接口标识进行对比实现对Ru的认证;
步骤6、如果Ru认证通过,Rx得到组密钥KG,并把Ru作为自己的父节点、存储两者之间的对密钥KI;Rx得到的其它信息包括Rank(u)、f(Rank(u))和salt(Rank(u)+1)。
可选的,在步骤6后还包括:
步骤7、Rx收到来自邻居节点Ru和Rv的DIO消息后,用组密钥KG解密该消息,并按照RPL路由协议根据DIO中的Rank值重新选择父节点;
步骤8、如果Rx选择的父节点仍然是Ru,则Rx先依据Ru的Rank(u)值,按照RPL协议计算Rank(x),然后根据所述f(Rank(u))和salt(Rank(u)+1)计算出f(Rank(x))和salt(Rank(x)+1);
步骤9、如果选择的父节点是Rv,则Rx使用多播地址发送对密钥建立消息,消息中包含的信息为IIv+Rank(x),IIv指明要建立对密钥的父节点接口标识,Rank(x)指明用于响应消息加密的密钥f(Rank(x)),多播消息使用组密钥生成消息验证码MAC,并用组密钥进行加密:
Rx→*:MAC+{IIv||Rank(x)}KG
步骤10、邻居节点收到对密钥建立消息后,根据组密钥对消息验证码MAC进行验证,验证通过后解密该消息,然后根据IIv的值判断是否是和自己建立对密钥;
步骤11、对于Rv来说,根据IIv的值判断Rx是与自己建立对密钥,随机生成对密钥KP,然后回应消息,用f(Rank(x))进行加密:
Rv→Rx:{f(Rank(v))||salt(Rank(v)+1)||KP}f(Rank(x))
步骤12、Rx收到响应消息后,通过f(Rank(x))解密出其中的信息,把Rv作为自己的父节点,保存两者之间的对密钥KP,然后根据f(Rank(v))和salt(Rank(v)+1)重新计算自己拥有f(Rank(x))和salt(Rank(x)+1)。
可选的,计算{f(k+Δ1)||KI}f(k)包括:
步骤1A、随机生成一个长字节数据串作为Hash函数计算的初始数据,并确定常量整数Δ1的值;
步骤1B、根据内部路由器节点部署在树状结构的层次深度,估算一个Rank值k;
步骤1C、计算f(k)和f(k+Δ1);和
步骤1D、随机生成一个初始密钥KI,然后根据AES加密算法用f(k)加密f(k+Δ1)和KI串接后的数据,生成加密后的数据{f(k+Δ1)||KI}f(k)。
可选的,在步骤12后还包括:
步骤13、普通节点Hy发送消息,包括RS、k和{f(k+Δ1)||KI}f(k):
Hy→*:RS+k+{f(k+Δ1)||KI}f(k)
步骤14、邻居路由器Rn收到消息后,计算f(k)和f(k+Δ1);
步骤15、使用f(k)解密{f(k+Δ1)||KI}f(k)信息,然后把解密出的f(k+Δ1)与自己计算的值进行比较,如果相等,则Rn对Hy认证通过,否则认证不通过;
步骤16、认证通过后,Rn把KI作为两者之间的对密钥进行保存,然后回应路由通告消息,并使用KI对关键信息进行加密:
Rn→Hy:RA+{Rank(n)||f(Rank(n))||salt(Rank(n)+1)||KG||IIn}KI;
步骤17、Hy收到消息后,把Rn作为默认路由器;通过KI解密消息,得到IIn,然后和数据包中的接口标识进行对比实现对Rn的认证;保存组密钥KG,在Rank(n)上增加一个数值计算Rank(y),然后在f(Rank(n))和salt(Rank(n)+1)的基础上计算出f(Rank(y))和salt(Rank(y)+1);KI作为与Rn之间的对密钥进行保存。
可选的,在步骤17后还包括:
步骤18、普通节点A选择随机整数m,使得m>Rank(A),然后向普通节点B发送HELLO消息和m值;
A→B:HELLO+m
步骤19、普通节点B收到HELLO消息后,判断m和Rank(B)的大小;
如果m≥Rank(B),则普通节点B生成两者的会话密钥KAB,然后向普通节点A发送密钥消息,内容为{KAB}f(m),KAB用f(m)加密:
B→A:{KAB}f(m)
如果m<Rank(B),则普通节点B选择随机整数n使得m<n(例如差值小于10不要太大),然后向普通节点A发送HELLO消息和值n:
B→A:HELLO+n
步骤20、普通节点A接收到消息后,如果是密钥消息,通过计算f(m)解密出会话密钥KAB;如果是HELLO消息,则生成两者的会话密钥KAB,然后向B发送密钥消息,内容为{KAB}f(n),KAB用f(n)加密:
A→B:{KAB}f(n)
步骤21、普通节点B收到密钥消息后,通过计算f(n)解密出会话密钥。
可选的,在步骤17后还包括:
步骤22、Hy在使用NS+ARO消息向Rn进行地址注册时,使用两者之间的对密钥KI生成消息验证码MAC:
Hy→Rn:NS,ARO,MAC
步骤23、Rn收到注册消息后,使用对密钥和MAC对消息进行认证;
如果认证不成功,则地址注册失败,Rn不会为Hy建立任何缓存项信息,从而当Hy向网络中发送数据包时丢弃数据包、不进行转发;
如果成功,Rn会为Hy建立缓存项信息,从而当Hy向网络中发送的数据包时由Rn进行转发。
可选的,步骤2进一步包括:
步骤2A、如果Rank(u)<k,计算f(Rank(u)+i),直到Rank(u)+i=k;
步骤2B、如果Rank(u)>k,则Ru通过消息把k值发送给自己的父节点Re让其计算Hash值,所述消息包括k和Rx的接口标识IIx:
Ru→Re:k+IIx;
步骤2C、父节点Re计算完成后回应消息给Ru,该消息经过两者之间的对密钥Kup加密:
Re→Ru:{IIx||f(k)||salt(k+1)}Kup;
步骤2D、如果Rank(u)=k,则f(k)=f(Rank(u))。
根据本发明的另一个方面,提供一种6LoWPAN中基于多次Hash的密钥建立方法,包括:
步骤1、普通节点Hy发送消息,包括RS、k和{f(k+Δ1)||KI}f(k):
Hy→*:RS+k+{f(k+Δ1)||KI}f(k)
其中,k为Hy的Rank值,也表示为Rank(Hy),KI为初始密钥,||表示串接,{f(k+Δ1)||KI}f(k)表示根据AES加密算法用f(k)加密f(k+Δ1)和KI串接后的数据;并且,
f(k)=F(f(k-1)||salt(k)),
其中,k>1,salt(k)表示进行第k次Hash计算所用的加盐值,F(f(k-1)||salt(k))表示对f(k-1)||salt(k)进行Hash函数值计算;
步骤2、邻居路由器Rn收到消息后,计算f(k)和f(k+Δ1);
步骤3、Rn使用f(k)解密{f(k+Δ1)||KI}f(k)信息,然后把解密出的f(k+Δ1)与自己计算的值进行比较,如果相等,则Rn对Hy认证通过,否则认证不通过;
步骤4、认证通过后,Rn把KI作为两者之间的对密钥进行保存,然后回应路由通告消息,使用KI对关键信息进行加密:
Rn→Hy:RA+{Rank(n)||f(Rank(n))||salt(Rank(n)+1)||KG||IIn}KI;
步骤5、Hy收到消息后,把Rn作为默认路由器;通过KI解密消息,得到IIn,然后和数据包中的接口标识进行对比实现对Rn的认证;保存组密钥KG,在Rank(n)上增加一个数值计算Rank(y),然后在f(Rank(n))和salt(Rank(n)+1)的基础上计算出f(Rank(y))和salt(Rank(y)+1);KI作为与Rn之间的对密钥进行保存。
可选的,在步骤5后还包括:
步骤6、普通节点A选择随机整数m,使得m>Rank(A),然后向普通节点B发送HELLO消息和m值;
A→B:HELLO+m
步骤7、普通节点B收到HELLO消息后,判断m和Rank(B)的大小;
如果m≥Rank(B),则普通节点B生成两者的会话密钥KAB,然后向普通节点A发送密钥消息,内容为{KAB}f(m),KAB用f(m)加密:
B→A:{KAB}f(m)
如果m<Rank(B),则普通节点B选择随机整数n使得m<n(例如差值小于10不要太大),然后向普通节点A发送HELLO消息和值n:
B→A:HELLO+n
步骤8、普通节点A接收到消息后,如果是密钥消息,通过计算f(m)解密出会话密钥KAB;如果是HELLO消息,则生成两者的会话密钥KAB,然后向B发送密钥消息,内容为{KAB}f(n),KAB用f(n)加密:
A→B:{KAB}f(n)
步骤9、B收到密钥消息后,通过计算f(n)解密出会话密钥。
可选的,在步骤5后还包括:
步骤10、Hy在使用NS+ARO消息向Rn进行地址注册时,使用两者之间的对密钥KI生成消息验证码MAC:
Hy→Rn:NS,ARO,MAC
步骤11、Rn收到注册消息后,使用对密钥和MAC对消息进行认证;
如果认证不成功,则地址注册失败,Rn不会为Hy建立任何缓存项信息,从而当Hy向网络中发送数据包时丢弃数据包、不进行转发;
如果成功,Rn会为Hy建立缓存项信息,从而当Hy向网络中发送的数据包时由Rn进行转发。
与现有技术相比,本发明的优点在于:
(1)多次Hash的密钥建立方法计算量小;
(2)利用Hash函数计算的不可逆性,并且通过迭代的方式计算多次Hash值,保证了Hash函数计算的安全强度;
(3)内部路由器和普通节点在入网时都进行了双向认证,可以抵御恶意节点的攻击。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本文中,Hash对应的中文术语为“散列”,是指把任意长度的输入通过散列算法变换成固定长度的输出。
6LoWPAN网络如图1所示,整个网络包含一个边缘路由器,若干(≥0)内部路由器和若干(≥1)普通节点,边缘路由器、内部路由器和普通节点统称为节点,普通节点为计算终端;路由器通过RPL路由协议构造成以边缘路由器为根节点的有向无环图(DAG),普通节点通过邻居协议选择一个默认路由器连接到网络中。其中,顶端的是边缘路由器,灰圈表示内部路由器,白圈表示普通节点,实线表示DAG中通过认证后建立起的父子连接,虚线表示待认证建立的连接。
其中,组密钥用于网络中所有节点间多播地址消息安全通信;对密钥在路由结构有向无环图中具有父子关系节点之间建立,用于安全传送路由信息以及普通节点和路由器之间的通信认证,对密钥可以只用于单跳安全通信;会话密钥用于任意两个普通节点之间进行安全通信,数据可以通过单跳或者多跳转发。一般情况下,节点间发送组播消息时用组密钥加密,路由器之间发送消息时使用对密钥,而普通节点之间通信使用会话密钥。
发明人经过研究发现,在6LoWPAN网络中的RPL路由协议和邻居协议的通信机制基础上,可以基于多次Hash计算建立组密钥、对密钥和会话密钥。
基于上述分析,本发明一个实施例中,提供一种6LoWPAN中基于多次Hash的密钥建立方法。如图2所示,该方法包括:
S11、节点初始化;
S12、内部路由器加入网络并获得组密钥;
S13、内部路由器与父节点建立对密钥;
S14、普通节点加入网络;和
S15、普通节点之间建立会话密钥。
上述步骤中,如果网络中只包含边缘路由器和普通节点,则普通节点直接和边缘路由器建立连接,步骤S12和S13可以省略;如果还包括路由器节点,则需要在进行完S12和S13之后,再进行S14和S15步骤。下面将详细描述每一个步骤的内容。
步骤S11(节点初始化)
对于路由器节点和普通节点,根据每个节点的大概部署位置,估算一个Rank值k;k值可以根据节点部署在树状结构的层次深度计算,每个节点估算的k可以都不相同,k可以不连续,如值为9,15等。
随机生成一个初始密钥KI,然后计算f(k+Δ1),将f(k+Δ1)和KI串接,两者串接后根据AES算法用f(k)加密(后续加密如无说明也采用AES算法),生成加密后的数据:
{f(k+Δ1)||KI}f(k)
其中,Δ1为常量整数,且Δ1>1,||表示串接,{f(k+Δ1)||KI}f(k)表示用f(k)加密{f(k+Δ1)||KI};f(k)为k次Hash计算的值,计算方式为:
f(k)=F(f(k-1)||salt(k))(1)
其中,k>1,salt(k)表示进行第k次Hash计算所用的加盐值,F(f(k-1)||salt(k))表示对f(k-1)||salt(k)进行Hash函数值计算,Hash函数可以采用MD5或SHA-1算法。
公式(1)的含义为在第k-1次Hash计算值f(k-1)的基础上通过一次F(x)函数计算,就可以得到f(k)。公式(1)是一个迭代公式,先计算出先前的Hash值才能够计算出后续的值。在公式中引入参数salt(k),可以增强安全性,防止攻击者只知道f(k-1)后就计算出第k次及后续所有的Hash值。对于salt(k)的选择,可以选择一个固定的值,每次计算都使用该值。但这种方式安全性不是最高,如果攻击者获得了这个固定的值,仍可以计算后续的Hash值。
根据本发明的一个实施例,salt(k)的值采用动态变化的值,为
表示取f(k-2)中的第8和9两个字节,这样实际的计算公式为如下:
动态变化的salt(k)值不限定于上述方式产生的值,其它方式比如选取f(k-2)或f(k-3)的第1和第4个字节亦可。
在实际计算时,对于f(1),随机选择一个长字节数据串(例如长度至少16字节),用Hash函数计算值,对于f(2)的计算,salt(2)取0值,即f(2)=F(f(1)||00),对于后续的f(k),采用公式(1)或(2)计算即可。
根据本发明的一个实施例,S11可以包括如下步骤:
S111、随机生成一个长字节数据串作为Hash函数计算的初始数据,并确定常量整数Δ1的值(例如选择大于1且小于10的数);
S112、随机生成一个组密钥K
G(例如长度为16字节),为边缘路由器设定Rank值为Rank(E)(例如,至少是大于2的整数),按照上述公式(1)计算出f(Rank(E))和salt(Rank(E)+1)的值例如
并且将K
G、f(Rank(E))和
写入到边缘路由器中;
S113、根据内部路由器和普通节点部署在树状结构的层次深度,估算一个Rank值k,按照上述公式(1)计算出f(k)和f(k+Δ1);
S114、随机生成一个初始密钥KI(例如长度为16字节),然后根据AES加密算法用f(k)加密f(k+Δ1)和KI串接后的数据,生成加密后的数据{f(k+Δ1)||KI}f(k),并且将k、KI和{f(k+Δ1)||KI}f(k)写入到内部路由器和普通节点中。
步骤S12(内部路由器加入网络并获得组密钥)
一般情况下,从边缘路由器开始,每个路由器节点逐层加入到网络。每个已经入网的路由器定时的发送用组密钥加密和认证的多播地址DIO消息,新入网节点通过DIO消息选择父节点入网。初始状态时因为没有任何节点加入网络,新入网节点就选择边缘路由器作为父节点。边缘路由器对与它一跳远的节点入网认证过程与下面说明的一般情况是相同的。下面以节点Rx来说明。
已入网路由器Ru和Rv(见图1)定时发送DIO消息,两者拥有的相关信息分别为:(Rank(u)、f(Rank(u))、
和(Rank(v)、f(Rank(v))、
步骤S12的通信过程如图3所示,具体包括如下步骤:
S121、路由器节点Rx接收到第一个来自Ru的DIO消息后,由于没有组密钥,不能解密得到DIO消息中的具体信息,所以,Rx向Ru发送Request_Group_Key消息(包括k和{f(k+Δ1)||KI}f(k)),请求得到组密钥:
Rx→Ru:k+{f(k+Δ1)||KI}f(k)
S122、Ru收到消息后,根据消息中的k值和自己的Rank(u)值计算出f(k)。具体计算过程如下:
(1)如果Rank(u)<k,计算f(Rank(u)+i),直到Rank(u)+i=k;
(2)如果Rank(u)>k,则Ru通过Request_K_Hash消息把k值发送给自己的父节点Re让其计算Hash值,所述消息包括k和Rx的接口标识IIx:
Ru→Re:k+IIx
父节点Re收到消息后,也根据此计算过程计算第k次Hash值f(k)。计算完成后回应Response_K_Hash消息给Ru,发送的消息经过两者之间的对密钥Kup(该对密钥已经在Ru加入网络时,在Ru与其父节点Re之间建立完成)加密:
Re→Ru:{IIx||f(k)||salt(k+1)}Kup
其中,salt(k+1)表示进行第k+1次Hash计算所用的salt值,例如值为
(3)如果Rank(u)=k,则f(k)=f(Rank(u))。
经过上述计算过程,Ru得到f(k)和f(k+Δ1)值。
接着使用f(k)解密{f(k+Δ1)||KI}f(k)信息,然后把解密出的f(k+Δ1)与自己计算的值进行比较,如果相等,则Ru对Rx认证通过,否则认证不通过。这里进行相等判断主要是为了防止恶意节点进入到网络中。恶意节点不是用户部署的节点,而是攻击者部署到网络中的节点,便于攻击网络。攻击者由于不知道f(k+Δ1)的计算值,所以在这种情况下会出现f(k+Δ1)不等的情况。
如果认证通过,则Ru把KI作为与Rx之间的对密钥进行保存,并且向Rx回应Response_Group_Key消息:
Ru→Rx:{KG||f(Rank(u))||salt(Rank(u)+1)||Rank(u)||IIu}KI
其中,salt(Rank(u)+1)表示进行第Rank(u)+1次Hash计算所用的salt值,例如可以为
Response_Group_Key消息为:
S123、Rx收到回应消息后,通过K
I解密整个消息,得到IIu,然后和数据包源地址中的接口标识进行对比实现对Ru的认证。认证通过后,Rx得到组密钥K
G,并把Ru暂时作为自己的父节点存储两者之间的对密钥K
I,Rx得到的其它信息包括Rank(u)、f(Rank(u))和
S124、Rx等待接收新的DIO消息,以选择更优的父节点。
步骤S13(路由器与父节点建立对密钥)
Rx得到组密钥后,对邻居节点后续发送的用组密钥加密的DIO消息,能够进行处理,并且选择更优的父节点。父节点选定后,通过消息与其建立对密钥。
步骤S13整个通信过程如图4所示,具体包括如下步骤:
S131、Rx收到由Ru和Rv发出的新的DIO消息后,用组密钥解密该消息,根据DIO中的Rank值重新选择父节点(选择方法根据RPL路由协议)。
如果选择的父节点仍然是Ru,则Rx先依据Ru的Rank(u)值,按照RPL协议中的计算方法得到Rank(x),而且由于父子关系有Rank(u)<Rank(x),然后根据先前保存的f(Rank(u))和利用公式(2)计算出f(Rank(x))和
如果选择的父节点是Rv,则使用多播地址发送对密钥建立消息Request_Pairwise_Key,消息中包含的信息为IIv+Rank(x),IIv指明要建立对密钥的父节点接口标识,Rank(x)指明用于响应消息加密的密钥f(Rank(x)),多播消息使用组密钥生成消息验证码MAC,并用组密钥进行加密:
Rx→*:MAC+{IIv||Rank(x)}KG
S132、邻居节点收到对密钥建立消息后,根据组密钥对消息验证码MAC进行验证,验证通过后解密该消息,然后根据IIv的值判断是否是和自己建立对密钥。
对于Ru来说,不是和自己建立对密钥,删除先前已经与Rx建立的对密钥。
对于Rv来说,与自己建立对密钥,随机生成对密钥KP,然后回应Response_Pairwise_Key消息,用f(Rank(x))进行加密:
S133、Rx收到响应消息后,通过f(Rank(x))解密出其中的信息,把Rv作为自己的父节点,保存两者之间的对密钥K
P。最后Rx根据f(Rank(v))利用公式(2)重新计算自己拥有f(Rank(x))和
S134、Rx继续接收其它节点发送的DIO消息,如果发现比Rv更优(计算方法由RPL路由协议规定),则把它作为新的父节点通过上述过程与其建立对密钥;如果不比Rv更优,则仍然保留Rv作为自己的父节点。
步骤S14(普通节点加入网络)
普通节点加入网络使用6LoWPAN邻居协议,节点通过发送RS(路由请求)消息来查找默认路由器,通过发送消息进行双向认证后加入到网络中,图5显示了其通信过程。在6LoWPAN网络中,普通节点本身不计算Rank值,但可以在默认路由器的Rank值上增加一个常值作为普通节点的Rank值,具体计算方法如下,[IIN]8表示取普通节点N的接口标识的最后一个字节:
Rank(N)=Rank(R)+[IIN]8mod 128
其中,N表示普通节点,R表示默认路由器,Rank()表示上述节点拥有的Rank值。
步骤S14整个通信过程如图5所示,具体包括如下步骤:
S141、普通节点Hy启动后发送消息(包括RS、k和{f(k+Δ1)||KI}f(k)):
Hy→*:RS+k+{f(k+Δ1)||KI}f(k)
S142、邻居路由器Rn收到消息后,根据S122中的计算过程得到f(k)和f(k+Δ1),然后对Hy认证,方法和对路由器的认证一样。认证通过后,Rn把KI作为两者之间的对密钥进行保存,然后回应RA(路由通告)消息,使用了KI对关键信息进行加密:
S143、Hy收到消息后,把Rn作为默认路由器。通过K
I解密消息,得到IIn,然后和数据包中的接口标识进行对比实现对Rn的认证。认证通过后,Hy使用公式(2)计算出Rank(y)值,然后在f(Rank(n))和
的基础上计算出自己的f(Rank(y)),保存组密钥K
G,K
I作为与Rn之间的对密钥进行保存。
S144、Hy在使用NS+ARO(邻居请求+地址注册选项)消息向Rn进行地址注册时,使用两者之间的对密钥KI生成消息验证码(MAC):
Hy→Rn:NS,ARO,MAC
S145、Rn收到注册消息后,使用对密钥和MAC对消息进行认证。
如果认证不成功,则地址注册失败,Rn不会为Hy建立任何缓存项信息。当Hy向网络中发送数据包时,如果Rn中没有Hy的缓存项信息,则丢弃数据包,不进行转发。通过这种方式可以防止攻击者向网络中发送大量无用信息,以消耗节点的资源。
如果成功,Rn会为Hy建立缓存项信息,这样Hy向网络中发送的数据包时,Rn才会进行转发。
步骤S15(普通节点之间建立会话密钥)
例如,普通节点A和B之间要建立会话密钥,通过两个节点的直接通信来完成。A和B在入网后拥有的信息分别为:(Rank(A),f(Rank(A)),
和(Rank(B),f(Rank(B)),
步骤S15的工作是在A和B之间协商出一个都能计算出的f(k)值,从而用f(k)加密以保证会话密钥的安全。如图6所示,步骤S15具体包括:
S151、A选择随机整数m,使得m>Rank(A)(例如差值小于10,差值越大计算量越大),然后向B发送HELLO消息和m值:
A→B:HELLO+m
S152、B收到HELLO消息后,判断m和Rank(B)的大小。
如果m≥Rank(B),则B生成两者的会话密钥KAB,然后向A发送密钥消息,内容为{KAB}f(m),KAB用f(m)加密:
B→A:{KAB}f(m)
如果m<Rank(B),则B选择随机整数n使得m<n(例如差值小于10不要太大),然后向A发送HELLO消息和值n:
B→A:HELLO+n
S153、A收到消息后,如果是密钥消息,通过计算f(m)解密出会话密钥。如果是HELLO消息,则生成两者的会话密钥KAB,然后向B发送密钥消息,内容为{KAB}f(n),KAB用f(n)加密:
A→B:{KAB}f(n)
S154、B收到密钥消息后,通过计算f(n)解密出会话密钥。
上述建立密钥的方法使用Hash算法,计算量小,节点入网时进行双向认证不需要第三方认证中心的参与,通信量少,而且可抵御恶意节点攻击。各种密钥直接是两点之间安全通信进行建立,不需要第三方节点进行密钥分发,多种密钥的建立保证了不同类型通信的安全。基于上述特点,该方法能够适用于6LoWPAN这种节点资源受限的环境,而且还能满足6LoWPAN网络的移动特性。上述建立密钥的方法可以用于6LoWPAN中多播地址消息安全通信,单跳和多跳的安全通信。
上述方法的优点在于:(1)利用了Hash函数计算的不可逆性,并且通过迭代的方式计算多次Hash值,保证了Hash函数计算的安全强度;每个节点的Hash计算次数都不同,根据其Rank值动态确定的,即进行Rank次Hash计算;(2)路由器和普通节点在入网时都进行了双向认证,可以抵御恶意节点的攻击;(3)各个路由器之间建立起对密钥后,路由信息就可以在网络中安全的传送,保证了网络的路由安全;路由器和普通节点在进行组播通信时,通过组密钥可以实现对组播消息的加密和认证;两个普通节点要进行通信时,通过会话密钥来保障信息的安全;(4)普通节点要向网络中发送消息时,默认路由器使用两者之间的对密钥认证后,才会把数据包转发出去,这样就可以防止攻击者向网络发送大量无用的信息;(5)此外,该方法还适用于节点移动的场景。
应该注意到并理解,在不脱离后附的权利要求所要求的本发明的精神和范围的情况下,能够对上述详细描述的本发明做出各种修改和改进。因此,要求保护的技术方案的范围不受所给出的任何特定示范教导的限制。