智能卡內建微處理器,可作為攜帶式安全運算與儲存裝置。本文介紹智能卡分類、關鍵標準(ISO 7816、PC/SC、OpenCard、JavaCard)、開發環境建置、APDU 通訊協定,並以 Gemplus 卡為例實作醫療處方卡讀寫應用。
| 類型 | 特性 | 典型應用 |
|---|---|---|
| 記憶體卡 | 可讀寫儲存,可選存取控制 | 預付費電話、會員卡 |
| 處理器卡 | 內建 CPU、OS、安全協處理器 | 金融 IC 卡、身分證、電子錢包 |
| JavaCard | 可直接執行 Java Applet | 多應用安全平台 |
通訊介面:接觸式(金屬觸點)與 非接觸式(RFID/NFC,如悠遊卡、Apple Pay)。
應用層與卡片交換的基本單元:
命令 APDU: CLA INS P1 P2 Lc Data Le
回應 APDU: Data SW1 SW2
CLA:指令類別,INS:指令碼P1/P2:參數,Lc:資料長度,Le:期望回應長度SW1/SW2:狀態字(90 00 表示成功)GFM 卡以 8 位元組為存取單位,需分塊讀寫。核心指令:
// 寫入 8 bytes: CLA=0, INS=0xD0, P1=高位址, P2=低位址, Lc=8
// 讀取 8 bytes: CLA=0, INS=0xB0, P1=高位址, P2=低位址, Le=8
public static void writeGFMString(String s, ISOCardReader reader) {
// 1. 寫入控制區:前 2 bytes 長度 + 6 bytes 保留
ISOCommand cmd = new ISOCommand(0, 0xD0, 0, 0, 8, 0);
cmd.data.writeShort((short)s.length());
cmd.execute(reader, new GemplusReaderFailureHandler());
// 2. 分 8-byte 區塊寫入字串內容
int whole = s.length() / 8;
int rem = s.length() % 8;
for (int i = 1; i <= whole; i++) {
int addr = i * 8;
cmd = new ISOCommand(0, 0xD0, addr >> 8, addr & 0xFF, 8, 0);
cmd.data.writeString(s.substring((i-1)*8), 8);
cmd.execute(reader, new GemplusReaderFailureHandler());
}
// 3. 寫入餘數
if (rem > 0) {
int addr = (whole + 1) * 8;
cmd = new ISOCommand(0, 0xD0, addr >> 8, addr & 0xFF, rem, 0);
cmd.data.writeString(s.substring(whole*8), rem);
cmd.execute(reader, new GemplusReaderFailureHandler());
}
}
public static String readGFMString(ISOCardReader reader) {
// 1. 讀取長度
ISOCommand cmd = new ISOCommand(0, 0xB0, 0, 0, 0, 8);
ISOCardInputStream in = cmd.execute(reader, new GemplusReaderFailureHandler());
short len = in.readShort();
// 2. 分塊讀取
StringBuffer sb = new StringBuffer();
int whole = len / 8, rem = len % 8;
for (int i = 1; i <= whole; i++) {
int addr = i * 8;
cmd = new ISOCommand(0, 0xB0, addr >> 8, addr & 0xFF, 0, 8);
in = cmd.execute(reader, new GemplusReaderFailureHandler());
sb.append(in.readString(8));
}
if (rem > 0) {
int addr = (whole + 1) * 8;
cmd = new ISOCommand(0, 0xB0, addr >> 8, addr & 0xFF, 0, 8);
in = cmd.execute(reader, new GemplusReaderFailureHandler());
sb.append(in.readString(rem));
}
return sb.toString();
}
優於紙本:資料完整性、跨機構共享、患者自主控管、防偽防竄改。
早期使用 Sun Java Electronic Commerce Framework (JECF) 提供的 java.commerce.smartcards、java.commerce.gemplus 套件。但廠商綁定嚴重,現代開發應採用 OpenCard Framework:
智能卡開發雖涉及底層協定複雜度,但善用 OpenCard 等標準框架,可大幅降低廠商鎖定風險,專注於業務邏輯與安全架構設計。