田晨光,容晓峰,杜志强
(西安工业大学 计算机科学与工程学院,西安 710021)
随着网络技术的发展,信息在网络上传输的安全问题成为了每个用户关注的焦点。为了保证信息在网络上的安全传输,安全套接字层(Secure Sockets Layer,SSL)协议在网络传输过程中得到了普遍的应用[1]。SSL协议在客户端与万维网(World Wide Web,WWW)服务器之间建立了安全可信的端到端数据通道,保证了应用层信息传输的安全可信[2]。
提供SSL安全传输功能的Web服务器和客户端建立会话分为两个步骤:会话密钥协商和会话过程,其中会话密钥协商是SSL协议的前提。在会话密钥协商中服务器向客户端提供加密证书和签名证书,客户端利用加密证书中的公钥对生成的会话密钥进行加密,将加密后的密文发送给服务器,并使用签名证书中的公钥验证服务器身份是否合法,以此保证会话密钥在网络传输过程中的保密性和完整性。所以保护会话密钥的服务器加解密密钥对和服务器证书签名密钥对提前初始化安装部署到服务器中,是SSL会话密钥协商、安全通信建立的前提基础。
在实际工程中,加解密密钥对和签名密钥对要在服务器上初始化安装部署,分别用来向证书颁发机构(Certificate Authority,CA)申请加解密证书和签名证书。这些密钥对可以通过服务器本地的密码卡产生,还可通过外部的密钥分发中心(Key Distribution Center,KDC)产生利用网络送入到服务器。GM/T0018-2012《密码设备应用接口规范》标准[3](简称为“标准”)支持密钥对在服务器本地密码卡产生的方式,然而由于标准中在产生RSA/ECC密钥对并输出的函数原型以及参数的描述中,最终密钥对是以明文形式输出的,所以“标准”不能保证密钥对由外部送入的安全性[4]。
目前,密钥由外部设备送入分为网外分配方式(由信使携带密钥分配给各个用户)和网内分配方式(由网络传输自动分配密钥)[5]。网外分配方式一般不适用于大型网络的密钥管理。网内分配方式主要分为:公开密钥的分配和秘密密钥的分配。公开密钥(RSA算法、椭圆曲线密码算法等)一般通过专门的密钥分配中心KDC分配获得[6]。对称密码体制中,密钥分配通常使用密钥交换技术,如Diffie-Hellman算法,或者以RSA算法、椭圆曲线密码算法等改进的Diffie-Hellman算法。然而在Diffie-Hellman算法中没有提供双方身份的任何信息并且是计算密集性的,因此容易遭受中间人的攻击以及阻塞性攻击[7],即敌手请求大量的密钥,受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作,并且该算法没办法防止重演攻击。于是Chaeikar[8]提出了一种新的解释性密钥管理方案(IKM),即基于在节点中创建密钥的新的对称密钥管理方案。该方案通过使用周期短、消除密钥分发和撤销步骤的新密钥来减少密钥在生成、分发和撤销方案的问题。但该方案有一定的局限性,它比较适合于在特定时间段通信的情况。Boloorchi[9]等提出了一种安全在线密钥分发的对称密钥管理方案。方案中为每个消息生成对称密钥,并且为了提供进一步的安全性,使用阈值密钥共享技术来分割密钥。该方案主要提高了对称密钥管理的安全性,但是不适用于密钥对的分发。
现有的密钥分配方案都是基于KDC解决通信双方如何获得对方公开密钥的问题并且已经很成熟,但是这些方案在采用“标准”中的相关接口实现上并不适用于SSL服务器密钥环境初始化时所需的密钥对是由外部的KDC产生送入的场景。文中主要在“标准”的基础上,设计了密钥对导入/导出协议,结合所设计的协议,定义了密钥对外送产生、传输的密码设备API接口,使得“标准”支持密钥对由外部送入服务器的方式。并使用BAN逻辑对协议进行了安全性分析,证明了所设计API扩展接口的安全性。
在设计密钥对导入/导出协议时,首先设计了服务器与KDC握手的过程,该过程主要协商会话密钥;然后设计了会话过程,该过程实现密钥对的安全传输,即密钥对导入/导出协议。协议的整个过程如图1所示。
图1 服务器和KDC通信过程Fig.1 Communication process between the server and KDC
SSL服务器通过网络向KDC发送利用KDC公钥加密的握手信息及会话密钥;当KDC收到消息时会对SSL服务器的身份进行验证,验证通过后,KDC向服务器发送利用会话密钥加密的时间戳。此时SSL服务器与KDC间的握手过程结束。
这时,SSL服务器与KDC之间进行会话:SSL服务器利用会话密钥向KDC发送生成密钥对的请求;KDC生成请求中相关的密钥对,利用会话密钥向SSL返回密钥对以及签名信息。
SSL服务器对收到的密钥对进行验证,验证通过将密钥对存入本地。
1) 符号定义
见表1。
表1 符号定义Tab.1 Symbol definition
2) 服务器和KDC之间的握手协议
在握手协议之前,服务器端必须在KDC上注册用户信息,这样,KDC本地就保存了服务器端的信息。服务器(A)和KDC(B)握手过程,如图2所示。
图2 服务器与KDC的握手过程Fig.2 Process of shaking hands between the server and KDC
①A调用本地密码卡产生随机会话密钥Kab,A从数据库中得到B的公开密钥;A用B的公开密钥加密Mab(包含A的身份、口令、以及指定对称加密算法标识uiAlgID)与Ta、Kab:{Mab,Ta,Kab}Kb;密码卡将{Mab,Ta,Kab}Kb密文输出。
②A将加密的消息发送给B:{Mab,Ta,Kab}Kb;
③B调用本地密码卡用Kb-1将A发送的密文解密得到Mab,Kab和时间戳Ta;B在本地的数据库中进行匹配,以验证A的身份是否合法;
④ 验证A的身份合法之后,B调用本地密码卡用Kab对时间标记递增1的消息进行加密输出:{Ta+1}Kab。
⑤B将加密后的密文{Ta+1}Kab发送给A。
⑥A调用本地密码卡对密文{Ta+1}Kab解密,得到Ta+1来验证B的身份。
经过以上6个步骤,服务器和KDC之间拥有了会话密钥Kab。
3) 密钥对导入/导出协议
RSA密钥对的生成与导出导入过程,如图3所示。
图3 服务器外部RSA密钥对的生成导入导出过程Fig.3 Process of generating and exporting RSA key pairs outside the server
①A调用本地密码卡用会话密钥Kab加密Mab输出:{Mab}Kab,Mab为生成RSA密钥对并导出的请求(包括密钥对的类型,密钥对的模长)以及时间戳Ta。
②A向B发送消息:A将密文{Mab}Kab发送给B。
③B调用本地密码卡,对收到的密文利用Kab进行解密得到Mab,根据服务器的请求产生RSA/ECC密钥对。
④B调用本地密码卡,使用Kab对生成的RSA密钥对以及时间标记递增1的消息进行加密:{Ka,Ka-1,Ta+1}Kab,并用Kb-1对密文{Ka,Ka-1,Ta+1}Kab以及Ta+1进行签名:{{Ka,Ka-1,Ta+1}Kab,Ta+1}Kb-1;将{Ka,Ka-1,Ta+1}Kab,{{Ka,Ka-1,Ta+1}Kab,Ta+1}Kb-1一并输出。
⑤B向A返回消息:B将RSA密钥对的密文和对该密文的签名{Ka,Ka-1,Ta+1}Kab,{{Ka,Ka-1,Ta+1}Kab,Ta+1}Kb-1返回给A。
⑥A调用本地密码卡对B的签名{{Ka,Ka-1,Ta+1}Kab,Ta+1}Kb-1进行验证,验证通过后使用本地会话密钥Kab对密文{Ka,Ka-1,Ta+1}Kab进行解密得到RSA/ECC密钥对,将RSA/ECC密钥对导入到密码卡存储区内,并返回密钥对的存储信息给A。
1.2.1 内部私钥RSA运算与对称加密输出
在服务器与KDC握手过程中的第三四步中,KDC调用内部私钥进行RSA运算,得到会话密钥,并利用会话密钥进行对称加密运算。接口规范中的6.4.3内部私钥RSA运算不能满足该协议需求,所以对该接口进行如下扩展:
内部私钥RSA运算并对称加密输出:
原型:int SDF_InternalPrivateKeyOperationEncrypt_RSA(
void *hSessionHandle,
unsigned int uiKeyIndex,
unsigned char *pucDataInput,
unsigned int uiInputLength,
unsigned char *pucIV,
unsigned char *pucEncData,
unsigned int *puiEncDataLength
void ** phKeyHandle);
描述:使用内部指定索引的私钥对数据进行运算,并用会话密钥进行对称运算输出,同时返回密钥句柄。
参数:
hSessionHandle[in]:与设备建立的会话句柄
uiKeyIndex[in]:密码设备内部存储私钥的索引值,对应于加密时的公钥
pucDataInput[in]:缓冲区指针,用于存放外部输入的数据
uiInputLength [in]:输入的数据长度
pucIV[in|out]:缓冲区指针,用于存放输入和返回的IV数据
pucDataOutput [out]:缓冲区指针,用于存放输出的数据密文
puiOutputLength [out]:输出的数据密文长度
phKeyHandle[out]:返回的密钥句柄
返回值:0成功
非0失败,返回错误代码
上述接口在“标准”6.4.3的基础上增加了pucIV[in|out]和phKeyHandle[out]参数,第一个参数的作用是用来缓存过程中间解密的结果,并且返回IV数据,第二个参数返回会话密钥的句柄,以供其他接口使用该会话密钥的加解密。
1.2.2 RSA加密和签名输出
对于Web服务,若有一个接口可以实现验签、对称密钥解密、保存密钥对这几个功能,这样当服务器收到KDC返回的消息时,利用该接口将密钥对保存在本地,这样会减少在协议执行过程中对接口的频繁调用,从而提高协议的效率。在密钥对产生的过程根据前面设计的协议密码设备对外所显示的密钥对是以密文的形式存在的,另外为了保证信息的抗抵赖性,应当有密钥对密文的签名。而在 “标准”中只有产生RSA密码对并输出的接口,于是就有了下面的接口设计。
生成RSA密钥对加密并将密钥对密文和密钥对密文的签名值一并输出:
原型:int SDF_GenerateKeyPairWithEncryptAndSignature_RSA&ECC(
void * hSessionHandle,
void * hKeyHandle,
unsigned int uikeyBits,
unsigned char * EncpucKey,
unsigned int uiAlgID,
unsigned char *EncpucKeyPair,
unsigned int *EncpuiKeyPairLength,
unsigned char *pucEncDataSignatur,
unsigned int *puiEncDataSignatureLength,
unsigned char *pucIV);
描述:生成服务器请求的RSA密钥对,用外部会话密钥对生成的RSA密钥对加密,并用内部私钥签名。
参数:
hSessionHandle[in]:与设备建立的会话句柄
hKeyHandle[in]:指定的密钥句柄
uikeyBits:指定密钥模长
uiAlgID[in]:算法标识,指定对称加密算法
EncpucKeyPair[out]:输出的RSA密钥对密文
EncpuiKeyPairLength[out]:输出的RSA密钥对密文长度
pucEncDataSignature[out]:缓冲区指针,用于存放输出的签名值
puiEncDataSignatureLength[out]:输出的签名值长度
puclV[inIout]:缓冲区指针,用于存放输入和返回的IV数据
返回值:0成功
非0失败,返回错误代码
接口在“标准”6.3.3的基础上增加了以下参数:
1) hKeyHandle[in]:指定密钥句柄用来对加密的密钥对进行签名;
2) uiAlgID[in]:指定对称加密算法;
3) EncpucKeyPair[out],EncpuiKeyPairLength[out]:用来存储加密后的密钥对以及密钥长度;
4) pucEncDataSignature[out],puiEncDataSignatureLength[out]:用来存储加密密钥对密文的签名值和签名值长度。
1.2.3 内部会话密钥解密存储
在RSA密钥对的生成导出导入过程中的第六步所要实现的功能是对加密的RSA 的签名进行验签,如果验签通过后使用第一阶段协商好的会话密钥进行解密得到RSA密钥对,并将密钥对存储在密码卡中以供之后的调用。在“标准”中没有符合的此功能的接口,于是设计了内部会话密钥解密存储的接口:
原型:int SDF_ImportKeyPairWithDecryptAndVerify(
void * hSessionHandle,
void * hKeyHandle,
usigned int uiKeyIndex,
usigned int uiAlgID,
usigned char ucIV,
usigned int funcKeyPairID,
usigned char * pucEncData,
usigned int uiEncDataLength,
unsigned char *pucEncDataSignatur,
unsignedintuiEncDataSignatureLength);
描述:使用指定的密钥句柄和IV对导入的密钥对进行对称解密运算并保存在密码设备存储区内。
参数:
hSessionHandle[in]:与设备建立会话句柄
hKeyHandle[in]:指定的密钥句柄
uiKeyIndex[in]:输入密码设备存储的内部密钥对索引值
uiAlgID[in]:算法标识,指定对称加密算法
ucIV[in]:输入的IV数据
funcKeyPairID[in]:0:RSA加密密钥对;非0:RSA签名密钥对
pucEncData[in]:缓冲区指针,用于存放输入的数据密文
uiEncDataLength[in]:输入的数据密文长度
pucEncDataSignature[in]:缓冲区指针,用于存放输入的签名值
uiEncDataSignatureLength[in]:输入的签名值长度
返回值:0成功
非0失败,返回错误代码
2.1.1 BAN逻辑的基本术语
在BAN逻辑中有主体、密钥、语句、等几种对象。一般用符号A、B、S表示特定主体;Kab、Kas、Kbs表示特定的共享密钥;Ka、Kb、Ks表示特定的公钥,而Ka-1、Kb-1、Ks-1表示相应的私钥;Na、Nb、Nc表示特定的语句。符号P、Q、R表示主体变量;X、Y表示语句变量;K为密钥变量。
以下是BAN逻辑中所用到的一些术语:
1)PbelieveX:主体P认为X为真。
2)PseesX:P看到X。
3)PsaidX:P曾说过X。
4)PcontrolsX:P对X具有控制权。
5) freshX:公式X是新鲜的。
9) {X}K:表示用密钥K对公式X的加密。
10)〈X〉Y:表示X与Y组合,其中Y为秘密。
2.1.2 BAN逻辑的推理规则
BAN逻辑的规则[10]主要有以下几组。
1) 消息含义规则
(1)
(2)
(3)
2) 新鲜值验证规则
(4)
3) 控制规则
(5)
4) 看到规则
(6)
(7)
(8)
(9)
(10)
5)新鲜性规则
(11)
2.1.3 BAN逻辑分析协议的步骤
利用BAN逻辑分析协议的步骤如下:
1) 给出协议目标;
2) 由最初的协议得到理想化协议;
3) 给出初始假设;
4) 根据逻辑规则推理协议目标。
RSA密钥对的生成与导入导出过程主要的通信有两步:
Message 1:A→B:{Mab}Kab
Message 2:B→A:{Ka,Ka-1,Ta+1}Kab,{{Ka,Ka-1,Ta+1}Kab,Ta+1}Kb-1
对上述协议进行协议化,将得到如下两个消息:
先给出最终要证明的目标:
最终要证明的是A认为Xab是只有A和B知道的秘密;B认为Xab是只有A和B知道的秘密,因为对于Kab只能是A和B之间共享的密钥以此保证二者之间通信是不被第三个人知道的。另外对于二级信仰要得到的目标是A认为B认为Xab是只有A和B知道的秘密以及B认为A认为Xab是只有A和B知道的秘密,这样就能保证信息在传输过程中可认证性和完整性。
给出初始假设:
5)Abelieves fresh(Ta+1)
6)Bbelieves fresh(Ta)
前两个假设A和B都相信Kab是A和B的共享密钥,因为在信息传出的过程中要使用Kab对信息加密,只有A和B使用相同的Kab才能对消息进行对应的加解密,所有这两个假设是可行的。3)和4)两个假设是A和B都相信对方对Xab这个秘密都有控制权也就是说A和B可以更新二者之间的秘密。5)和6)两个假设是A和B相信Ta+1和Ta都是新鲜的,因为Ta+1和Ta是时间戳,所以这两个假设是可行的。最后两个假设,A相信Kb是B的公钥,一个实体的公钥可以被任意的另外一个实体得到,所以此假设是可行的,另外,A相信B对加密了的A和B之间的秘密Xab具有控制权,因为A和B的共享密钥是B产生的所以该假设是可行的。
协议分析如下:
另外,还有假设,Bbelieves fresh(Ta),根据新鲜值验证规则④可得:
这就是对Message 1进行分析所得的结论。
另外,还有假设Abelieves fresh(Ta+1),根据新鲜值验证规则④可得:
另外,还有假设:Abelieves fresh(Ta+1)根据新鲜值验证规则④可得:
本文主要对规范中的接口进行了补充,设计了满足SSL服务器密钥对在外部生成的场景下的密码设备密码运算接口,提出了服务器与KDC握手协议和密钥对导入/导出协议,并对该协议在传输过程中进行了BAN逻辑的形式化分析。研究结果表明该协议保证密钥对在网络传输过程的标识性、完整性和机密性。在下一步的研究中将实现所设计的协议并通过实验对其进行效率分析。