一种基于数字证书的USBKey身份认证方案
2015-11-25左志斌
左志斌
(郑州市惠济区委办公室,河南 郑州 450044)
随着互联网的不断发展,越来越多的人开始尝试在线交易。然而病毒、黑客、网络钓鱼以及网页仿冒诈骗等恶意威胁,给在线交易的安全性带来了极大的挑战。调查显示,去年美国由于网络诈骗事件,使得银行和消费者遭受的直接损失总计达24亿美元,平均每位受害者损失约1200美元。层出不穷的网络犯罪,引起了人们对网络安全的关注,如何构建一种安全的通信系统成为目前迫切需要解决的问题。本文将介绍一种使用USBKey实现的基于数字证书的身份认证方案。该方案使用USBKey实现基于数字证书的客户端与服务器端的身份相互认证,利用该身份认证方案,可以同时完成客户端与服务器端双方会话密钥的分配。最后,文章对该身份认证方案的安全性和有效性进行了分析。
1 相关技术介绍
1.1 数字证书
数字证书又称为数字标识(DigitalID),是标志网络用户身份信息的一系列数据。它提供了一种在Internet上身份验证的方式,是用来标志和证明网络通信双方身份的数字信息文件。通俗地讲,数字证书就是个人或单位在Internet上的身份证明。
数字证书是由CA中心签发的,它本身就是用户的身份和与之所持有的公钥的结合。在结合之前,由一个可信任的认证机构(CA)来证实用户的身份,然后由可信任的认证机构(CA)对该用户身份及对应的公钥相结合的证书进行数字签名,用来证明证书的有效性。
一个数字证书的内容主要包括以下几部分:①所有者的公钥;②所有者的名字;③公钥的失效期;④发放机构的名称(发放数字证书的CA);⑤数字证书的序列号;⑥发放机构的数字签名。
数字证书采用公钥密码体制中的RSA体制,每个数字证书都拥有一对互相匹配的密钥,即私有密钥(私钥)和公共密钥(公钥)。其中,私钥仅为用户本人所掌握,主要用于解密和数字签名;而公钥可以对外公开,主要用于加密和验证签名。数字证书的加密过程是一个不可逆的过程,即利用公钥加密后的数据只能通过相应的私钥才能进行解密。因此,在发送数据时,只要发送方利用接收方的公钥对要发送的数据进行加密,就可以确保数据的保密性,因为即使加密数据被第三方截获,由于没有相应的私钥,第三方也无法进行解密。而第三方要破解出私钥也是不现实的,即使在已知公钥、明文、密文的条件下,要推导出目前使用的1024位RSA密钥,也需要上千年的时间[1-2]。
1.2 USBKey
USBKey是一种USB接口的硬件设备。它内置单片机或智能卡芯片,有一定的存储空间,可以存储用户的私钥以及数字证书。由于用户私钥保存在USBKey的密码锁中,理论上使用任何方式都无法读取,因此保证了身份认证中用户私钥的安全性。
每一个USBKey都具有硬件PIN码保护,PIN码和硬件构成了用户使用USBKey的两个必要因素,即所谓“双因子认证”。用户只有同时取得了USBKey和用户PIN码,才可以登录系统。即使用户的PIN码被泄漏,只要用户持有的USBKey不被盗取,合法用户的身份就不会被仿冒;而如果用户的USBKey遗失,拾到者由于不知道用户PIN码,也无法仿冒合法用户的身份[3]。
USBKey具有安全数据存储空间,可以存储数字证书、密钥等秘密数据,对该存储空间的读写操作必须通过程序实现,用户无法直接读取,其中用户密钥是不可导出的,杜绝了复制用户数字证书或身份信息的可能性。
USBKey内置CPU,可以实现加解密和签名的各种算法,加解密运算在USBKey内进行,保证了密钥不会出现在计算机内存中,从而杜绝了用户密钥被黑客截取的可能性[4]。
2 方案设计
2.1 设计思想
该身份认证方案的设计思想如下:在双方进行数据通信前,通信双方相互认证对方的身份。首先,客户端使用自己的证书私钥对随机数进行签名发送给服务器端,服务器端验证签名来实现对客户端的身份认证。之后,服务器端使用自己的证书私钥对自己产生的随机数、客户端发送过来的随机数进行签名后发送给客户端,客户端通过验证签名来实现对服务器端的身份认证。最后,客户端将接收到的服务器端随机数进行签名后发送回服务器端,服务器端通过比较该随机数是否是自己发送的随机数来实现身份认证过程中的抗重放攻击[5]。
2.2 身份认证过程
过程1:实现服务器端对客户端的身份认证;
①客户端调用自己的USBKey产生非重复的随机数r1;
②客户端使用存储在USBKey中的证书私钥(Ka私)对{随机数r1+服务器端身份}进行签名获得签名信息Ma;
③客户端将获得的签名信息Ma发送到服务器端;
④服务器端提取存储的客户端的证书公钥(Ka公),使用该公钥对签名信息Ma进行验证签名同时检验服务器身份,验证通过则证明该信息是由客户端A发送的,该信息是完整的,未经篡改的;否则,拒绝该用户;
过程2:实现客户端对服务器端的身份认证;
⑤服务器端产生非重复的随机数r2;
⑥服务器端使用自己的证书私钥(Kb私)对{随机数r1+随机数r2+客户端身份}进行签名获得签名信息Mb;
⑦服务器将签名信息Mb发送到客户端;
⑧客户端使用服务器端的证书公钥(Kb公)验证签名信息Mb并验证客户端身份;验证通过则证明了服务器端的身份,该信息是服务器端发送的,该信息是完整的,未经篡改的;
⑨客户端比较自己产生的随机数r1与接收的随机数r1以证明该次会话是自己请求的应答;
过程3:实现身份认证过程中的抗重放攻击。
⑩客户端使用自己的证书私钥(Ka私)对{随机数r2}进行签名获得签名信息Mc;
该次认证的目的是通过服务器端检查发送的随机数与接收的随机数是否相同来证明是否有重放攻击,在通信双方无法建立时钟同步的情况下,该方法可以很好地解决重放攻击的发生。
身份认证过程流程图如图1所示。
3 方案的有效性和可行性分析
3.1 在身份认证过程的开始,需要验证客户端用户的PIN码,该步骤保证了登录用户必须是USBKey的合法持有者,否则即使持有USBKey,由于不知道用户PIN码,也无法进行下一步操作;
3.2 基于该方案的身份认证过程,是利用公钥密码技术实现的,它的安全性从根本上取决于所使用私钥的安全性。服务器端私钥可以在服务器端由专业的人员通过相关的安全策略和手段来管理,而客户端私钥由于由用户掌握,安全性成为薄弱环节。在该身份认证方案中,客户端用户私钥是通过USBKey产生的,产生后即存放在USBKey中,用户无法进行读取。同时,客户端用户私钥的使用,包括对传输信息的签名和验证签名都是在USBKey中进行的,保证了用户私钥不会出现在计算机内存中,从而杜绝了用户密钥被黑客截取的可能性,保证了认证的安全性;
图1 身份认证流程图
3.3 为了使用USBKey实现证书私钥的数据签名、验证签名以及其他各种加解密操作,可以使用CryptoAPI的开发模式。CryptoAPI是微软提供的一套Win32环境下加解密和签名认证的编程接口,以供应用程序开发人员调用。通过调用这套函数接口,应用程序可以方便地操作USBKey来完成对数据的加解密和签名验证的功能;
3.4 在该方案中可以在身份认证的过程中,添加会话密钥的传输,以实现通信中的密钥分配功能。
[1]杨波.现代密码学(第3版)[M].北京:清华大学出版社,2015.
[2]王育民,刘建伟.通信网的安全理论与技术[M].西安:西安电子科技大学出版社,2002.
[3]关振胜.公钥基础设施PKI及其应用[M].北京:电子工业出版社,2008.
[4]李涛.网络安全概论[M].北京:电子工业出版社,2004.
[5]范红,冯登国.安全协议理论与方法[M].北京:科学出版社,2003.