Java Card介绍
2014-04-09 09:36
162 查看
一、前言 |
二、简介 |
Platform-Indep endent:使得 Java Card applets (在Java Card上执行的程式)能够在不同卡片的JCAE( Java Card Application Environment)上执行,即透过Java VM 的机制来达到跨平台的能力。
Multi-Applicat ion Capable:在同一个Java Card 中能够存放多个 Java Card applets ,并且也能够透过 download的方式来下载必要的applets 而达到一卡多用途的好处,使得卡的使用能够更有弹性。
Compatible with Existing Smart Card Standards: Java Card能与国№ 标准ISO 7816( Smart Card标准)以及工业界标准如 Europay/Master Card/Visa (EMV)相容。
所以,在未来Java Card不但能够取代今日Smart Card的功能,更能够发展出多样化的应用,如身份识别、医疗资讯记录、电子钱包、门禁管控等,甚至能将许多不同的应用程式集合於一张卡上,使得这些随身的软体能够更小更实用。
JavaCard现行的版本有2.0与2.1版,其中2.0版是在1997 年底所释出,而2.1 版则是在今年刚释出。
三、运作逻辑 |
![]() |
图3-1、 JavaCard运作模式图 |
另外,在图3-1中所表示的 APDU(Application Protocol Data Units)即双箭头的部分,则是 terminal与Java Card沟通的格式与协定。由terminal 端传送给Java Card 的APDU称为Command APDU,主要适用来下达指令以及传输资料给Java Card。图二即Command APDU的格式。
![]() |
图二、 Command APDU格式 |
CLA - Class Byte,用於识别applet
INS - Instruction Byte ,下达给applet之指令
P1 - 第一个指令参数
P2 - 第二个指令参数
Lc - Data Field之长度
Data Field - 资料栏位
Le - 回传资料之长度
例如,terminal要下达两个byte相加的加法指令(INS= 0x01)给applet( CLA=0x80)时, Command APDU的写法可能为:
![]() |
而由Java Card端回传给terminal端的 APDU则称为 Response APDU,图 3-3则为此APDU之格式。
![]() |
Data Field - return之资料栏位
SW1 - 执行状态参数1
SW2 - 执行状态参数2
所以,利用上述的加法为例,Java Card applet执行後所return的值若为 short value(16-bit integer),则 Response APDU的表示法可能为:
![]() |
根据图3-1的运作模式,若以电子钱包为例,我们一开始会在Java Card上 install一个applet ,负责提款、付帐与维护帐目,当我们 要提款时,必须Java Card放入提款机(Terminal)的Card Reader中,透过提款机的服务程式与介面来提出我们 要的款项,并且通知Java Card 上的applet将这笔款项存入Java Card 的帐目中。如此我们所持有的Java Card就成为一个行动的卡片钱包。若我们 要消费的话(如搭公车、网路购物等),就可以透过相同的逻辑来扣除款项。所以,在诸如此类的消费行为里,我们就可以透过这种简单的读卡动作来达到消费的目的。不同於一般信用卡的是,我们不但能做小额的消费,也省去了付帐的繁杂手续与携带零钱的麻烦。
四、Java Card硬体需求 |
512 bytes RAM:主要用於存放程式执行时的 stack、暂存资料以及做为I/O的缓冲区。
24 KB ROM :主要用於存放系统的程式以及 Runtime Environment,如 JVM、applets、 native functions 等。
8 KB EEPROM:用於储存我们所下载至 Java Card的 applets,并且做为 object heap存放之处。
8-bit processor: Java Card必须至少支援8位元的处理器。
五、Java Card软体架构 |
![]() |
图5-1 Java Card之软体架构图 |
Java Card的最上层就是所谓的Java Card applets,就如图5-1所示,一个 Java Card可以执行多个Java Card applets,但是要特别注意,Java Card 的执行环境并无支援Multi-thread,所以一次只能执行一个applet,并且 applet与applet之间也有firewall的阻隔。尽管如此,在Java Card的设计之中亦有让不同的 applets相互沟通的机制,我们只 要让applet implement javacard.framewor k.Shareable
interface就能够分享applet 的 resource。
因为受限於体积与 resource,所以 Java Card在执行环境上的支援是相当有限的,表5-1即 Java Card执行环境的支援现况,其他详细内容请参考 references。
支援 | 不支援 |
boolean、byte、 short、int | float、double、 long、char、 Strings |
Dynamic Object Creation | Dynamic Class Loading |
Arrays | Security Manager |
Virtual mehtods | Garbage Collectioin & Finalization |
Dynamic allocation | Threads |
Packages | Cloning |
Exceptions | Multi-dimentional arrays |
Interfaces |
六、Java Ring |
因为Java Ring是沿袭Java Card的规格,所以在软体的架构上是相同的。而 Java Ring在Java Card的原有的硬体架构下加强了其原有的结构,并且发展出与Java Card不同的应用层面。详细的资料请参考[3] 。
七、Java Card API |
javacard.lang package:提供 Java language重要的classes,如 Object物件,因为所有的Java物件皆继承其下。
Object class - root of class hierarchy
Throwable class - 为所有 error及exception 的superclass,这亦表示Java Card支援exception
javacard.frame work package :是Java Card API 主要的core package,提供了实做Java Card applet基本的物件与工具。
IOS7816 abstract interface - 提供了ISO7816所使用的常数值
PIN abstract interface - 使其 subclass能透过此一介面能够做check PIN number及验证 PIN是否为validate 等功能
Shareable abstract interface - 使得不同的applets能够透过implement此介面来达到互相沟通的功能
AID class - AID(Application Identifier)是用来唯一表示Java Card applet的number,使得JCRE能够透过一个AID table来识别或选择我们所要执行的applet
APDU class - 是属於 JCRE的物件,是藉由maintain一个 byte array buffer 来接收与传送 terminal端的指令与回传applet执行的结果与状态的标准格式
Applet class - 每一个 Java Card applet 都必须继承在此 class之下。其中在 implement时要特别注意几个methods,如select、 deselect是当 terminal端跟据 applet的AID下达 select或deselect 此applet的指令时,由JCRE来启动的 methods。而 install与register 则是applet下载至 Java Card安装并向 JCRE注册之methods 。等到applet安装注册完成,并且被 terminal所select
时,所有下达的 APDU command接会交由applet的 process method来处理并负责回传结果
JCSystem class - 负责管理 applet与Java Card 的系统资源,如AID 与Transaction的管理
OwnerPIN class - 继承自PIN interface,负责 maintain卡片持有人的PIN number,并提供相关check与 update等methods
Util class - 是一个提供常用工具的class ,如byte array copy与compare等
javacard.secur ity package:提供安全机制与物件的package,其中几个重要的 interface与class 如下:
Key abstract interface - 是 DESKey、 PrivateKey、 PublicKey等 interface的共同介面
KeyBuilde r class - 是一个 create各种安全的 key的factory
MessageDi gest class - 是一个可以将message做数位签章之object
javacardx.cryp to package:其中包含了关於加密与安全的物件,并且有美国的出口限制,而此package 仅包含了一个 interface与一个 abstract class:
Cipher abstract class - 使得在Java Card中的资讯得以加密保护
八、范例 |
//一applet必须要属於一package package samples.HelloWorld; import javacard.framework.*; //imoprt必要的package public class HelloWorld extends Applet { //此echoBytes array为"HelloWorld"的16进位表示法 private static final byte echoBytes[] = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64}; //applet constructor protected HelloWorld(APDU apdu) { //在applet initiate时向JCRE注册 register(); } /*当applet下载至Java Card时,则会启动install method来安装applet,并传入 applet install所要的参数*/ public static void install( byte[] bArray, short bOffset, byte bLength ) { //initiate HelloWorld applets new HelloWorld(null); } public void process(APDU apdu) throws ISOException { //处理terminal端的APDU指令 byte buffer[] = apdu.getBuffer(); //取得APDU之buffer //将echoBytes,及"HelloWorld"byte自串copy至APDU的buffer Util.arrayCopyNonAtomic(echoBytes, (short)0, buffer, (short)0, (short)echoBytes.length); //将APDU buffer的资料设为"写出",并直接传送出去 apdu.setOutgoingAndSend((short)0, (short)echoBytes.length); } } |
以上是一个 HelloWorld的例子(程式8-1)用来介绍基本的Java Card applet的implement 方式。而此 HelloWorld范例程式的执行,是预设由terminal端传来 Command APDU後,此applet并不处理此APDU,而是直接将"HelloWorld"的讯息以APDU的方式直接回传给 terminal端。
九、参考资料 |
相关文章推荐
- ARP欺骗原理详细介绍
- https介绍
- BizTalk Server 2009 介绍
- LINUX服务介绍
- DM9000寄存器功能详细介绍,DM9000AEP
- oracle sql developer 介绍
- 理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍
- 介绍一个MonoTouch开发的伦敦官方城市指南应用
- 物联网简单介绍
- Solr介绍
- Java关键字介绍之static
- Unity 2D Animation 介绍 & FAQ(持续更新)
- QT中PRO文件写法的详细介绍
- 光流Optical Flow介绍与OpenCV实现
- DLNA介绍(包括UPnP,2011/6/20 更新)
- 如何高效的向新手程序员们介绍编程语言?
- Apple Watch 开发介绍 1.2 简介 配置Xcode工程
- PHP可变长函数方法介绍
- 简单介绍CGlib-打造无入侵的类代理
- [FMS]FMS5.0流媒体服务器配置文件Application.xml介绍