欧志球,王铮
(浙江机电职业技术学院计算机工程学院,杭州310053)
随着物联网的发展,安全高效的物联网网络设备管理成为研究热点[1][11][14],当前研究协议包括简单网管协议(Simple Network Management Protocol,SNMP)、用户终端广域网管理协议TR069(Technical Report)和私有管理协议等[14]。文献[11]提出一种基于SM4密码算法的私有管理协议,可针对智能家居网络的恶意攻击、及时发现入侵并报警;文献[14]提出一种基于TR069协议的无线传感器网络网关管理方案。与另外两种协议相比,SNMP协议作为事实上的计算机网络管理协议标准,得到众多厂家的支持和广泛的应用[11],开始广泛应用于物联网的节点[1-2]。但SNMP的V1和V2C安全性考虑不多,引入安全模式的SNMPv3也存在安全隐患[8]。因此,实现基于SNMPv3的安全高效密钥生成、交换与管理具有极强的现实意义和应用价值。
目前国内针对SNMPv3在物联网领域的安全研究不多,文献[8-9]提出了一些启发式的密钥交换算法,但缺乏形式化的安全证明以及密钥更新处理;安全研究主要来自SNMP项目组,其在最新的RFC5590中扩充定义了三种安全模型的解决方案:基于原有RFC3414的用户安全模型(User-based Security Model,USM)模型[2];基于传输层安全的 TSM(Transport Security Model)模型[3-6];基于原有USM模型,但引入其他安全协议增强其安全性。目前USM在SNMPv3中得到广泛应用,但该模型中密钥生成与更新算法存在安全漏洞,同时没有定义如何进行安全的密钥交换。本文首先简要说明SNMPv3的体系结构和安全机制,并分析USM密钥生成算法的在无线网络管理中的漏洞,提出安全的密钥交换方法并予以证明,最后提出相应的方案设计和实现。
SNMPv3的体系结构如图1所示,它的安全性主要由USM和视图访问控制模型(View Access Control Model,VACM)提供[3],包括:
(1)密钥产生、交换与更新。定义了密钥的产生、本地化和更新的机制;
(2)认证。认证包括数据完整性和数据源认证。USM认证通过哈希消息验证代码(Hash Message Au-thentication Codes,HMAC)算法实现,标准推荐使用MD5或SHA算法;
(3)加解密。对消息的内容进行加密,避免泄漏。标准推荐使用DES算法;
(4)访问控制。SNMPv3通过VACM实现对于具体用户基于组(视图)的访问权限控制;
(5)实体间时间同步以及消息合时性检查。标准通过消息头中的engineBoot和engineTime实现实体间的时间同步与消息的合时性检查,从而防止消息重发、复制和延迟。
图1 SNMPv3的体系结构
密钥安全交换与管理SNMPv3协议的核心,包括密钥生成、交换和更新等部分。
SNMPv3推荐的密钥生成算法如图2所示[3]。
图2 标准定义的密钥生成算法
该算法存在以下问题:
(1)USM密钥来源于engineID和用户口令。其中engineID在链路上采用明文传输,而用户口令一般都比较简单,容易被猜解,因此密钥安全性存在漏洞;
(2)巨大的网络规模,不同的设备如果都采用不同的口令,则口令的维护十分繁杂;这使得用户倾向于使用同一个口令应用于所有网络节点,因此如果一个设备被破解,会波及到其他设备;
(3)算法没有定义如何进行安全的口令或密钥交换。
密钥交换常用的算法是迪菲-赫尔曼密钥交换算法(Diffie-Hellman,DH)算法,可以解决上面提到问题,但DH算法无法抵御中间人攻击,因此引入形式化的安全模型CK01,在该模型下有如下定义和定理[10]:
定义1:认证链路模型(AM)下会话密钥(SK)安全。如果对于允许询问TestSession查询的AM敌手A(不允许SessionExpiration查询),协议P能满足以下条件则称其在AM下SK安全的密钥协商协议:
(1)如果两个未被攻陷的参与者完成了匹配会话,则它们输出相同的会话密钥;
(2)A区分P产生的会话密钥和随机数的概率不超过0.5+ε,其中ε为一个与安全参数k有关的可忽略函数。
定理1:如果判定性Diffie-Hellman(DDH)假设是困难的,则DH协议在AM中是会话密钥安全的。
定理2:设P在AM中是SK安全密钥交换协议,λ是一个消息传输认证器,则P'=Cλ(P)在非认证链路模型(UM)中是SK安全密钥交换协议。
其中UM是非认证链路模型,即真实的网络模型;AM是认证链路模型。
推论:如果DDH假设是困难的,通过采用基于公钥基础设施(Public Key Infrastructure,PKI)的证书管理机构(Certificate Authority,CA)认证方式,可以使用DH协议实现SNMPv3在UM中的会话密钥安全交换。
证明:根据定理1,因为DDH是困难的,所以P=DH在AM中是会话密钥安全的;
设λ为基于PKI的CA认证方式消息传输认证器,则根据定理2,P'=Cλ(P)在UM中是SK安全的密钥交换协议;
因此,可使用DH协议实现SNMPv3在UM中的会话密钥安全交换。
根据推论以及文献[10]的SIG-DH密钥交换协议,设p,q为大素数,q|p-1,g为阶是素数q的数域G的一个生成元,代理实体A和管理实体M共享g和p,s是会话标识。A和M各有一个用于签名的证书CertA和CertB,Sig为签名算法。流程如下:
(1)A发送申请密钥消息(A,s,req,Sigi(A,s,req,M))给M;
(2)M收到消息(A,s,req,Sigi(A,s,req,M))后,验证签名以及包含签名信息的消息的正确性,如果验证通过,则任意选择 xM∈,并发送消息(M,s,ym=gxM,Sigj(M,s,ym,A))给 A;
(3)A收到消息(M,s,ym=gxM,Sigj(M,s,ym,A))后,验证签名以及包含签名信息的消息,如果验证通过,任意选择xA∈,发送消息(A,s,yA=gxA,Sigk(A,s,ym,yA,M))给M,计算会话标识s的会话密钥K=K=gxAxM,移除 x;
AMA
(4)M收到消息(A,s,yA=gxA,Sigk(A,s,ym,yA,M))后,验证签名以及包含签名信息的消息,如果验证通过,计算会话标识s的会话密钥K=KMA=gxMxA,移除xM。
综上所述,新的密钥生成与交换算法与其他算法安全性能比较如表1所示。
表1 密钥交换生成算法安全性能比较
图3 标准定义的密钥更新算法
SNMPv3推荐的密钥更新算法如图3所示[3]:该算法通过差量方式计算并更新新的Key,但如果原有Key已经泄露,则新的Key将也被泄露。
根据2.2的证明,可采用同样基于PKI的CA认证方式,使用DH实现密钥的在UM中安全更新。流程如下:
(1)M发送更新密钥消息(M,s,req,Sigi(M,s,req,A))给A;
(2)A收到消息(M,s,req,Sigj(M,s,req,A))后,验证签名以及包含签名信息的消息,如果验证通过,发送申请密钥消息(A,s,req,Sigi(A,s,req,M))给M;
(3)后续流程与密钥生成与交换算法流程(2)~(4)相同。
综上所述,新的密钥生成与交换算法与其他算法安全性能比较如表2所示。
表2 密钥更新算法安全性能比较
图4为算法实验与验证环境,管理实体安装和使用Apache 2.2 Web服务器、Tomcat7.0 Java Web容器,SNMP4J1.8和JDK1.6运行环境;代理实体应安装和使用SNMP-Agent2.0和JDK1.6运行环境,如图4所示:
图4 算法运行环境
该算法的实现包括:证书生成与部署、会话密钥生成与交换、密钥更新以及密钥使用。核心的密钥生成与交换实现如图5所示,密钥更新算法类似。核心伪代码如下:
//生成yM
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("DH");
keyGen.initialize(dhParamSpec);
privKeyPair=keyGen.generateKeyPair();
privAgreement=KeyAgreement.getInstance("DH");
privAgreement.init(privKeyPair.getPrivate());
byte[]pubPrivKeyEnc=privKeyPair.getPublic().getEncoded(); //生成 xA和yA
DHParameterSpecdhParamSpec= ((DHPublicKey)mgrPubKey).getParams();
KeyPairGenerator agtKpairGen= KeyPairGenerator.getInstance("DH");
agtKpairGen.initialize(dhParamSpec);
KeyPair agtKpair=agtKpairGen.generateKeyPair();
KeyAgreement agtKeyAgree=KeyAgreement.getInstance("DH");
agtKeyAgree.init(agtKpair.getPrivate());
agtKeyBuf=agtKpair.getPublic().getEncoded();
agtKeyAgree.doPhase(mgrPubKey,true);
agtPrivKey=agtKeyAgree.generateSecret(PRIV_ALGORITHM);
//生成管理端Key
X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(agtKeyBuf);
PublicKey agtPubKey = mgtKeyFac.generatePublic(x509KeySpec);
privAgreement.doPhase(agtPubKey,true);
mgtPrivKey=privAgreement.generateSecret(algorithm);
管理者与代理两端使用OpenSSL生成认证证书,在密钥交换或更新完成后,在SNMP4J中,可以通过USM.addLocalizedUser()方法设置本地化的Key。
图6为测试系统在密钥交换过程中的数据包情况,从91~97完成会话协商,第98个包开始密钥申请请求,到第107个包完成密钥的交换。
表3为该算法在各个阶段的时间开销统计,在测试局域网中,实际网络传输时间在毫秒内,因此表中后面两项可以视为DH算法实质计算所需时间。从表中数据分析,新的算法相比纯粹的DH算法增加了~22%的时间开销。考虑到密钥的生成、交换与更新实质不是频繁操作,该性能开销可以接受。而且在实际工作环境中,该部分开销还可以通过拓展带宽与提升机器硬件减少。
图5 密钥生成与交换实现
图6 实际系统运行结果
表3 算法时间开销(单位ms)
对于大规模的物联网无线网络,基于USM模型的SNMPv3标准安全性不能很好地满足其安全性和易部署维护的要求,尤其是密钥交换过程更为关键,采用CK01安全模型可以设计可信的密钥交换协议解决上述问题。另外,新的SNMPv3协议引入了TSM安全模型,也可以从传输层控制的角度进一步增强SNMPv3 协议的安全性。