摘要:本文针对Java智能卡的安全问题,提出了一种新的解决方案——将可信计算技术引入到Java智能卡的设计与实现中,以可信计算在安全方面的优势来解决智能卡的安全问题。文章首先从硬件方面对该方案的可行性进行了分析,然后从类库、虚拟机和运行时环境三个方面介绍了如何实现Java智能卡,并着重介绍了可信机制的构建。
1 引言
Java 智能卡是一种能运行Java 语言程序的智能卡,它在资源有限的智能卡环境中支持Java 语言的一个子集,是Java 嵌入到智能卡中的一种新的应用[1]。由于Java 智能卡具有一卡多应用的特性,而且Java 程序“编写,到处运行”,使得近几年来Java 智能卡市场蓬勃发展起来。Java 智能卡产品已经在全世界得到了广泛的应用,包括无线通信、医疗/健康保险、金融银行、政府机构、身份、电子商务、系统安全等领域。
Java 智能卡可以同时运行几个不同的程序,而且无论发卡前,还是发卡后,都卡允许用户自由的,安装和删除程序。这就需要卡片具有很高的安全行。而现在的Java 智能卡一般通过简单的防火墙和接口共享机制来保障其安全性,这无疑存在着安全隐患。该方案将把可信计算技术引入到Java 智能卡的设计与实现中,以可信计算在安全方面的优势来解决智能卡的安全问题。
2 硬件平台的选择
本文经过研究发现:可信计算和 Java 智能卡技术对硬件的需求基本相同。两者都需要易失存储器,非易失存储器,对称/非对称密码处理器,随机数处理器,杂凑运算单元,执行单元和随机数产生器。当然,两中技术对硬件的要求有细微的差异:例如可信密码模块需要监测电源,而智能卡不需要;可信模块的RSA 引擎需要达到2048 位强度,而智能卡并没有明确的规定;可信模块的I/O 是总线形式的,而智能卡需要射频、USB 或者其它形式的通讯模块。
由以上分析可以看出,智能卡和可信模块对硬件的需求虽然有所异同,但并不矛盾,这些差异是两者对安全性的不同要求造成的。为了将可信计算技术引入到智能卡的设计与实现中,可以挑选一款规格合适的智能卡芯片作为硬件平台。经过对比,该方案中,终选择了中兴集成电路设计有限公司的芯片Z32H256D32SU。该芯片是中兴在国产32 位RISC 处理器的多功能安全处理平台基础上开发出的,具备高处理能力、高安全性、低功耗、低成本等特点。它具有8KBSRAM 存储器、256KB Flash 存储器、32KB EEPROM 存储器,支持DES/3DES、RSA、ECC、SHA-1、HMAC 等算法,并带有随机数产生器和电源监测等模块(具体的参数可以参见其手册)。该芯片完全可以同时满足智能卡和可信计算的硬件需求,用于构建可信Java 智能卡。
3 可信Java 智能卡的设计与实现
3.1 可信Java 智能卡的架构
可信 Java 智能卡(Trusted Java Card,缩写为TJC)是在Java 智能卡中引入了可信的理念,用可信技术来增强其安全性。其结构框架如图1 所示。
层是各种硬件资源,它上面硬件驱动层,这一层是底层硬件调用接口的集合,它可以把上层和具体的硬件细节分离,方便以后的硬件的升级,而且可以更方便的实现Java 的平台无关性。
安全管理组件是一组执行各种操作的组件的集合,例如包的,包的度量,Applet的安装和删除,密钥的存储和读取,事务的记录和回滚等,这些功能组件通过运行时环境的调用来执行。其它各模块的设计下文分别予以说明。
图 1 可信Java 智能卡的架构
3.1.1 可信Java 智能卡虚拟机
可信 Java 智能卡虚拟机是用于支持字节码运行的虚拟计算机,它的功能是解释虚指令,使程序按着正常的流程执行。虚拟机有13 类185 条指令需要实现,该方案在实现虚拟指令调用时,设计了一个用于定位指定指令的虚拟指令跳转表,采用函数指针的方式实现虚拟指令跳转,其定义如下所示:
BYTE (*bytecodeJumperFun[185])();
执行一条指令的基本步骤如图2 所示:
1. 首先读取 PC 指针处的值,得到与该值相对应的方法区中的指令。
2. 判断其是否需要解析,如果需要,则先解析该指令,得到所访问对象的物理地址后,再对其解释执行;如果为简单指令,则无需解析直接执行即可。
3. 在本指令执行结束后,虚拟机将PC 指针指向当前指令缓冲区中的下一条指令,如果该指令存在,则重复执行步骤一、二;否则在所有指令执行完毕的情况下,退出虚拟机,程序运行结束。
图 2 解析虚拟指令的基本流程
3.1.2 可信Java 智能卡类库
可信 Java 智能卡类库既实现了一般的Java 智能卡应用程序接口,又实现了可信密码模块的用户接口。为了提高执行速度,耗费时间比较多的操作用C 语言实现。在 CAP 文件中,每个方法的头信息如下所示:
当flags 值为1 时,TJCVM 去调用与该方法对应的C 方法;值为0 时,TJCVM 将定位到该方法的函数体,对字节码进行解释。类库的设计采用了基于 token 的动态链接过程。所谓“基于token 的动态链接过程”是指为提高Java 智能卡应用程序的独立性,在解释执行指令时,虚拟机首先将需要访问的对象(例如类、方法等)转化为与访问对象对应的符号(token),然后再将token 转化为存储被访问对象的物理地址这一过程。动态联接减小了修改其他类时对本程序代码的影响。在Java 智能卡应用程序Applet 运行时,如果引用了外包中的方法,解释器将获得引用的外包的索引,以类和方法token 值作为索引标记,通过CAP 文件中各组件中具体的包信息、类信息和方法信息,可以准确地完成从token 值跳转到被引用方法的具体实现。
3.1.3 可信Java 智能卡运行环境
可信 Java 智能卡运行环境扮演着决策者和调度者的角色,它根据Java 智能卡的具体状态决定在什么时候调用哪个功能模块,并且为各模块提供合适的运行环境。到卡内的 Applet,由Java 智能卡运行环境控制运行,其运行状态有以下几种:
已安装状态
此状态为应用程序安装并在卡上注册后的状态。
被选择状态
应用程序只有被选择后,才能被激活,进入命令处理状态,与读写器间进行交互。
命令处理状态
在此状态下,Java 智能卡与读写器进行通信,执行应用程序中定义的process 方法。通过在应用程序中重载此方法,即可完成不同的智能卡应用功能。
取消选择状态
此状态为应用程序的非激活状态,直到该应用程序被重新选择为止。各状态之间通过执行不同的指令相互切换,运行环境都会根据Applet 所处的具体状态,来判断哪些功能模块应该执行,哪些模块不能执行,哪些由系统自动运行,哪些由用户调用,以及各模块之间的执行顺序。
3.2 可信机制的构建
可信计算的理念就是信任链的传递。TJC 中信任链的传递如图3 所示:
图 3 信任链传递示意图
信任链建立的前提条件是确定信任原点:三个可信根——可信度量根,可信根,可信存储根。本方案中将BootLoader 作为可信度量根,并在Z32H256D32SU 芯片的EEPROM中开辟两片独立的空间分别作为可信存储根和可信根。
BootLoader 在加电后被执行,它负责验证硬件平台和运行时环境的完整性,初始化一些硬件寄存器,并加载运行时环境。运行时环境的标准值被固化在BootLoader 内,当系统启动的时候,BootLoader 首先对运行时环境进行度量,然后将度量值与标准值比较,如果相同则将控制权移交给运行时环境;如果不同,则禁止启动。
运行时环境被加载后将一直占有 CPU 的控制权,它负责度量类库,解释器和各种管理组件,并负责调度各种可信服务,如身份和密钥管理等。当Applet 后,首先要被运行时环境度量,只有在通过度量的情况下,才被执行。
由 BootLoader 到运行时环境,再到Applet,就建立起了一条可信链,这条信任链中的每个环境都是自主开发的,这样就能保证卡内环境的可信。
4 结论
本文探索性的将可信计算和 Java 智能卡技术相结合,设计并实现了一款可信Java 智能卡,在很大程度上提高了卡片的安全性,同时为解决Java 智能卡的安全问题指出了一个新的方向。
作者的创新观点:探索性的将可信计算和 Java 智能卡技术想结合,用可信计算的在安全方面的优势来提高智能卡的安全性,为解决Java 智能卡的安全问题,指出了一个新的方向。
[1]. RISC datasheet https://www.dzsc.com/datasheet/RISC+_1189725.html.
[2]. PC datasheet https://www.dzsc.com/datasheet/PC+_2043275.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。