Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16495732
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:38:50

下载本文示例代码
  一、前言  Java的技术,因为 computing resource的不同,而区分为不同性质的Java平台,如 Enterprise Java、 Embedded Java与 Java Card等。若是以Embedded Java来说,因为功能上的要求有限,并且受限於硬体资源大小(如呼叫器),所以在硬体与Java执行环境上必须有所妥协。Java Card也是基於硬体与应用的 求所开发的技术,目的是使得 Java的技术能够在如同smart card晶片般大小的有限资源下执行。所以,目前Java Card可以说是最小的Java平台。  二、简介  Java Card是Java 平台中最小的 subset,其设定的执行环境为smart card上的晶片或是有严格硬体限制的环境。Java Card的问世,一方面是为了推展Java的应用层次,一方面也是为了将Java平台的特性以及Java Card 的好处带到smart card上,这些好处主要有: 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 版则是在今年刚释出。  三、运作逻辑   如图1所示Java Card实№运作的模式,主要分为二个部分。 图1、 JavaCard运作模式图   第一个部分就是 Java Card这一端,配合CAD(Card Acceptance Device ),也就是图1中的Card Reader来传输、读取Card中的资料,并且供给 Card所 的电源。而JavaCard本身则可以执行applet程式,使得一些敏感的资料与行为能够安全执行而不受外部程式影响。第二部分则是图1右方的 Terminal端,负责提供服务程式及操作介面,并透过CAD 与JavaCard沟通。   另外,在图1中所表示的 APDU(Application Protocol Data Units)即双箭头的部分,则是 terminal与Java Card沟通的格式与协定。由terminal 端传送给Java Card 的APDU称为Command APDU,主要适用来下达指令以及传输资料给Java Card。图2即Command APDU的格式。 图2、 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 applet接收到此一指令时则会先判断 CLA byte是否为 0x80,接著再根据 terminal端所下达的指令来执行,并将Data Field依指令性质取出两个独立的byte来相加。   而由Java Card端回传给terminal端的 APDU则称为 Response APDU,图3则为此APDU之格式。 图4   其栏位所表示的意义分别为: Data Field - return之资料栏位 SW1 - 执行状态参数1 SW2 - 执行状态参数2   所以,利用上述的加法为例,Java Card applet执行後所return的值若为 short value(16-bit integer),则 Response APDU的表示法可能为:   其中Data Field为一short integer(以两个bytes表示),而SW1与SW2所表示的意义(0x9000 )即"success"或是 "no error"的意思。   根据图1的运作模式,若以电子钱包为例,我们一开始会在Java Card上 install一个applet ,负责提款、付帐与维护帐目,当我们 要提款时,必须Java Card放入提款机(Terminal)的Card Reader中,透过提款机的服务程式与介面来提出我们 要的款项,并且通知Java Card 上的applet将这笔款项存入Java Card 的帐目中。如此我们所持有的Java Card就成为一个行动的卡片钱包。若我们 要消费的话(如搭公车、网路购物等),就可以透过相同的逻辑来扣除款项。所以,在诸如此类的消费行为里,我们就可以透过这种简单的读卡动作来达到消费的目的。不同於一般信用卡的是,我们不但能做小额的消费,也省去了付帐的繁杂手续与携带零钱的麻烦。   四、Java Card硬体需求   Java Card有如一部具体而微的电脑,其硬体的规格主要是在於维护Java Card runtime environment的 求,其最小的规格要求为: 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软体架构   在上述的硬体架构中,基本上我们可以将Java Card想像为一部PC的缩影,而Java Card的软体架构则具有OS、 native functions 、JCRE(Java Card Runtime Environment)以及架构在此JCRE上的应用程式(Java Card applets),事实上Java Card的软体架构也是与今日的软体架构相仿,图5即为Java Card之软体架构。 图5 Java Card之软体架构图   在此软体架构中,最底层的OS and Native Functions 是负责低阶的处理工作,如同今日的作业系统。而在上面两层Java Card Interpreter与Java Card APIs and Framework就是我们所谓的JCRE,主要负责执行Java Card applets以及提供 applet执行所 要的环境。而 Industry Add-on Classes则是 service provider 所提供的classes,使得企业与公司能够提供属於自己的服务程式。   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在执行环境上的支援是相当有限的,表即 Java Card执行环境的支援现况,其他详细内容请参考 references。 表 Java Card执行环境之支援 支援 不支援 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-Powered iButton,是Dallas Semiconductor公司的产品,事实上 Java Ring只是Java Card的另外一种型态,Dallas公司将它制作成为钮扣的形状,进而镶嵌在戒指之上,成为一个Java Ring。   因为Java Ring是沿袭Java Card的规格,所以在软体的架构上是相同的。而 Java Ring在Java Card的原有的硬体架构下加强了其原有的结构,并且发展出与Java Card不同的应用层面。  七、Java Card API   Java Card的2.1版总共分为四个 packages,而其内容与重要的物件分述如下: 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中的资讯得以加密保护   八、范例   程式、HelloWorld applet //一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的例子用来介绍基本的Java Card applet的implement 方式。而此 HelloWorld范例程式的执行,是预设由terminal端传来 Command APDU後,此applet并不处理此APDU,而是直接将"HelloWorld"的讯息以APDU的方式直接回传给 terminal端。   一、前言  Java的技术,因为 computing resource的不同,而区分为不同性质的Java平台,如 Enterprise Java、 Embedded Java与 Java Card等。若是以Embedded Java来说,因为功能上的要求有限,并且受限於硬体资源大小(如呼叫器),所以在硬体与Java执行环境上必须有所妥协。Java Card也是基於硬体与应用的 求所开发的技术,目的是使得 Java的技术能够在如同smart card晶片般大小的有限资源下执行。所以,目前Java Card可以说是最小的Java平台。  二、简介  Java Card是Java 平台中最小的 subset,其设定的执行环境为smart card上的晶片或是有严格硬体限制的环境。Java Card的问世,一方面是为了推展Java的应用层次,一方面也是为了将Java平台的特性以及Java Card 的好处带到smart card上,这些好处主要有: 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 版则是在今年刚释出。  三、运作逻辑   如图1所示Java Card实№运作的模式,主要分为二个部分。 图1、 JavaCard运作模式图   第一个部分就是 Java Card这一端,配合CAD(Card Acceptance Device ),也就是图1中的Card Reader来传输、读取Card中的资料,并且供给 Card所 的电源。而JavaCard本身则可以执行applet程式,使得一些敏感的资料与行为能够安全执行而不受外部程式影响。第二部分则是图1右方的 Terminal端,负责提供服务程式及操作介面,并透过CAD 与JavaCard沟通。   另外,在图1中所表示的 APDU(Application Protocol Data Units)即双箭头的部分,则是 terminal与Java Card沟通的格式与协定。由terminal 端传送给Java Card 的APDU称为Command APDU,主要适用来下达指令以及传输资料给Java Card。图2即Command APDU的格式。 图2、 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 applet接收到此一指令时则会先判断 CLA byte是否为 0x80,接著再根据 terminal端所下达的指令来执行,并将Data Field依指令性质取出两个独立的byte来相加。   而由Java Card端回传给terminal端的 APDU则称为 Response APDU,图3则为此APDU之格式。 图4   其栏位所表示的意义分别为: Data Field - return之资料栏位 SW1 - 执行状态参数1 SW2 - 执行状态参数2   所以,利用上述的加法为例,Java Card applet执行後所return的值若为 short value(16-bit integer),则 Response APDU的表示法可能为:   其中Data Field为一short integer(以两个bytes表示),而SW1与SW2所表示的意义(0x9000 )即"success"或是 "no error"的意思。   根据图1的运作模式,若以电子钱包为例,我们一开始会在Java Card上 install一个applet ,负责提款、付帐与维护帐目,当我们 要提款时,必须Java Card放入提款机(Terminal)的Card Reader中,透过提款机的服务程式与介面来提出我们 要的款项,并且通知Java Card 上的applet将这笔款项存入Java Card 的帐目中。如此我们所持有的Java Card就成为一个行动的卡片钱包。若我们 要消费的话(如搭公车、网路购物等),就可以透过相同的逻辑来扣除款项。所以,在诸如此类的消费行为里,我们就可以透过这种简单的读卡动作来达到消费的目的。不同於一般信用卡的是,我们不但能做小额的消费,也省去了付帐的繁杂手续与携带零钱的麻烦。   四、Java Card硬体需求   Java Card有如一部具体而微的电脑,其硬体的规格主要是在於维护Java Card runtime environment的 求,其最小的规格要求为: 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软体架构   在上述的硬体架构中,基本上我们可以将Java Card想像为一部PC的缩影,而Java Card的软体架构则具有OS、 native functions 、JCRE(Java Card Runtime Environment)以及架构在此JCRE上的应用程式(Java Card applets),事实上Java Card的软体架构也是与今日的软体架构相仿,图5即为Java Card之软体架构。 图5 Java Card之软体架构图   在此软体架构中,最底层的OS and Native Functions 是负责低阶的处理工作,如同今日的作业系统。而在上面两层Java Card Interpreter与Java Card APIs and Framework就是我们所谓的JCRE,主要负责执行Java Card applets以及提供 applet执行所 要的环境。而 Industry Add-on Classes则是 service provider 所提供的classes,使得企业与公司能够提供属於自己的服务程式。   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在执行环境上的支援是相当有限的,表即 Java Card执行环境的支援现况,其他详细内容请参考 references。 表 Java Card执行环境之支援 支援 不支援 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-Powered iButton,是Dallas Semiconductor公司的产品,事实上 Java Ring只是Java Card的另外一种型态,Dallas公司将它制作成为钮扣的形状,进而镶嵌在戒指之上,成为一个Java Ring。   因为Java Ring是沿袭Java Card的规格,所以在软体的架构上是相同的。而 Java Ring在Java Card的原有的硬体架构下加强了其原有的结构,并且发展出与Java Card不同的应用层面。  七、Java Card API   Java Card的2.1版总共分为四个 packages,而其内容与重要的物件分述如下: 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中的资讯得以加密保护   八、范例   程式、HelloWorld applet //一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的例子用来介绍基本的Java Card applet的implement 方式。而此 HelloWorld范例程式的执行,是预设由terminal端传来 Command APDU後,此applet并不处理此APDU,而是直接将"HelloWorld"的讯息以APDU的方式直接回传给 terminal端。 下载本文示例代码


J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述J2EE概述
阅读(127) | 评论(0) | 转发(0) |
0

上一篇:全面实践JNDI技术

下一篇:初识JINI技术

给主人留下些什么吧!~~