新一代Java智能卡技术研究
马旭,王立,彭晓锋
北京邮电大学电信工程学院,北京 (100876)
E-mail:marxuxp@yahoo
摘要:本文较详细地讨论了最新的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.io
Java.io 的子集,基本I/O 操作 Java.lang
程序开发的基本支持类 i
定义了远程调用接口,以支持远程方法调用 Javacard.framework
提供用于建立Applet,提供相应的类和接口框架 Javacard.framework.service
提供允许Java 卡Applet 被设计为服务集合体的类和接口框架 Javacard.security
提供Java 卡安全服务和加密机制的公共类和接口 ipto 包含为实现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]。每个阶段都有对应的安全措施,在文件下载安装时有相应的合法
性检查,程序运行时提供数据保护和隔离机制,并提供了各种标准加密包以简化加密编程。
4.1 JCRE安全机制
当多个Applet处于激活状态的时候,JCRE必须提供相应的安全机制保证数据的隔离和
java重载通信,运行时的安全机制主要是防火墙。
防火墙机制主要用于隔离不同上下文的Applet对象。同一个上下文的对象可以互相访
问,包括Applet对象,Applet的域和其他类型的对象。JCRE利用现在活动上下文(Currently Active Context)来实施防火墙规则,它是指当前得到系统控制权的Applet的上下文,系统
中只有一个现在活动上下文。当访问另一个对象时,访问者的上下文就是现在活动上下文,如果被访问者也处于其中则可以访问,否则将抛出java.lang.SecurityException。如果调用一个对象的实例方法处于
不同的上下文,JCRE将执行上下文切换。和普通的方法调用一样,只是这里还需要在栈中保存上下文信息,调用完成后恢复到原来的上下文。
Applet对象间访问机制主要是通过实现sharable接口来实现。首先,服务提供者实现这个接口,或者是和服务提供者在同一个上下文的Applet实现此接口。必须要重载一个静态方法SharableInterfaceObject,此对象称为Sharable Interface Object (SIO)。服务请求者通过调用AppletSharableInterfaceObject方法可以得到SIO的对象引用,通过此引用就可以得到服务提供者的服务。JCRE扮演的角是,为client applet获取server applet的SIO对象引用,并在通信过程中维护现在活动上下文和实施防火墙策略。
同时,JCRE还提供了一套跨防火墙访问机制。系统定义了一些特殊的对象,可以被其他任何上下文内的对象访问。主要有两种:JCRE入口点对象和全局数组,通过他们可以实现跨防火墙通信。
除了运行环境对安全性的支持,Java 卡还提供了相应的加密标准API,通过继承和实现这些类或者接口,可以实现信息加密和数字签名功能。目前较常用的一些加密算法,如DES、RSA都有相应的包支持。同时,Java语言提供了一个友好的开发环境,可以很容易开发和移植各种安全插件。
4.2 Java完整性
Java卡提供了一种类似于数据库中回滚(Rollback)的原子性操作机制。如果系统中出现了一些意外情况,如掉电、中断等,系统可以回滚到交易前的状态,可以保证数据的完整性。Applet通过调用JCSystem.beginTransaction开始一个原子操作,调用JCSystemmitTransaction后才会将数据写入永久数据存储区,如果出现了任何故障,系统将自动回滚到调用JCSystem.beginTransaction之前的状态。期间可以调用JCSystem.abortTransaction取消操作。原子操作不允许嵌套,在一个时间内只能有一个。回滚时只能恢复永久数据,对一些全局数组和临时对象不做保护。如果此时发生了上下文切换,在新的上下文中对永久数据的更新是有条件的,直到此操作完成或取消。
JCRE对原子操作的支持使Java卡可以应用在金融、银行、移动钱包等需要高安全性和完整性的行业。
5. 总结
以上较全面地介绍了Java智能卡技术。在许多应用中,智能卡是一项关键技术。例如在移动通信中,机卡分离实现了用户和移动台的分开管理,而用户管理主要是通过SIM卡,实现用户鉴权、认证、计费等。目前,支持Java技术的智能卡已经得到了广泛应用,世界许多大型电信运营商都以此为平台开发SIM卡。
安全性是Java智能卡是否能得到广泛应用的关键。虽然目前可以提供良好的信息存储和管理功能,但还不能保证高安全性。在金融、移动钱包等应用中,安全性是首要问题,也是目前的瓶颈,还需要进一步
深入研究。