JAVA card 应用开发(七) JAVA 卡数据(永久数据/临时数据)

JAVA 卡对象

JAVA CARD 的存储器件:

a.      ROM: 永久保存程序和数据,虚拟机,API等;(Applets也可以放这里)

b.      RAM: 栈数据,临时对象;

c.      EEPROM: Applet的类,长生命周期的数据;(写操作比RAM慢1000倍)

因此,ROM是存放JCRE的基本程序和数据,而RAM用于保存当前会话需要的临时数据,EEPRO就用于保存跨会话的数据。

下面分别描述:

1.      ROM:

掩膜的时候,把这块的数据固定下来,伴随整个卡片的生命周期不改变。除非把Applets保存到这个区域。

2.      RAM:

Applet运行过程中保存的临时数据、数组和对象。临时数据就是栈数据,程序运行过程中的中间数据,而临时对象,则没那么简单。临时对象并不是对象是临时的,而是对象的数据是临时的,一个Applet在生命期对一个临时对象只建立一次,而且把该对象的引用保存在一个永久域里。只有具有基本类型成分的数组或具有对象引用类型成分的数据,才是临时的,这里面就包括临时数组和临时对象。

临时对象是通过API建立的,数据不能跨过两个CAD sessions,对于一个域的修改不是原子型的。

临时对象的属性使之对于少量的,要经常修改的,但无需在CAD sessions间保留的临时applet数据是很理想的对象。有两种类型的临时数据对象,即CLEAR_ON_RESET 和CLEAR_ON_DESELECT。注意当定义为CLEAR_ON_DESELECT,卡片复位的时候,该临时对象的数据也会被清空。

建立类JCSystem中的临时数组的方法

方法                                         方法调用的结果

Public static boolean[]

MakeTransientBooleanArray(short length,byte event)   建立一个临时布尔数组

Public static byte[]

MakeTransientByteArray(short length,byte event)       建立一个临时字节数组

Public static short[]

MakeTransientShortArray(short length,byte event)       建立一个临时short数组

Public static object[]

MakeTransientObjectArray(short length,byte event)       建立一个临时对象数组

3.      EEPROM:

使用NEW操作符号建立;可以跨CAD sessions保持不变;对于单一域的修改是原子型的;可以被临时对象引用,也可以引用临时对象。

前面就三种存储器的类型分别讨论如何使用,实际上对于应用开发,只用到ROM和EEPROM,也就是临时数据和永久数据的区别,最重要的点就是建立的方法不一样,一个是API建立,一个直接new。所以,我们得到一个对象,有可能是通过API建立的,也可能是NEW的,这个时候,我们可以通过:public static byte isTransient(ObjecttheObject)的返回值判断是:CLEAR_ON_RESET 或CLEAR_ON_DESELECT或JCSystem.NOT_A_TRANSIENT_OBJECT指出该对象的属性,可以知道该对象保存在什么地方。

关于优化:

智能卡的资源是非常有限的,不能无限制或者杂乱无章地new或者申请临时数据,否则很容易因为不够空间而抛出异常。因为数据通过new或者API申请空间后,释放(requestObjectDeletion)速度很慢,甚至有可能卡片不支持垃圾回收机制。

参考书籍:《java card for smart card》

说明:《JAVA card 应用开发》系列博文是我在学习Java卡过程中的记录,有不对的地方,请指出。

JAVA card 应用开发(七) JAVA 卡数据(永久数据/临时数据)

时间: 2024-08-26 12:18:50

JAVA card 应用开发(七) JAVA 卡数据(永久数据/临时数据)的相关文章

JAVA card 应用开发(六) 个人化数据的线路安全和数据安全

卡片个人化数据的线路安全和数据安全 说明:以下理论,基于GP2.2规范. 一.线路安全 1. 概念:线路安全,就是对于数据不保密,但要保证数据的完整性和防止被篡改. 2. 方法:在原有的数据基础上,加上8个字节的MAC. 3. 过程: a.在外部认证指令中,设定安全级别.如图1. 图1 b.计算8个字节的MAC附加在后面即可.计算MAC需要注意:完成了外部认证后,除了选择应用的指令以外,都需要加入MAC,否则安全条件不满足.计算MAC以8个字节的0X00为计算的初始向量,输入数据为8个历史字节(

JAVA card 应用开发(九)APDU脚本命令中MAC的校验

终端从后台接收到71或72脚本,解析出脚本指令,发给卡片. 卡片执行该脚本指令,首先要验证MAC,MAC验证通过,才真正执行脚本.因为脚本一般都是更新数据,锁定/解锁应用等敏感操作,所以必须有MAC进行保护. MAC数据计算的大致过程为: 发卡行有主密钥.在发卡的时候,发卡行把主密钥根据卡号分散,卡片得到分散密钥.交易过程中,发卡行接收到包含卡号的交易数据,通过主密钥,根据卡号得到分散密钥,根据ATC和分散密钥,得到过程密钥,使用过程密钥加密数据,得到MAC.而卡片本身已经存储有分散密钥,在交易

JAVA card 应用开发 JCOP的调试方法

本文讲述如何在仿真环境下,调试JAVA card 的APPLET. 通过JCOP在Eclipse进行仿真调试,启动JCOP调试器,我们可以看到如下图: 要仿真调试,就是在命令输入框里面输入JCOP相关的指令,通过阅读JCOP的帮助文档,我们看到JCOP提供的命令不算繁多,大约40个. 下面我挑选常用的几个来说明: 1.      复位卡片:"/atr",如果不加任何参数,表示立即复位. 2.      发送指令:"/send",这是最直观的调试指令.可以逐个指令发送

JAVA card 应用开发 创建第一个APPLET

本文讲述在Eclipse环境下,如何创建一个Java卡的项目,新建一个APPLET,运行在Java卡片上. 在建立项目前,必须安装好环境:先下载一个Eclipse,然后安装JCOP即可.(JCOP的下载,需要与NXP签订协议才能拿到安装文件,当然网上可能找到别的版本,这里不讨论).安装次序:安装好Eclipse,然后安装JCOP,然后导入JCOP的授权文件.也可以参考下面这篇文章: 环境搭建:http://blog.csdn.net/menghnhhuan/article/details/761

JAVA card 应用开发(二) 在项目添加APPLET

在上篇博文中.<JAVA card 应用开发创建第一个APPLET>.介绍了一个项目从无到有. 那么.我们建立了这个项目后,仅仅有一个应用(一个可选AID),假设我希望这个项目能够有多个应用(有多个AID可选).就类似卡片初始化后.我能够选择PSE.能够选择PPSE,并且有多个AID存在,那么怎么在项目中加入AID呢? 1.      在已有的项目名称,右键.选择"New",再选择"Java card Applet".例如以下图1. watermark/

JAVA card 应用开发 在项目增加APPLET

在上篇博文中,<JAVA card 应用开发创建第一个APPLET>,介绍了一个项目从无到有. 那么,我们建立了这个项目后,只有一个应用(一个可选AID),如果我希望这个项目可以有多个应用(有多个AID可选),就类似卡片初始化后,我可以选择PSE,可以选择PPSE,而且有多个AID存在,那么怎么在项目中添加AID呢? 1.      在已有的项目名称,右键,选择"New",再选择"Java card Applet",如下图1. 图1. 新建Applet

JAVA card 应用开发 把APPLET(CAP文件)装载到卡片

根据前面两篇博文,我们可以在Eclipse上建立好Applet,并且可以有多个AID,可以选择不同的应用. 那么,以上我们都是基于模拟环境的逻辑,实际上有些函数接口是需要实际的环境,就是说我们需要把Applet下载到卡片里面,实际去调试. 下载Applet的工具,我使用JCOP,JCOP提供了很方便的下载工具,如下图1. 图1.JCOP下载Applet的工具栏 第一步:连接读卡器. 点击这个,下拉选择你的读卡器. 第二步:复位,选择,认证. 点击这个,下拉选择"Default".如果是

Java Card Applet开发:OO还是C-style?

近日又在重构PBOC 2.0的EDEP,按客户的需求改了几十个细节. 改动过程中对面向对象的理解有点加深. 例如为了避免两个class相互依赖,可以用一个Interface居中作为解耦. 由于卡内空间有限,资源紧缺,在设计时应注意避免继承层次过深. 个人感觉,由于资源有限,不大可能大量应用各种设计模式. JAVACARD API中比较显眼的设计模式只有两个:单例模式.Builder模式. 这两个模式的应用也是为了节约资源,以及为applet开发者屏蔽底层硬件细节. 上海有一家芯片公司,曾经试图研

JAVA card 应用开发(五) JCOP的调试方法

本文讲述怎样在仿真环境下,调试JAVA card 的APPLET. 通过JCOP在Eclipse进行仿真调试,启动JCOP调试器.我们能够看到例如以下图: 要仿真调试,就是在命令输入框里面输入JCOP相关的指令,通过阅读JCOP的帮助文档,我们看到JCOP提供的命令不算繁多,大约40个. 以下我挑选经常使用的几个来说明: 1.      复位卡片:"/atr".假设不加不论什么參数,表示马上复位. 2.      发送指令:"/send",这是最直观的调试指令. 能