什么是 APDU?
APDU (Application Protocol Data Unit) 是基于 ISO/IEC 7816-4 標準的智能卡通信協議,是智能卡與外部設備(如讀卡器)之間交換數據的基本單元。它是智能卡通信的核心概念,定義了一組用于請求和響應的標準化消息格式。
APDU 分為兩類:Command APDU(指令 APDU) 和 Response APDU(響應 APDU)。
1. Command APDU(指令 APDU):由外部設備(主機)發送給智能卡,用于向卡片發出指令。由以下字段組成:
字段名稱 | 長度 (字節) | 描述 |
---|---|---|
CLA | 1 | 指令類別 (Class)。指定命令的類別。 |
INS | 1 | 指令代碼 (Instruction)。指定要執行的操作。 |
P1, P2 | 2 | 參數 (Parameter)。指定指令的操作參數。 |
LC | 1 (可選) | 數據字段長度 (Length of Command)。 |
Data | 可變長度 | 數據字段 (Data)。向卡片傳遞的數據。 |
LE | 1 (可選) | 期望的響應數據長度 (Length of Expected)。 |
Command APDU 示例:
00A404000F7378312E73682EC9E7BBE1B1A3D5CF
? CLA: 00 - 標準指令。
? INS: A4 - SELECT 文件指令。
? P1, P2: 04 00 - 選擇方式。
? LC: 0F - 后續數據長度。
? Data: 7378312E73682EC9E7BBE1B1A3D5CF- 要選擇的文件標識符。
2. **Response APDU(響應 APDU)**:由智能卡返回給主機,用于提供執行結果或數據。由以下字段組成:
字段名稱 | 長度 (字節) | 描述 |
---|---|---|
Data | 可變長度 | 響應數據。 |
SW1, SW2 | 2 | 狀態字 (Status Word)。指示執行結果。 |
Response APDU 示例:
6F 10 84 08 A0 00 00 00 87 10 02 02 90 00
? Data: 6F 10 84 08 A0 00 00 00 87 10 02 02 - 返回的數據內容。
? SW1, SW2: 90 00 - 執行成功。
Command APDU 與 Response APDU 的工作流程
1. 主機發送 Command APDU:
? 外部設備(主機)通過讀卡器向智能卡發送指令,例如選擇應用、讀取數據或驗證 PIN。
2. 智能卡解析并執行指令:
? 智能卡接收并解析 Command APDU,根據指令內容執行操作。
3. 智能卡返回 Response APDU:
? 執行完成后,智能卡將響應數據和狀態字通過 Response APDU 返回給主機。
示例:
? Command APDU: 主機發送選擇文件指令 00 A4 04 00 08 A0 00 00 00 87 10 02 02。
? Response APDU: 智能卡返回文件選擇成功 90 00。
APDU 狀態字 (SW1, SW2)狀態字是智能卡返回的兩個字節,指示指令的執行結果。常見狀態字包括:
狀態字 | 描述 |
---|---|
90 00 | 執行成功。 |
67 00 | 長度錯誤。 |
6A 82 | 文件未找到。 |
6A 84 | 存儲空間不足。 |
69 82 | 安全狀態未滿足(如未認證)。 |
6C XX | LE 字段不匹配,返回推薦的長度 XX。 |
讀取社保卡信息
了解了什么是APDU之后,就可以來讀社保卡了。
根據關于印發社會保障卡文件結構和數據項(V2.0)的通知 人社信息函?2012?37 號
中的說明。
社會保障系統環境 SSSE 的應用標識符
DDF | 應用標識符內容 | 應用標識符 |
---|---|---|
SSSE | sx1.sh.社會保障 | 7378312E73682EC9E7BBE1B1A3D5CF |
基本應用數據區文件特性
文件定義 | 文件標識符 | 短文件標識符 | 讀控制 | 寫控制 | 文件結構 | 類別 |
---|---|---|---|---|---|---|
發卡機構數據文件 | EF05 | 05 | 無 | UKSSSE | 變長記錄 | 啟用 |
持卡人的基本信息文件 | EF06 | 06 | 無 | UKSSSE | 變長記錄 | 啟用 |
數據項的格式與屬性
標志 | 數據項 | 類型 | 長度 | 所屬文件 | 備注 |
---|---|---|---|---|---|
01 | 卡的識別碼 | cn | 10 | SSSE "EF05" | |
02 | 卡的類別 | an | 01 | SSSE "EF05" | |
03 | 規范版本 | an | 04 | SSSE "EF05" | |
04 | 初始化機構編號 | cn | 0C | SSSE "EF05" | |
05 | 發卡日期 | cn | 04 | SSSE "EF05" | |
06 | 卡有效期 | cn | 04 | SSSE "EF05" | |
07 | 卡號 | an | 09 | SSSE "EF05" | |
08 | 社會保障卡號碼 | cn | 12 | SSSE "EF06" | |
09 | 姓名 | an | 1E | SSSE "EF06" | |
4E | 姓名擴展 | an | 14 | SSSE "EF06" | |
0A | 性別 | cn | 01 | SSSE "EF06" | |
0B | 民族 | cn | 01 | SSSE "EF06" | |
0C | 出生地 | cn | 03 | SSSE "EF06" | |
0D | 出生日期 | cn | 04 | SSSE "EF06" |
可以獲知,以上數據,可以直接讀出,不需要走加密模塊。