程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> J2EE概述

J2EE概述

編輯:關於JAVA

一、前言

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端。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved