Java Card Technology概述
前言:Java Card 技術(shù)是把Java編程語言的一個子集同一個優(yōu)化的運(yùn)行時環(huán)境結(jié)合在一起的技術(shù)。這種優(yōu)化是專門針對小存儲量的嵌入式設(shè)備的,例如智能卡。 Java Card 技術(shù)的目標(biāo)是讓那些資源受限的智能卡等設(shè)備受益于Java語言開發(fā)的軟件。本文主要介紹Java Card應(yīng)用程序的體系結(jié)構(gòu)以及與Java Card Applet的通信方式。
Java Card技術(shù)是專門為那些內(nèi)存和計(jì)算能力比J2ME設(shè)備更為受限的智能卡和其它設(shè)備提供的一個平臺。圖1是Java Card和J2ME平臺的對照。它為應(yīng)用程序提供了一個安全的運(yùn)行環(huán)境。它允許多個應(yīng)用程序同時在一個卡片上運(yùn)行,并且可以對已發(fā)放到用戶手中的卡片進(jìn)行更新。用Java編寫的應(yīng)用程序可以安全的運(yùn)行在不同提供商的卡片上。
從上圖可以看出,CDC和CLDC配置以及它們相關(guān)的簡表是J2ME平臺的一部分,而Java Card是一個單獨(dú)創(chuàng)建來用于智能卡環(huán)境的平臺。 在目前的版本中(2.2.1),Java Card技術(shù)的規(guī)范包括一些三部分: 1.Java Card Virtual Machine規(guī)范:該規(guī)范定義了Java語言的一個子集和適用于智能卡的虛擬機(jī)。 2.Java Card Runtime Environment規(guī)范:該規(guī)范更進(jìn)一步定義了基于Java的智能卡的運(yùn)行時行為。 3.Java Card API規(guī)范:該規(guī)范定義了為智能卡應(yīng)用程序量身定制的核心框架以及各種包和類。 一個典型的Java Card設(shè)備有一個8或16位的運(yùn)行在3.7MHz的中央處理器,帶有1K的RAM和多于16K的非易失性存儲器(可編程只讀存儲器或者閃存)。高性能的智能卡帶有單獨(dú)的處理器和加密芯片,以及用于加密的內(nèi)存,并且有一些還帶有32位的中央處理器。 Sun還提供了Java Card開發(fā)工具箱(JCDK) ,可在以下站點(diǎn)獲取: http://java.sun.com/products/javacard/。它包含了Java Card運(yùn)行時環(huán)境(JCRE)和Java Card虛擬機(jī)(JVVM)的引用實(shí)現(xiàn),以及其它幫助開發(fā)Java Card小應(yīng)用程序的工具。 一個Java Card應(yīng)用程序的結(jié)構(gòu)如圖2所示。
從圖中可以看出,Java Card應(yīng)用程序并不是孤立的,而是包含卡端、讀取端和后端程序等元素。 下面將分別描述各個組成元素。 后端應(yīng)用程序及系統(tǒng) 后端應(yīng)用程序提供了支持卡上Java Applet的服務(wù)。 例如,一個后端應(yīng)用程序利用卡片上的證書可以提供與安全系統(tǒng)的連接,從而提供強(qiáng)大的安全性。在一個電子付款系統(tǒng)中,后端應(yīng)用程序可以提供到信用卡及其他交易信息的訪問。 讀卡器端主應(yīng)用程序 主應(yīng)用程序駐留于例如個人計(jì)算機(jī)、電子付款終端、手機(jī)或者一個安全子系統(tǒng)中。它處理用戶、Java Card Applet和供應(yīng)商的后端應(yīng)用程序之間的通信。 傳統(tǒng)的讀取端應(yīng)用程序是使用C語言編寫的。近來J2ME技術(shù)的廣泛使用使得用Java語言來實(shí)現(xiàn)主應(yīng)用程序成為可能;例如,它可以在一臺支持MIDP和安全信賴服務(wù)應(yīng)用編程接口(Security and Trust Services API)的手機(jī)上運(yùn)行。 卡片接受設(shè)備(CAD) 卡片接受設(shè)備(CAD)是處于主應(yīng)用程序和Java Card設(shè)備之間的接口設(shè)備。一個CAD為卡片提供電源,而且可以與之進(jìn)行電子或者射頻通信。一個CAD可能是一個使用串行端口連接于臺式計(jì)算機(jī)的讀卡器,或者可能被集成到例如飯店或商場內(nèi)的電子付款終端。CAD可以在主應(yīng)用程序和卡片之間傳遞命令APDU(Application Protocol Data Unit,簡稱APDU)以及響應(yīng)APDU。一些CAD有用于輸入個人識別號碼(PIN)的鍵盤,有的可能還有顯示屏。 卡片端應(yīng)用程序 Java Card平臺是一個多應(yīng)用程序環(huán)境。在圖2中我們可以看到,卡片上可能存在一個或多個Java Card Applet,還有相應(yīng)的支持軟件——卡片的操作系統(tǒng)和Java Card運(yùn)行時環(huán)境(JCRE)。JCRE由Java Card虛擬機(jī)、Java Card Framework和API以及一些擴(kuò)展的API組成。 下面將描述主應(yīng)用程序和Java Card Applet之間的通信方式。 二者之間的通信有兩種方式。第一是使用基本的消息傳遞模型;第二是使用基于Java Card的遠(yuǎn)程方法調(diào)用(JCRMI)該方法是J2SE RMI分布式對象模型的一個子集。下面分別并主要闡述這兩種方式。 消息傳遞模型是所以Java Card通信的基礎(chǔ)。它的核心就是應(yīng)用程序協(xié)議數(shù)據(jù)單元(APDU),就如圖2所示,它是CAD和Java Card框架之間交換的一個邏輯數(shù)據(jù)包。Java Card框架接收任何來自CAD中轉(zhuǎn)的命令APDU并將其前傳給相應(yīng)的Applet。當(dāng)Applet處理完命令APDU后將返回一個響應(yīng)APDU。APDU的格式遵從ISO/IEC 7816-3和7816-4。圖3是使用消息傳遞的模型。 讀卡器和卡之間的通信通?;谙旅鎯煞N連接協(xié)議的一種,面向字節(jié)的T = 0方式,或者面向數(shù)據(jù)塊的T = 1方式。還可能會用到被稱為T = USB和T = RF的替換協(xié)議。 下面簡要敘述命令APDU和響應(yīng)APDU。 命令APDU的格式通常如圖4所示: 一個命令APDU包含一個必需的頭的和一個可選的體。其中: ² CLA(1字節(jié)):這個必需的字段識別指令的一個特定應(yīng)用程序類。有效的CLA值在ISO 7816 - 4規(guī)范中定義。 ² INS(1字節(jié)):這個必需的字段指明CLA字段中標(biāo)示的指令類中的一個特定的指令。ISO 7816 - 4標(biāo)準(zhǔn)指定用于訪問卡上的數(shù)據(jù)的基本指令。附加功能已經(jīng)在這個標(biāo)準(zhǔn)中的其它地方說明,其中一些是安全功能。只有當(dāng)使用一個相應(yīng)的CLA字節(jié)值時,才可以根據(jù)標(biāo)準(zhǔn)定義自己的特定應(yīng)用程序的INS值。 ² P1(1字節(jié)):這個必需的字段定義指令參數(shù)1??梢允褂眠@個字段來檢驗(yàn)INS字段,或者用于輸入數(shù)據(jù)。 ² P2(1字節(jié)):這個必需的字段定義指令參數(shù)。可以使用這個字段來檢驗(yàn)INS字段,或者用于輸入數(shù)據(jù)。 ² Lc(1字節(jié)):這個可選的字段指定數(shù)據(jù)字段的字節(jié)數(shù)。 ² Data Field(可變的,由Lc指定字節(jié)數(shù)):包含了命令數(shù)據(jù)。 ² Le(1字節(jié)):這個可選的字段指定在期望響應(yīng)的數(shù)據(jù)字段中的最大字節(jié)數(shù)。 響應(yīng)APDU格式通常如圖5所示:
所有的Java Card Applet都需要擴(kuò)展Applet基本類,并且必須實(shí)現(xiàn)install()和process()方法;JCRE在安裝Applet的時候調(diào)用其install()方法,并且在每次有命令APDU進(jìn)入的時候調(diào)用其process()方法。
² 和一個APDU命令相似,響應(yīng)APDU有可選擇的和必要的字段:
Data Field:(可變長度,由命令APDU中的Le確定):這個可選擇的字段包含小應(yīng)用程序返回的數(shù)據(jù)。
² SW1(1字節(jié)):這個必要的字段是狀態(tài)字1。
² SW2(1字節(jié)):這個必要的字段是狀態(tài)字2。
這些狀態(tài)字的值在ISO 7816 - 4規(guī)范中定義。
第二種方式是Java Card RMI(JCRMI)通訊模型,它依賴于J2SE RMI分布式對象模型的一個子集。在RMI模型中,一個服務(wù)器應(yīng)用程序創(chuàng)建并生成可訪問的遠(yuǎn)程對象.客戶應(yīng)用程序要獲得到遠(yuǎn)程對象的遠(yuǎn)程引用,然后調(diào)用它們的遠(yuǎn)程方法。在JCRMI中,Java Card Applet是服務(wù)器,而主應(yīng)用程序(Host Application)是客戶端。
JCRMI由類RMIService提供,并放在擴(kuò)展程序包javacardx.rmi中。JCRMI消息被封裝到傳遞給RMIService方法的APDU對象中。換句話說,JCRMI提供了一個基于APDU消息傳遞模型的分布式對象模型機(jī)制。通過這個機(jī)制,服務(wù)器和客戶端可以來回傳送方法信息、參數(shù)和返回值。
由于接觸的時間不長,研究的也不夠深刻,所以以上文字顯得有些粗枝大葉。大家可以在以下站點(diǎn)獲得相關(guān)的參考:http://java.sun.com/products/javacard/