Java 技術根據運算資源的不同,劃分為企業級、嵌入式、智慧卡等不同平台。其中 Java Card 是 Java 平台中最精簡的子集,專為智慧卡晶片等嚴格受限的硬體環境設計。本文將深入探討 Java Card 的運作邏輯、硬體需求、軟體架構、API 結構,並透過實際程式碼範例示範 Applet 開發流程。
Java 技術因應不同裝置的運算能力,衍生出多種平台。嵌入式 Java 因功能有限且受硬體資源(如傳呼機)限制,必須在執行環境上妥協;Java Card 則針對智慧卡等極度受限資源環境開發,是目前最小的 Java 平台。其核心目標是將 Java 的跨平台特性與多應用優勢帶入智慧卡領域,符合 ISO 7816 及 EMV 等國際標準。
未來應用場景涵蓋身份識別、醫療記錄、電子錢包、門禁管控等,甚至可將多種應用整合於單一卡片。
Java Card 系統分為卡端與終端機兩部分。卡端配合讀卡機 (CAD) 進行資料傳輸與供電,執行 Applet 保護敏感資料;終端機提供服務程式與操作介面,透過 CAD 與卡片溝通。雙方通訊遵循 APDU (Application Protocol Data Units) 協定。

圖1:Java Card 運作模式
終端機發送給卡片的指令格式如下:

圖2:Command APDU 格式
| 欄位 | 名稱 | 說明 |
|---|---|---|
| CLA | Class Byte | 識別 Applet 類別 |
| INS | Instruction Byte | 下達給 Applet 的指令碼 |
| P1 | Parameter 1 | 第一指令參數 |
| P2 | Parameter 2 | 第二指令參數 |
| Lc | Length of Data | 資料欄位長度 |
| Data Field | 資料欄位 | 實際傳輸資料 |
| Le | Length of Response | 期望回傳資料長度 |
例如:CLA=0x80, INS=0x01 (加法指令),Data Field 含兩個 byte 運算元。
卡片回傳終端機的回應格式:

圖3:Response APDU 格式
| 欄位 | 說明 |
|---|---|
| Data Field | 回傳資料內容 |
| SW1, SW2 | 狀態字,如 0x9000 表示成功 |
Java Card 如微型電腦,最低硬體規格:

圖4:Java Card 軟體架構
Shareable 介面共享資源。| 支援 | 不支援 |
|---|---|
| boolean, byte, short, int Dynamic Object Creation Arrays Exceptions Interfaces | float, double, long, char, Strings Dynamic Class Loading Security Manager Virtual Methods Garbage Collection & Finalization Threads Packages Cloning Multi-dimensional Arrays |
Java Ring (iButton) 為 Dallas Semiconductor 產品,將 Java Card 封裝為鈕扣狀鑲嵌於戒指,硬體架構延伸自 Java Card,開發出不同應用層面。
Object, Throwable 等)APDU, Applet, PIN, Shareable, AID, JCSystem, OwnerPIN, Util 等關鍵類別Key, KeyBuilder, MessageDigestCipher),受美國出口管制package samples.HelloWorld;
import javacard.framework.*;
public class HelloWorld extends Applet {
private static final byte echoBytes[] = {
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64 // "HelloWorld"
};
protected HelloWorld(APDU apdu) {
register(); // 向 JCRE 註冊
}
public static void install(byte[] bArray, short bOffset, byte bLength) {
new HelloWorld(null); // 安裝實例化
}
public void process(APDU apdu) throws ISOException {
byte[] buffer = apdu.getBuffer();
Util.arrayCopyNonAtomic(echoBytes, (short)0, buffer, (short)0, (short)echoBytes.length);
apdu.setOutgoingAndSend((short)0, (short)echoBytes.length);
}
}
此範例示範 Applet 生命週期:安裝、註冊、處理 APDU 指令並直接回傳 "HelloWorld" 訊息。實際部署時需編譯、轉換為 CAP 檔並下載至卡片。