新一代Java智能卡技术研究马旭,王立,彭晓锋北京邮电大学电信工程学院,北京 (100876)E-mail:marxuxp@摘要:本文较详细地讨论了最新的Java 2.2智能卡技术,包括系统结构、运行时环境、编程模型、Java类库支持、虚拟机原理及设计,最后简要介绍了Java2.2智能卡的安全机制。
关键词: Java Card智能卡2.2,JCRE,JCVM,安全性1.引言智能卡也称为芯片卡、IC卡。
是将集成电路芯片封装在一个塑料基片上,通过芯片内的通信模块,智能卡可以和外部设备通信,完成数据传输、存储和处理,实现各种业务。
早期的智能卡实际上并不是严格意义下的智能卡,只是一种存储卡。
因为它没有片上微处理器,而只有少量的存储单元和固化的逻辑电路。
随着技术的发展,出现了微处理器卡,能够提供更高的安全性和更多的功能。
这种卡不能直接和外部交换数据,而是通过外部设备对微处理器发送一组指令,再由微处理器执行相关的操作,并把数据返回给外部设备。
由于Java语言的平台无关性、高安全性和易开发性,在智能卡应用中有相当的优势。
Java 语言刚诞生不久的1996年11月,美国Schlumberger 产品中心首先介绍了Java智能卡的API,并决定将智能卡开发重点转到保护信息安全上来。
Schlumberger 提出了Java API草案并创立了Java智能卡论坛[1]。
在广大厂商的支持下,SUN推出了Java Card 1.1规范,为Java智能卡定义了技术标准,并陆续推出了2.0、2.1、2.2版,提出了更为完整的技术要求。
目前,Java 智能卡技术已经趋于成熟,得到了广泛应用。
2.Java智能卡体系结构在智能卡硬件平台上,通过构建一个硬件或软件系统,以支持Java语言下载、运行,称为Java智能卡。
Java智能卡继承了Java技术的平台无关性,将硬件和软件分离,简化了应用程序开发,提高了程序移植性。
Java智能卡由以下几部分组成[2]:z硬件系统包括微处理器、存储器、通信电路、加密协处理器等模块z与智能卡硬件相关的本地方法集完成基本的I/O、存储、加密解密等对硬件的操作z JCVM(Java Card Virtual Machine)解释器完成对类文件的解析、构建Java栈和帧结构以支持Java字节码的执行z Java智能卡类库包括支持Java智能卡运行的核心类库和扩展类库z Java智能卡应用管理组件完成对卡上Applet的安装、注册和删除z Java智能卡运行环境包括支持卡内的Applet间的安全机制和对象共享机制,支持卡内的事务处理和异常处理z Java智能卡应用程序运行智能卡上的Java 应用程序系统结构如图1[2]。
图1 Java 智能卡系统结构 3.Java 智能卡应用程序开发和运行3.1 Java 语法规范Java 智能卡支持一个简化的Java 语法集,删除了较复杂和耗时的部分,但保留了面向对象特性。
表1[2]列出了一些支持和不支持的Java 特性表1 Java 智能卡支持和不支持的Java 特性Java 智能卡支持特性 Java 智能卡不支持特性简单数据类型 boolean byte short大数据类型 long float 等 一维数组多维数组 Java 包 类 接口以及异常字符和字符串 面向对象特性:继承 多态 虚方法 重载 动态对象生成 存取范围动态类装载 安全管理 垃圾回收和结束 线程 对象编序 可选int 关键字和32位整数数据类型对象克隆Java 智能卡也有相应的包支持,但也只是标准Java 的一个子集。
具体介绍请参见表2[2]。
表2 JCRE2.2提供的API包功能 Java.ioJava.io 的子集,基本I/O 操作 ng程序开发的基本支持类 Java.rmi定义了远程调用接口,以支持远程方法调用 Javacard.framework提供用于建立Applet,提供相应的类和接口框架 Javacard.framework.service提供允许Java 卡Applet 被设计为服务集合体的类和接口框架 Javacard.security提供Java 卡安全服务和加密机制的公共类和接口 Javacard.cyipto 包含为实现java 卡主动安全机制和加密框架的外部控制功能的扩展包编写的Java源程序首先要编译为二进制类文件,需要将此类文件进一步转换,以使其结构更紧凑,适宜于安装在智能卡上。
转换后的文件(Converted Applet, CAP)即为安装文件。
最后需要下载CAP文件,并完成其卡内安装注册。
3.2 运行时环境(JCRE)应用程序在卡内的执行由运行时环境决定,有以下三个状态:z选中状态(Select)只有应用程序被选中后才能进入处理状态与读写器交互。
z处理状态(Process)此时Java智能卡和读写器通信,执行应用程序中的process方法,通过重载此方法可以实现不同的功能。
z取消选择状态(Deselect)此时应用程序为非激活状态。
JCRE2.2支持多通道[3],最多可以有4个逻辑通道同时打开,但是由于Java卡并不支持并行同通信,所以实际上只有一个Applet处于活动通信状态。
其中Channel0为基本通道,不能够关闭,其他通道需要通过通道选择或者文件选择APDU打开。
当卡复位时,只有Channel0是打开的。
由多通道特性引出了Multiselectable概念。
即当一个通道选择了一个Applet后,其他通道也可以选择相同或者在同一个包中的Applet,具有Multiselectable性质的包需要实现Multiselectable接口。
一个Applet有多个实例在不同通道运行并不会造成信息的混乱,JCRE 精心设计的安全机制能保证两者的隔离和各自信息的安全。
有两种方法选择通道,即通道选择和文件选择,对应MANAGE CHANNEL OPEN APDU 和SELECT FILE APDU指令。
关闭通道时可以用MANAGE CHANNEL CLOSE APDU指令。
这些操作都对应一个复杂的管理流程,请参阅相关文献[2] [3]。
Java Card 2.2允许为每一个通路选择一个默认的Applet,当复位启动的时候就隐含了一个Applet实例。
打开其他通路的时候也可以有默认Applet或者选择其他Applet。
JCRE2.2新增了对远程对象调用(JCRMI)的支持,使得读卡器可以调用存储在卡内的远程方法。
实现这种机制的关键是在Javacrad.framework.service包中增加类RMIService。
请求的远程调用服务都被传递到这个类中的方法来处理。
JCRMI支持标准RMI服务的一个子集。
3.3 Java卡虚拟机(JCVM)3.3.1 JCVM体系结构Java卡虚拟机简称JCVM,是Java程序的运行环境,目前有两类JCVM实现方案。
一种是硬件的Java微处理器[4] [5] [6] [7],可以在硬件上直接执行Java字节码。
可以使用专用Java 微处理器,或者使用Java协理器。
此方案的优点是执行速度快,但是电路比较复杂,成本高,适用于一些高端应用。
另一种是软件实现[1] [2],即在智能卡上构建一个Java解释器,逐条将Java语句解释为机器码执行。
优点是结构简单,成本低,但是执行速度较慢。
解释型JCVM分为卡内和卡外两部分。
卡外虚拟机工作在PC上,主要执行文件编译、转化,生成安装文件。
卡内虚拟机工作在智能卡上,负责解释执行程序代码。
通过这种机制,Java保持了其平台无关性。
JCVM使用了一种称为token的动态链接技术[3]。
当包A(一个CAP文件)引用包B中的对象时,它并不知道此对象对应的具体物理地址,这时就可以动态地加载token来定位要引用对象的物理地址。
本质上token是CAP文件中的一些表的索引。
转化器在解析Java的类文件的时候,根据被引用的EXP文件,将类文件中使用的其他包中对象的源代码字符串转化为相应的token值存储在CAP文件中。
实际上就是一些偏移量,这些偏移量是相对于CAP文件开始位置的偏移量。
在智能卡上解析CAP文件的时候,如果遇到一个token,就说明这时候要用到别的包的对象了。
便将此token作为一个索引,在相应的表〔table〕或者数组中去查找,得到所引用对象在内存中的绝对位置。
3.3.2 CAP文件安装CAP文件的安装和解析是一个比较复杂的过程,下面予以简要介绍。
CAP文件一共有12个组件[4]。
分别为:COMPONET_Header, COMPONET_Directory, COMPONET_Applet, COMPONET_Import, COMPONET_ConstantPool, COMPONET_Class, COMPONET_Method, COMPONET_StaticField, COMPONET_ReferenceLocation, COMPONET_Export, COMPONET_Descriptor, COMPONET_Debug。
其中Applet,Export和Debug组件为可选组件,只有当需要相应功能时才需要加入。
每个组件封装为一个CAP包,包含在Jar包中。
最后在卡上只保留了5个组件:COMPONET_Method,COMPONET_Class,COMPONET_ConstantPool,COMPONET_StaticField和COMPONET_Export。
其余的组件只是安装时提取有用信息而不在卡中保存。
Java应用程序写到存储器之后,还不能立刻使用,还需要初始化和个人化。
初始化是将一些初始信息下载到永久存储区,它们是卡的通用信息。
个人化是将个人信息写到卡上,包括物理个人化和电子个人化。
物理个人化是在卡表面写上个人信息;电子个人化是将个人信息写到永久存储器中。
3.3.3 JCVM实现JCVM采用了面向堆栈的结构,但是做了进一步简化。
堆用于存放Java程序运行时创建的对象和数组,在字节码的对象创建指令运行时,JCVM将为其分配相应的空间存储。
栈主要用于方法调用时保存返回信息和上下文。
JCVM中只设置了4个寄存器,分别是pc寄存器、frame寄存器、var寄存器和optop寄存器。
pc寄存器指向当前方法中要执行的下一条语句;frame寄存器指向帧结构运行环境;var寄存器指向帧结构中局部变量区的最底端;optop指向帧结构中操作数栈的栈顶。
4. Java智能卡的安全性和完整性智能卡要得到广泛应用,首先就要解决信息的安全性和完整性问题。
Java卡中提供了多种加密和安全措施[8] [9] [10]。
每个阶段都有对应的安全措施,在文件下载安装时有相应的合法性检查,程序运行时提供数据保护和隔离机制,并提供了各种标准加密包以简化加密编程。