什么是 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" |
可以获知,以上数据,可以直接读出,不需要走加密模块。