Java Card平台是一个安全的多应用环境-许多来自不同供应商的不同的小应用程序可以在同一张卡片上安全地共存。每个小应用程序被指派给一个执行上下文,这个上下文控制到分配给它的对象的访问。 一个执行上下文和另一个执行上下文之间的界限经常被称为小应用程序防火墙( applet firewall)。它是Java沙箱安全概念的一个Java Card运行时间改进本,联合类装入器java.ClassLoader和访问控制器、 java.AccessController的功能。Java Card防火墙创建了一个虚拟堆,这样一个对象只能访问存在于相同的防火墙内的(公共的)方法和数据。 一个防火墙可能包含许多小应用程序及其他对象,比如公共的秘钥。一个Java Card执行上下文目前作用域是程序包。 当每个对象被创建的时候,它被指派去执行调用程序的上下文。
Java Card平台支持跨防火墙的安全对象共用。图表12描述小应用程序隔离和对象共用:
 图表1. 小应用程序防火墙和对象共用
典型的流程,如图表12中的描述:
请求通过调用系统的JCSystem.getAppletShareableInterfaceObject ()方法访问Appletc的共享接口。
由于Appleta,JCRE通过调用小应用程序的getShareableInterfaceObject ()方法来要求Appletc的可共享的接口。
如果Appletc允许共用,Appleta将获得一个Appletc的共享对象的引用。Appleta现在就可以访问Appletc了。 Appleta将拥有它创建的任意对象,即使是那些定义在Appletc的。 在同一个执行上下文中的小应用程序默认情况下能够相互访问,所以Appleta和Appletb不需要遵循这个程序来共享对象。
管理内存和对象
在一个Java Card设备中,内存是最重要的资源。 在一些Java Card中,实现一个垃圾收集程序可能不能使用。当一个对象被创建的时候,对象和它的内容被保存在非易失性存储器中,使之可在会话之间使用。在某些情况下,应用程序数据不需要持久- -它是暂时的或者瞬变的(transient)。为了减少智能卡的持久性内存的消耗,并且最大化它的生命周期,我们要尽可能的经常以transient更新数据。
Java Card技术不支持关键字transient。取而代之,Java Card应用编程接口(javacard.framework.JCSystem)定义了三个方法,允许你在运行时间创建transient数据,还定义了一个方法让你检查一个对象是否是transient的:
static byte[] makeTransientByteArray(short length, byte event) static Object makeTransientObjectArray(short length, byte event) static short[] makeTransientShortArray(short length, byte event) static byte isTransient(java.lang.Object theObj)
你可以创建一个瞬变的字节或者short基本数据类型的数组,你也可以创建一个瞬变Object。但是记住下面用于瞬变数据的行为:
一个瞬变对象的状态在会话之间不能持久保存。 注意内容(不是对象本身)是什么是瞬变的。和任何其他的Java语言对象一样,一个瞬变对象只要它被引用就一直存在。
当一个事件例如卡片复位或者小应用程序取消选择发生的时候,一个瞬变对象的内容可能重置为字段的缺省值(0、false或者null)。
因为安全的理由,瞬变对象的字段不被保存在持久内存中。
对瞬变对象字段的更新不是原子性的,不会受事务的影响。
在一个Java Card环境中,数组和基本类型应在对象声明中声明,并且你应该最小化对象实例化,以利于对象重用。实例化对象在小应用程序生命周期中只有一次,最好在小应用程序的初始化阶段,在小应用程序生命周期中只被调用一次的install()方法中。
为了促进对象的重用,对象应该保持在小应用程序的生命周期的范围内或引用中,并且它们的状态(成员变量的值)在重用之前根据情况重置。 因为垃圾收集程序并不总是可用的,一个应用程序可能从不回收分配给不太占用内存的对象的存储器。
持久的事务
JCRE支持原子事务,原子事务安全地更新一个或多个持久对象。如果发生掉电或者程序错误等情况,事务将保护数据的完整性。 事务是在系统级支持的,通过下面的方法:
JCSystem.beginTransaction() JCSystem.commitTransaction() JCSystem.abortTransaction()
在一个为许多事务模型所共用的模式中,一个Java Card事务以对beginTransaction()的调用开始,以对commitTransaction()或者abortTransaction()的调用结束。 让我们来看看使用这些应用程序编程接口的代码片断:
... private short balance; ... JCSystem.beginTransaction(); balance = (short)(balance + creditAmount); JCSystem.commitTransaction(); ...
实例变量balance的更新是为了保证一个原子操作。 如果一个程序错误或者电力重置等事件发生,这个事务就会保证前面的balance值余额被恢复。
JCRE不支持嵌套事务。
|