Java的技術(shù),因為 computing resource的不同,而區(qū)分為不同性質(zhì)的Java平臺,如 Enterprise Java、 Embedded Java與 Java Card等。若是以Embedded Java來說,因為功能上的要求有限,并且受限於硬體資源大?。ㄈ绾艚衅鳎?,所以在硬體與Java執(zhí)行環(huán)境上必須有所妥協(xié)。Java Card也是基於硬體與應(yīng)用的 求所開發(fā)的技術(shù),目的是使得 Java的技術(shù)能夠在如同smart card晶片般大小的有限資源下執(zhí)行。所以,目前Java Card可以說是最小的Java平臺。 Java Card是Java 平臺中最小的 subset,其設(shè)定的執(zhí)行環(huán)境為smart card上的晶片或是有嚴格硬體限制的環(huán)境。Java Card的問世,一方面是為了推展Java的應(yīng)用層次,一方面也是為了將Java平臺的特性以及Java Card 的好處帶到smart card上,這些好處主要有: - Platform-Indep endent:使得 Java Card applets (在Java Card上執(zhí)行的程式)能夠在不同卡片的JCAE( Java Card Application Environment)上執(zhí)行,即透過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標準)以及工業(yè)界標準如 Europay/Master Card/Visa (EMV)相容。
所以,在未來Java Card不但能夠取代今日Smart Card的功能,更能夠發(fā)展出多樣化的應(yīng)用,如身份識別、醫(yī)療資訊記錄、電子錢包、門禁管控等,甚至能將許多不同的應(yīng)用程式集合於一張卡上,使得這些隨身的軟體能夠更小更實用。 JavaCard現(xiàn)行的版本有2.0與2.1版,其中2.0版是在1997 年底所釋出,而2.1 版則是在今年剛釋出。 如圖3-1所示Java Card實№運作的模式,主要分為二個部分。 第一個部分就是 Java Card這一端,配合CAD(Card Acceptance Device ),也就是圖3-1中的Card Reader來傳輸、讀取Card中的資料,并且供給 Card所 的電源。而JavaCard本身則可以執(zhí)行applet程式,使得一些敏感的資料與行為能夠安全執(zhí)行而不受外部程式影響。第二部分則是圖3-1右方的 Terminal端,負責提供服務(wù)程式及操作介面,并透過CAD 與JavaCard溝通。 另外,在圖3-1中所表示的 APDU(Application Protocol Data Units)即雙箭頭的部分,則是 terminal與Java Card溝通的格式與協(xié)定。由terminal 端傳送給Java Card 的APDU稱為Command APDU,主要適用來下達指令以及傳輸資料給Java Card。圖二即Command APDU的格式。 其欄位所表示的意義分別為: - CLA - Class Byte,用於識別applet
- INS - Instruction Byte ,下達給applet之指令
例如,terminal要下達兩個byte相加的加法指令(INS= 0x01)給applet( CLA=0x80)時, Command APDU的寫法可能為: 而當Java Card applet接收到此一指令時則會先判斷 CLA byte是否為 0x80,接著再根據(jù) terminal端所下達的指令來執(zhí)行,并將Data Field依指令性質(zhì)取出兩個獨立的byte來相加。 而由Java Card端回傳給terminal端的 APDU則稱為 Response APDU,圖 3-3則為此APDU之格式。 其欄位所表示的意義分別為: - SW1 - 執(zhí)行狀態(tài)參數(shù)1
- SW2 - 執(zhí)行狀態(tài)參數(shù)2
所以,利用上述的加法為例,Java Card applet執(zhí)行後所return的值若為 short value(16-bit integer),則 Response APDU的表示法可能為: 其中Data Field為一short integer(以兩個bytes表示),而SW1與SW2所表示的意義(0x9000 )即"success"或是 "no error"的意思。 根據(jù)圖3-1的運作模式,若以電子錢包為例,我們一開始會在Java Card上 install一個applet ,負責提款、付帳與維護帳目,當我們 要提款時,必須Java Card放入提款機(Terminal)的Card Reader中,透過提款機的服務(wù)程式與介面來提出我們 要的款項,并且通知Java Card 上的applet將這筆款項存入Java Card 的帳目中。如此我們所持有的Java Card就成為一個行動的卡片錢包。若我們 要消費的話(如搭公車、網(wǎng)路購物等),就可以透過相同的邏輯來扣除款項。所以,在諸如此類的消費行為里,我們就可以透過這種簡單的讀卡動作來達到消費的目的。不同於一般信用卡的是,我們不但能做小額的消費,也省去了付帳的繁雜手續(xù)與攜帶零錢的麻煩。 Java Card有如一部具體而微的電腦,其硬體的規(guī)格主要是在於維護Java Card runtime environment的 求,其最小的規(guī)格要求為: - 512 bytes RAM:主要用於存放程式執(zhí)行時的 stack、暫存資料以及做為I/O的緩沖區(qū)。
- 24 KB ROM :主要用於存放系統(tǒng)的程式以及 Runtime Environment,如 JVM、applets、 native functions 等。
- 8 KB EEPROM:用於儲存我們所下載至 Java Card的 applets,并且做為 object heap存放之處。
- 8-bit processor: Java Card必須至少支援8位元的處理器。
在上述的硬體架構(gòu)中,基本上我們可以將Java Card想像為一部PC的縮影,而Java Card的軟體架構(gòu)則具有OS、 native functions 、JCRE(Java Card Runtime Environment)以及架構(gòu)在此JCRE上的應(yīng)用程式(Java Card applets),事實上Java Card的軟體架構(gòu)也是與今日的軟體架構(gòu)相仿,圖5-1即為Java Card之軟體架構(gòu)。 | 圖5-1 Java Card之軟體架構(gòu)圖 | 在此軟體架構(gòu)中,最底層的OS and Native Functions 是負責低階的處理工作,如同今日的作業(yè)系統(tǒng)。而在上面兩層Java Card Interpreter與Java Card APIs and Framework就是我們所謂的JCRE,主要負責執(zhí)行Java Card applets以及提供 applet執(zhí)行所 要的環(huán)境。而 Industry Add-on Classes則是 service provider 所提供的classes,使得企業(yè)與公司能夠提供屬於自己的服務(wù)程式。 Java Card的最上層就是所謂的Java Card applets,就如圖5-1所示,一個 Java Card可以執(zhí)行多個Java Card applets,但是要特別注意,Java Card 的執(zhí)行環(huán)境并無支援Multi-thread,所以一次只能執(zhí)行一個applet,并且 applet與applet之間也有firewall的阻隔。盡管如此,在Java Card的設(shè)計之中亦有讓不同的 applets相互溝通的機制,我們只 要讓applet implement javacard.framewor k.Shareable interface就能夠分享applet 的 resource。 因為受限於體積與 resource,所以 Java Card在執(zhí)行環(huán)境上的支援是相當有限的,表5-1即 Java Card執(zhí)行環(huán)境的支援現(xiàn)況,其他詳細內(nèi)容請參考 references。 表5-1 Java Card執(zhí)行環(huán)境之支援 支援 | 不支援 | 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-Powered iButton,是Dallas Semiconductor公司的產(chǎn)品,事實上 Java Ring只是Java Card的另外一種型態(tài),Dallas公司將它制作成為鈕扣的形狀,進而鑲嵌在戒指之上,成為一個Java Ring。 因為Java Ring是沿襲Java Card的規(guī)格,所以在軟體的架構(gòu)上是相同的。而 Java Ring在Java Card的原有的硬體架構(gòu)下加強了其原有的結(jié)構(gòu),并且發(fā)展出與Java Card不同的應(yīng)用層面。詳細的資料請參考[3] 。 Java Card的2.1版總共分為四個 packages,而其內(nèi)容與重要的物件分述如下: - 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所使用的常數(shù)值
- 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來識別或選擇我們所要執(zhí)行的applet
- APDU class - 是屬於 JCRE的物件,是藉由maintain一個 byte array buffer 來接收與傳送 terminal端的指令與回傳applet執(zhí)行的結(jié)果與狀態(tài)的標準格式
- Applet class - 每一個 Java Card applet 都必須繼承在此 class之下。其中在 implement時要特別注意幾個methods,如select、 deselect是當 terminal端跟據(jù) applet的AID下達 select或deselect 此applet的指令時,由JCRE來啟動的 methods。而 install與register 則是applet下載至 Java Card安裝并向 JCRE注冊之methods 。等到applet安裝注冊完成,并且被 terminal所select 時,所有下達的 APDU command接會交由applet的 process method來處理并負責回傳結(jié)果
- JCSystem class - 負責管理 applet與Java Card 的系統(tǒng)資源,如AID 與Transaction的管理
- OwnerPIN class - 繼承自PIN interface,負責 maintain卡片持有人的PIN number,并提供相關(guān)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做數(shù)位簽章之object
- javacardx.cryp to package:其中包含了關(guān)於加密與安全的物件,并且有美國的出口限制,而此package 僅包含了一個 interface與一個 abstract class:
- Cipher abstract class - 使得在Java Card中的資訊得以加密保護
程式8-1 HelloWorld applet //一applet必須要屬於一packagepackage samples.HelloWorld; import javacard.framework.*; //imoprt必要的packagepublic 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所要的參數(shù)*/ 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的資料設(shè)為"寫出",并直接傳送出去 apdu.setOutgoingAndSend((short)0, (short)echoBytes.length); }} | 以上是一個 HelloWorld的例子(程式8-1)用來介紹基本的Java Card applet的implement 方式。而此 HelloWorld范例程式的執(zhí)行,是預設(shè)由terminal端傳來 Command APDU後,此applet并不處理此APDU,而是直接將"HelloWorld"的訊息以APDU的方式直接回傳給 terminal端。 -
- [1] "Java Card 2.0 Reference Implementation," htt p://www.javasoft. com.
- [2] "Java Card 2.1 Reference Implementation," htt p://www.javasoft. com
- [3] http://ibutton.com.tw/
|