隨筆-62  評(píng)論-29  文章-0  trackbacks-0
          一、前言

          Java的技術(shù),因?yàn)?computing resource的不同,而區(qū)分為不同性質(zhì)的Java平臺(tái),如 Enterprise Java、 Embedded Java與 Java Card等。若是以Embedded Java來說,
          因?yàn)楣δ苌系囊笥邢蓿⑶沂芟揿队搀w資源大小(如呼叫器),所以在硬體與Java執(zhí)行環(huán)境上必須有所妥協(xié)。Java Card也是基於硬體與應(yīng)用的 
          求所開發(fā)的技術(shù),目的是使得 Java的技術(shù)能夠在如同smart card晶片般大小的有限資源下執(zhí)行。所以,目前Java Card可以說是最小的Java平臺(tái)。

          二、簡介

          Java Card是Java 平臺(tái)中最小的 subset,其設(shè)定的執(zhí)行環(huán)境為smart card上的晶片或是有嚴(yán)格硬體限制的環(huán)境。Java Card的問世,一方面是為了推展Java的應(yīng)用層
          次,一方面也是為了將Java平臺(tái)的特性以及Java Card 的好處帶到smart card上,這些好處主要有:

          • Platform-Indep endent:使得 Java Card applets (在Java Card上執(zhí)行的程式)能夠在不同卡片的JCAE( Java Card Application Environment)上執(zhí)行,
          • 即透過Java VM 的機(jī)制來達(dá)到跨平臺(tái)的能力。
          • Multi-Applicat ion Capable:在同一個(gè)Java Card 中能夠存放多個(gè) Java Card applets ,并且也能夠透過 download的方式來下載必要的applets 而達(dá)到一卡多用途的好處,使得卡的使用能夠更有彈性。
          • Compatible with Existing Smart Card Standards: Java Card能與國№ 標(biāo)準(zhǔn)ISO 7816( Smart Card標(biāo)準(zhǔn))以及工業(yè)界標(biāo)準(zhǔn)如 Europay/Master Card/Visa (EMV)相容。

          所以,在未來Java Card不但能夠取代今日Smart Card的功能,更能夠發(fā)展出多樣化的應(yīng)用,如身份識(shí)別、醫(yī)療資訊記錄、電子錢包、門禁管控等,
          甚至能將許多不同的應(yīng)用程式集合於一張卡上,使得這些隨身的軟體能夠更小更實(shí)用。

          JavaCard現(xiàn)行的版本有2.0與2.1版,其中2.0版是在1997 年底所釋出,而2.1 版則是在今年剛釋出。

          三、運(yùn)作邏輯

          如圖3-1所示Java Card實(shí)№運(yùn)作的模式,主要分為二個(gè)部分。

          圖3-1、 JavaCard運(yùn)作模式圖

          第一個(gè)部分就是 Java Card這一端,配合CAD(Card Acceptance Device ),也就是圖3-1中的Card Reader來傳輸、讀取Card中的資料,并且供給 Card所 
          的電源。而JavaCard本身則可以執(zhí)行applet程式,使得一些敏感的資料與行為能夠安全執(zhí)行而不受外部程式影響。第二部分則是圖3-1右方的 Terminal端,
          負(fù)責(zé)提供服務(wù)程式及操作介面,并透過CAD 與JavaCard溝通。

          另外,在圖3-1中所表示的 APDU(Application Protocol Data Units)即雙箭頭的部分,則是 terminal與Java Card溝通的格式與協(xié)定。由terminal 端傳送給Java Card 的APDU稱為Command APDU,主要適用來下達(dá)指令以及傳輸資料給Java Card。圖二即Command APDU的格式。

          圖二、 Command APDU格式

          其欄位所表示的意義分別為:

          • CLA - Class Byte,用於識(shí)別applet
          • INS - Instruction Byte ,下達(dá)給applet之指令
          • P1 - 第一個(gè)指令參數(shù)
          • P2 - 第二個(gè)指令參數(shù)
          • Lc - Data Field之長度
          • Data Field - 資料欄位
          • Le - 回傳資料之長度

          例如,terminal要下達(dá)兩個(gè)byte相加的加法指令(INS= 0x01)給applet( CLA=0x80)時(shí), Command APDU的寫法可能為:

          而當(dāng)Java Card applet接收到此一指令時(shí)則會(huì)先判斷 CLA byte是否為 0x80,接著再根據(jù) terminal端所下達(dá)的指令來執(zhí)行,并將Data Field依指令性質(zhì)取出兩個(gè)獨(dú)立
          的byte來相加。

          而由Java Card端回傳給terminal端的 APDU則稱為 Response APDU,圖 3-3則為此APDU之格式。

          其欄位所表示的意義分別為:

          • Data Field - return之資料欄位
          • 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(以兩個(gè)bytes表示),而SW1與SW2所表示的意義(0x9000 )即"success"或是 "no error"的意思。

          根據(jù)圖3-1的運(yùn)作模式,若以電子錢包為例,我們一開始會(huì)在Java Card上 install一個(gè)applet ,負(fù)責(zé)提款、付帳與維護(hù)帳目,當(dāng)我們 要提款時(shí),必須Java Card放入提款機(jī)(Terminal)的Card Reader中,透過提款機(jī)的服務(wù)程式與介面來提出我們 要的款項(xiàng),并且通知Java Card 上的applet將這筆款項(xiàng)存入Java Card 的帳目中。如此我們所持有的Java Card就成為一個(gè)行動(dòng)的卡片錢包。若我們 要消費(fèi)的話(如搭公車、網(wǎng)路購物等),就可以透過相同的邏輯來扣除款項(xiàng)。所以,在諸如此類的消費(fèi)行為里,我們就可以透過這種簡單的讀卡動(dòng)作來達(dá)到消費(fèi)的目的。不同於一般信用卡的是,我們不但能做小額的消費(fèi),也省去了付帳的繁雜手續(xù)與攜帶零錢的麻煩。

          四、Java Card硬體需求

          Java Card有如一部具體而微的電腦,其硬體的規(guī)格主要是在於維護(hù)Java Card runtime environment的 求,其最小的規(guī)格要求為:

          • 512 bytes RAM:主要用於存放程式執(zhí)行時(shí)的 stack、暫存資料以及做為I/O的緩沖區(qū)。
          • 24 KB ROM :主要用於存放系統(tǒng)的程式以及 Runtime Environment,如 JVM、applets、 native functions 等。
          • 8 KB EEPROM:用於儲(chǔ)存我們所下載至 Java Card的 applets,并且做為 object heap存放之處。
          • 8-bit processor: Java Card必須至少支援8位元的處理器。
          五、Java Card軟體架構(gòu)

          在上述的硬體架構(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),事實(shí)上Java Card的軟體架構(gòu)也是與今日的軟體架構(gòu)相仿,圖5-1即為Java Card之軟體架構(gòu)。

          圖5-1 Java Card之軟體架構(gòu)圖

          在此軟體架構(gòu)中,最底層的OS and Native Functions 是負(fù)責(zé)低階的處理工作,如同今日的作業(yè)系統(tǒng)。而在上面兩層Java Card Interpreter與Java Card APIs and Framework就是我們所謂的JCRE,主要負(fù)責(zé)執(zhí)行Java Card applets以及提供 applet執(zhí)行所 要的環(huán)境。而 Industry Add-on Classes則是 service provider 所提供的classes,使得企業(yè)與公司能夠提供屬於自己的服務(wù)程式。

          Java Card的最上層就是所謂的Java Card applets,就如圖5-1所示,一個(gè) Java Card可以執(zhí)行多個(gè)Java Card applets,但是要特別注意,Java Card 的執(zhí)行環(huán)境并無支援Multi-thread,所以一次只能執(zhí)行一個(gè)applet,并且 applet與applet之間也有firewall的阻隔。盡管如此,在Java Card的設(shè)計(jì)之中亦有讓不同的 applets相互溝通的機(jī)制,我們只 要讓applet implement javacard.framewor k.Shareable interface就能夠分享applet 的 resource。

          因?yàn)槭芟揿扼w積與 resource,所以 Java Card在執(zhí)行環(huán)境上的支援是相當(dāng)有限的,表5-1即 Java Card執(zhí)行環(huán)境的支援現(xiàn)況,其他詳細(xì)內(nèi)容請(qǐng)參考 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 Ring又名 Java-Powered iButton,是Dallas Semiconductor公司的產(chǎn)品,事實(shí)上 Java Ring只是Java Card的另外一種型態(tài),Dallas公司將它制作成為鈕扣的形狀,進(jìn)而鑲嵌在戒指之上,成為一個(gè)Java Ring。

          因?yàn)镴ava Ring是沿襲Java Card的規(guī)格,所以在軟體的架構(gòu)上是相同的。而 Java Ring在Java Card的原有的硬體架構(gòu)下加強(qiáng)了其原有的結(jié)構(gòu),并且發(fā)展出與Java Card不同的應(yīng)用層面。詳細(xì)的資料請(qǐng)參考[3] 。

          七、Java Card API

          Java Card的2.1版總共分為四個(gè) packages,而其內(nèi)容與重要的物件分述如下:

          • javacard.lang package:提供 Java language重要的classes,如 Object物件,因?yàn)樗械腏ava物件皆繼承其下。
            • Object class - root of class hierarchy
            • Throwable class - 為所有 error及exception 的superclass,這亦表示Java Card支援exception
          • javacard.frame work package :是Java Card API 主要的core package,提供了實(shí)做Java Card applet基本的物件與工具。
            • IOS7816 abstract interface - 提供了ISO7816所使用的常數(shù)值
            • PIN abstract interface - 使其 subclass能透過此一介面能夠做check PIN number及驗(yàn)證 PIN是否為validate 等功能
            • Shareable abstract interface - 使得不同的applets能夠透過implement此介面來達(dá)到互相溝通的功能
            • AID class - AID(Application Identifier)是用來唯一表示Java Card applet的number,使得JCRE能夠透過一個(gè)AID table來識(shí)別或選擇我們所要執(zhí)行的applet
            • APDU class - 是屬於 JCRE的物件,是藉由maintain一個(gè) byte array buffer 來接收與傳送 terminal端的指令與回傳applet執(zhí)行的結(jié)果與狀態(tài)的標(biāo)準(zhǔn)格式
            • Applet class - 每一個(gè) Java Card applet 都必須繼承在此 class之下。其中在 implement時(shí)要特別注意幾個(gè)methods,如select、 deselect是當(dāng) terminal端跟據(jù) applet的AID下達(dá) select或deselect 此applet的指令時(shí),由JCRE來啟動(dòng)的 methods。而 install與register 則是applet下載至 Java Card安裝并向 JCRE注冊(cè)之methods 。等到applet安裝注冊(cè)完成,并且被 terminal所select 時(shí),所有下達(dá)的 APDU command接會(huì)交由applet的 process method來處理并負(fù)責(zé)回傳結(jié)果
            • JCSystem class - 負(fù)責(zé)管理 applet與Java Card 的系統(tǒng)資源,如AID 與Transaction的管理
            • OwnerPIN class - 繼承自PIN interface,負(fù)責(zé) maintain卡片持有人的PIN number,并提供相關(guān)check與 update等methods
            • Util class - 是一個(gè)提供常用工具的class ,如byte array copy與compare等
          • javacard.secur ity package:提供安全機(jī)制與物件的package,其中幾個(gè)重要的 interface與class 如下:
            • Key abstract interface - 是 DESKey、 PrivateKey、 PublicKey等 interface的共同介面
            • KeyBuilde r class - 是一個(gè) create各種安全的 key的factory
            • MessageDi gest class - 是一個(gè)可以將message做數(shù)位簽章之object
          • javacardx.cryp to package:其中包含了關(guān)於加密與安全的物件,并且有美國的出口限制,而此package 僅包含了一個(gè) interface與一個(gè) abstract class:
            • Cipher abstract class - 使得在Java Card中的資訊得以加密保護(hù)
          八、范例

          程式8-1 HelloWorld applet

          //一applet必須要屬於一packagepackage samples.HelloWorld;		
          import javacard.framework.*;	
          //imoprt必要的packagepublic class HelloWorld extends Applet{ 
            //此echoBytes array為"HelloWorld"的16進(jìn)位表示法   
             private static final byte echoBytes[] = {    	0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64};
            //applet constructor    protected HelloWorld(APDU apdu)    
          {	//在applet initiate時(shí)向JCRE注冊(cè)       
           register();   
           }
          /*當(dāng)applet下載至Java Card時(shí),則會(huì)啟動(dòng)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);   
           }}

           

           

           

          以上是一個(gè) HelloWorld的例子(程式8-1)用來介紹基本的Java Card applet的implement 方式。而此 HelloWorld范例程式的執(zhí)行,是預(yù)設(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/
           

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1527106



          posted on 2011-05-19 15:32 閱讀(821) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 木兰县| 虹口区| 涿州市| 和田县| 托克托县| 调兵山市| 屏山县| 新密市| 巩义市| 托克逊县| 商南县| 新安县| 鲜城| 南昌市| 白玉县| 和田县| 中阳县| 新兴县| 元江| 股票| 台北市| 玉龙| 蒙自县| 南丹县| 宝鸡市| 宜州市| 娄底市| 宝丰县| 苏尼特右旗| 湘潭县| 长岭县| 晋中市| 青川县| 万安县| 格尔木市| 长沙县| 晋城| 新建县| 榕江县| 饶阳县| 郎溪县|