首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 智能卡開發基礎篇:ISO 7816、OpenCard Framework 與醫療處方卡實戰

     編輯:Java 相關知識

智能卡內建微處理器,可作為攜帶式安全運算與儲存裝置。本文介紹智能卡分類、關鍵標準(ISO 7816、PC/SC、OpenCard、JavaCard)、開發環境建置、APDU 通訊協定,並以 Gemplus 卡為例實作醫療處方卡讀寫應用。

智能卡核心分類

類型特性典型應用
記憶體卡可讀寫儲存,可選存取控制預付費電話、會員卡
處理器卡內建 CPU、OS、安全協處理器金融 IC 卡、身分證、電子錢包
JavaCard可直接執行 Java Applet多應用安全平台

通訊介面:接觸式(金屬觸點)與 非接觸式(RFID/NFC,如悠遊卡、Apple Pay)。

關鍵標準體系

橫向標準(跨應用)

  • ISO 7816:智能卡物理、電氣、傳輸協定(APDU)基礎標準
  • PC/SC:Microsoft 主導,Win32 平台智能卡中介軟體標準
  • OpenCard Framework (OCF):跨平台 Java 介面,支援 PC/SC 橋接,推動 100% Pure Java 開發
  • JavaCard:卡片端執行環境標準,定義 API 與虛擬機子集

縱向標準(特定應用)

  • Mondex、Visa Cash、Proton:電子現金/儲值卡
  • EMV:金融晶片卡國際標準

開發環境三要素

  1. 智能卡讀卡機(Serial/PC Card/USB/鍵盤模組)
  2. 讀卡機廠商提供的通訊類別庫(實作 ISO 7816 APDU 封裝)
  3. 智能卡(如 Gemplus GFM 4K 記憶體卡、Schlumberger JavaCard)

APDU 協定核心結構

應用層與卡片交換的基本單元:

命令 APDU:  CLA  INS  P1  P2  Lc  Data  Le
回應 APDU:  Data  SW1  SW2
  • CLA:指令類別,INS:指令碼
  • P1/P2:參數,Lc:資料長度,Le:期望回應長度
  • SW1/SW2:狀態字(90 00 表示成功)

Gemplus GFM 卡讀寫實作(模 8 位址)

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();
}

醫療處方卡應用場景

  1. 醫生讀取病歷、過敏史、用藥紀錄
  2. 檢測藥物交互作用,開立新處方寫入卡片
  3. 藥師讀取處方、核對保險資訊、調劑藥品
  4. 加密通訊驗證醫師資格與病患身分
  5. 緊急情況下醫護人員快速獲取關鍵醫療資訊

優於紙本:資料完整性、跨機構共享、患者自主控管、防偽防竄改。

從 JECF 到 OpenCard 的演進

早期使用 Sun Java Electronic Commerce Framework (JECF) 提供的 java.commerce.smartcards、java.commerce.gemplus 套件。但廠商綁定嚴重,現代開發應採用 OpenCard Framework:

  • 統一介面支援多廠商讀卡機/卡片
  • CardTerminal、CardService、CardChannel 核心抽象
  • 內建 PC/SC 橋接,Windows 平台無縫相容
  • 支援 APDU 指令建構與回應解析工具類

安全性關鍵提醒

  • 傳輸層加密(如 TLS)保護 APDU 通道
  • 卡片端存取控制(PIN、生物辨識、安全通道)
  • 應用層資料加密(AES-GCM 等)防止實體卡片被讀取洩露
  • 定期輪換金鑰、撤銷受損憑證

智能卡開發雖涉及底層協定複雜度,但善用 OpenCard 等標準框架,可大幅降低廠商鎖定風險,專注於業務邏輯與安全架構設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved