基于Java卡技术的移动平台数字签名方法研究
2009-05-31
作者:张攀峰, 程小辉, 侯研丽
摘 要: 对基于Java卡(嵌入了Java卡虚拟机的智能卡)技术的移动平台的安全机制及其实现方法作了分析,给出了ARM9平台与智能卡硬件的互联方法和软件通信机制,重点阐述了利用Java技术在嵌入式平台上使用智能卡进行数字证书申请、签名及验证操作的逻辑和实现方法。
关键词: Java卡; SATSA; 公钥基础设施; 移动平台;智能卡
随着科学技术的迅猛发展,智能移动平台已成为新的发展亮点,但移动平台上的安全问题却相对薄弱。当利用移动智能平台进行电子商务、移动办公时,如何与从未谋面的合作伙伴、机构等建立信任关系、彼此验证身份是一个非常现实的问题。现有的方法大多是以网络服务商或银行系统等作为安全服务的认证中心,但这些认证服务都各自独立,存在很大局限性。建立一套统一的认证系统是我国信用体系的发展方向,国内一些大城市已经陆续建立CA中心。本文介绍利用Java卡技术在嵌入式平台上实现的一种客户端原型系统。
1 Java卡介绍
Java卡是智能卡的一种,它通常由8位处理器和有限的RAM及非易失性存储器(EEPROM或Flash)组成。高端的Java卡还带有RSA加解密专用芯片以及32位处理器,可以把Java卡看成是一种安装了Java虚拟机的智能卡。在虚拟机上可以运行各种Java小程序,这种小程序叫做Applet。每个Applet之间被内部防火墙隔开,这使得Java卡可以支持一卡多用。
Java卡框架集成的服务能对外提供基本的密钥生成、签名验证等服务,同时它还能够存储各种数字证书、密钥对(key pairs)、电子钱包数据等。由于采用特有的硬件安全措施,且对私钥的各种操作都在卡内完成,不允许复制与传出,避免了密钥被泄露的风险。Java卡也因具有很高的安全性而成为PKI技术最理想的选择。
2 硬件设计
本实验平台为AT91SAM9260芯片的嵌入式平台,此芯片是基于ARM9内核并带有Java硬件加速模块的芯片。软件平台为Linux 2.6.19 OS并移植了基于CDC的JVM嵌入式虚拟机。图1为嵌入式平台与智能卡相连接的电路图。
图中AT9260的TCLK0、TIOA1与智能卡时钟信号端CLK相连,为智能卡内部的CUP和数据传输提供3.7 MHz外部时钟脉冲。TIOB0与智能卡的I/O口相连,提供半双工异步串行通信。TIOB1与智能卡的RST端相连,为智能卡提供复位信号。
3 Java卡与移动终端之间的通信
Java卡与移动平台之间的通信有两种通信协议。一种是基于程序协议数据单元(APDU)的消息传送协议,它符合ISO/IEC 7816-3、7816-4国际标准。另一种是基于远程方法调用(JCRMI)协议,它是分布式对象模型的一个子集。这时Java卡小应用程序(Applet)相当于一个服务器,而读卡器端的程序相当于客户端[1]。
在JSR-177规范中定义了安全与信任服务API(SATSA:Security and Trust Services API),它提供了嵌入式平台与Java卡的通信功能。SATSA属于可选包之一,在移植JVM时必须安装。当J2ME应用程序与Java卡通过APDU协议进行连接时,需要调用javax.microedition.io.Connector.open()方法来建立连接,并使用exchangeAPDU()方法向Java卡发送命令。操作完成后使用javax.microedition.io.Connection.close( )方法断开连接。
4 数字证书的申请
4.1 根证书申请
浏览器软件中一般都存储了一个自签名证书列表(self-signed certificate list)也叫Root CA根证书列表,它是各CA中心给自己的身份信息及其公钥的一个自签名证书组成的列表,这个列表是在浏览器软件制作的过程中加入的。如果用户准备注册的CA中心的根证书不在这个列表中,可以先到CA中心填写申请信息,这时CA中心的审核授权部门(Registry Authority)会审核申请,申请通过,会发给用户一个参照号 Ref.number 及 Auth.code号。有了这两个号码,申请人可通过浏览器下载安全根证书。根证书列表是各CA中心签署所有证书的信任基础。
4.2 数字证书的申请
当用户登录到CA中心进行证书申请时,会要求下载一个CA中心签名的安全插件,这时浏览器会在根证书列表中查找相应的公钥并对插件的签名进行验证。安全插件安装后会调用Java卡内部的服务生成签名密钥对,并把密钥对添加到内部的安全存储区中,同时在卡内部对注册信息进行签名,然后发送到CA中心注册。CA中心的签名服务器反馈数字证书给移动终端,终端保存数字证书到Java卡中。基本过程如图2所示。
数字证书申请通过调用generateCSR(java.lang.String nameInfo, java.lang.Stringalgorithm, intkeyLen, intkeyUsage, java.lang.StringsecurityElementID, java.lang.Stringsecurity ElementPrompt, booleanforceKeyGen)方法实现。该函数首先会读取智能卡中的密钥和证书,如果有多对密钥和证书,则会进一步提示选择哪一个密钥用于申请数字证书。如果没有找到密钥,这时设置forceKeyGen标志位,申请产生新密钥。选择完后会把有关信息签名后发送到CA中心的注册服务器。服务器返回数字证书。这时再调用addCredential(java.lang.String certDisplayName, byte[]pkiPath, java.lang.Stringuri)方法将证书存储到智能卡中。
5 数字签名与证书验证过程
5.1 数字签名过程
签名时使用sign(java.lang.String stringToSign, intoptions, java.lang.String[]caNames, java.lang.StringsecurityElementPrompt)方法。其中参数stringToSign就是待签名的字符串,它必须符合UTF-8标准,签名产生的加密摘要符合RFC2630标准。参数caNames指定签名密钥。在签名过程,sign()方法会通过APDU协议调用卡上的签名服务。它首先使用摘要算法产生一个16 B的摘要,然后使用非对称加密算法用私钥对摘要加密。基本过程如图3 所示。
5.2 签名验证过程
在数字证书中记录了摘要版本号和生成摘要的算法信息。待验证信息首先拆分成原始信息和摘要密文两部分,原始信息通过证书中提供的摘要版本号选择对应的摘要算法对原始信息进行摘要计算,接着使用对方的签名公钥对加密摘要进行解密。解密后的摘要值与先前计算出的摘要值进行对比,如果一致,说明这份信息真实可靠,没有被他人截获伪造。在验证过程中验证用户还需要发送消息到证书库查明签名用户证书的状态和有效性。签名验证使用authenticate(byte[] byteArray ToAuthenticate, intoptions, java.lang.String[] caNames, java.lang.StringsecurityElementPr-ompt )方法。其中byteArrayToAuthenticate参数为待验证的信息,caNames指定验证使用的密钥对。当调用验证函数后,函数会把待验证信息发送到卡中进行签名验证并返回验证结果。验证逻辑如图4所示。
6 实验及结果
实验中对字符串“基于Java卡技术的移动平台安全研究与实现”用私钥进行了签名。其中签名私钥为0123456789,摘要算法采用 SHA1,加密算法选用1024位RSA。通过客服端调用Java卡中的签名服务,返回结果如下:
基于Java卡技术的移动平台安全研究与实现iQCVAw UBSG5Go7C6kfBHes8iAQKy4gP/Vil3eIqv/YOewJETaD3Qpc WtxZnP4woiLCU1D+oitJ4NFycM+JUToJ3DMXUf57T5OZKft8wohMA6fPlqmhAC48ovVbJX6RCC7XUcveTZuIgaWPQtE/svw
X6IdeVojg/idOL2NCdL5yFhO40w54Jhf5OipKTI3bKncWncUijw NgU==EWFm
在验证过程中,当把上面的字符串发送到卡中,最后运算结果返回“true”,表白验证成功。
本文重点阐述嵌入式系统与Java卡交互的工作机制和数字签名在客户端的实现方法。利用Java技术,有效降低了智能卡程序开发的难度。使得Java开发人员无需深入了解复杂的智能卡硬件和智能卡专用技术就能进行开发。同时在不同的Java卡上的应用也可以很方便地移植。
参考文献
[1] Sun Microsystems Inc. Java card platform specification 2.2.2.[S].
[2] Sun Microsystems Inc. IncSecurity and trust services API (SATSA) for Java 2 platform[S], Micro Edition Version 1.0, 2004.
[3] Fabio Martinelli, Paolo Mori. Enhancing Java security with history based access control[C]. FOSAD 2006/2007, LNCS4677, 2007.
[4] 刘春,熊璋. Java卡平台安全性研究与应用.计算机工程与设计[J], 2004(10).
[5] 马多贺. Java智能卡开发及应用技术研究[D]. 哈尔滨工业大学学报, 2006(6).
[6] 谢冬青,冷键.PKI原理与技术.北京:清华大学出版社[M], 2004(1).