EMV 是基于芯片卡技术的信用卡和借记卡支付卡的全球标准。
1. EMV
参考:EMV的基础知识
EMV 是 Europay、Mastercard 和 Visa 的首字母缩写词,这三家公司在 1990 年代开发了该标准。EMV 是信用卡和借记卡支付的全球标准,它使用微处理器芯片来存储和保护持卡人数据。
在 EMV 之前,大多数卡交易都依赖于卡背面的磁条。但是,磁条卡容易受到欺诈,因为存储在磁条上的信息很容易被复制并用于进行欺诈交易。EMV 技术提供了一种更安全的卡支付处理方式,因为微处理器芯片为每笔交易生成一个唯一的代码,使欺诈者更难窃取和使用持卡人数据。
EMV 卡有不同的类型,每一种都有独特的特性,以满足不同的支付场景。我们将研究三种主要的 EMV 卡类型:接触式、非接触式和双接口,探索它们的功能和特性。
【非接触式EMV卡】
非接触式 EMV 卡,也称为“一触即走”卡,利用近场通信 (NFC) 技术实现快速便捷的交易。这些卡可以在支持非接触式的读卡器附近挥动或点击,使交易变得快速和无缝。非接触式 EMV 卡的主要功能包括:
- 快速交易:与接触式卡相比,非接触式卡提供更快的交易时间,允许在零售店、运输系统和其他兼容终端进行快速支付。
- 方便易用: 用户只需轻触他们的卡即可进行支付,无需在低价值交易中进行物理插入或 PIN 输入。
- 有限的交易数据:非接触式卡传输持卡人数据的子集,通过最大限度地减少交易过程中敏感信息的暴露来提供额外的安全层。
2. APDU 在 EMV 中的作用
智能卡广泛用于各种应用,例如银行、交通和门禁系统。这些卡存储敏感信息,并具有可以执行加密作的微控制器。为了与智能卡通信,使用了一种特定的通信协议,称为应用程序协议数据单元 (APDU,Application Protocol Data Unit),它定义了双方如何交换指令和数据,类似于计算机网络中的 “请求-响应” 模型
APDU 消息包含两部分:命令 APDU 和 响应 APDU。
- 命令APDU(读卡设备 -> 给智能卡):
CLA | INS | P1 | P2 | Lc | Data | Le
# 例子 命令 APDU:
00 A4 04 00 07 D2 76 00 00 85 01 01
CLA
(类字节):Class 字节指定要发送到智能卡的命令的类型。对于 APDU 命令,Class 字节始终设置为 00
INS
(指令字节):具体操作指令(如读取数据、验证密码)。
P1/P2
(参数1、2字节):参数(如读取文件的编号)。
Lc
:发送数据的长度(可选)。Length of Command Data
Data
:发送的数据(如密码、TLV编码的请求内容、选择文件的AID等)。
Le
:期望响应的最大长度(可选)。Length of Expected Data
- 响应APDU(智能卡返回给读卡设备):
Data | SW1 | SW2
Data
:返回的数据(如账户余额、用户信息,通常以TLV格式封装)。
SW1/SW2
:状态码(如 90 00 表示成功,63 00 表示密码错误)。
请务必注意,用于 CLA、INS、P1、P2 和 Data 字段的特定值将取决于所使用的特定智能卡和应用程序。ISO/IEC 7816 规范提供了 APDU 命令的准则和要求,但用于每个字段的实际值可能因实现而异。
EMV BOOK
3. BER-TLV
参考:[1] 了解TLV,TLV简介 ; [2] BER-TLV数据格式 ; [3]金融系统中BER-TLV的解析
TLV(标签-长度-值)是数据封装格式,APDU是通信协议,两者结合使用
EMV规范中的BER-TLV数据格式:BER-TLV结构由Tag、Length、Value三部分组成。如下图所示:
【TAG域】
TAG可以由1个或多个字节组成,TAG域的第一个字节编码格式如下:一个字节是8bit
横向去看,每一行最后代表该01编码表示的意义。可见 BER-TLV 由三部分组成,高两位(b8-b7)表示Tag类别,中间一位(b6)表示Tag类型,低五位(b5-b1)表示Tag 编号。
b8、b7(最高两位):表示 Tag 的类别(Class):
00
: Universal,通用类01
: Application,应用类10
: Context-specific,上下文相关类11
: Private,专用类
在智能卡中见得较多的是 Application应用类
与 Context-specific上下文相关类
;
应用类由智能卡应用标准定义(如 ISO 7816、EMV、PBOC 等),不同协议中广泛复用。如0x6F
,还有经常碰到的0x4F
0x6F
:0110 1111
表示 应用标识符(AID, Application Identifier),用于唯一标识智能卡上的应用0x4F
:0100 1111
表示 文件控制信息(FCI Template),描述文件的属性和访问权限。
上下文类在特定的使用环境中意义不一样,具体可以参考相应的规范定义。专用类一般在私有的定义中出现,例如一些卡商在卡片的预个人化命令中使用。
b6(第三位):表示数据类型:
0
: Primitive(原始数据)1
: Constructed(构造数据,包含嵌套 TLV),遇到 Constructed 标签时,需递归解析其值域中的子 TLV
举例:
示例 1:构造类型(Constructed)
数据流:70 06 9F38 03 010203
分解:
- 外层标签 70:
二进制:0111 0000 → b6=1 → Constructed。
值域长度:06(6字节)。
值域内容:9F38 03 010203 → 嵌套的 TLV 结构。
- 内层标签 9F38:
二进制:10011111 00111000 → b6=0 → Primitive。
值域长度:03(3字节)。
值域内容:010203 → 原始数据,无需解析为 TLV。
嵌套TLV结构图示:
Constructed Tag 70 (枝干节点)
└── Primitive Tag 9F38 (叶子节点)
└── Value: 010203
b5~b1(低五位):表示 Tag 编号:
- 若值 < 31(即 0x1F,即
1 1111
),则 Tag 编号直接由这五位表示。 - 若值 = 31(即 0x1F,即
1 1111
),则 Tag 编号需要后续字节继续编码。见后续字节规则,如下图:
当后续字节首尾(b8)为1
时,表示还有后续字节;为0
时,表示这个 tag域 的最后一个字节
【LEN域】
BER-TLV中的长度表示【Value域】中的数据长度,由1到多个字节组成。
由上表可知:
- 当首个 bit 位是 0 时,剩下的7bit表示 val 的长度 0~127
- 比如7F,即
0111 1111
,表示 val 长度是 2^7 = 127
- 比如7F,即
- 当首个 bit 位是 1 时,剩下的7bit表示后续有多少字节用于存储实际长度。
- 比如81,即
1000 0001
,就表示后续有1字节表示实际长度。具体长度待定。2^8= 256,即可选长度:0~255
- 比如81,即
【VAL域】
值由一个或多个字节组成,根据Tag中的类型不同,有 简单类型 及 结构类型(嵌套TLV) 两种表示方法。
4. ISO-8583
参考:ISO-8583介绍 ; 了解 ISO-8583 消息第 1 部分 ; 了解 ISO-8583 消息第2部分
ISO 8583 是金融交易卡发起的交换消息传递的国际标准。Visa、Mastercard 和其他各种金融机构和金融网络的授权基于 ISO 8583 标准。
ISO 8583标准的官方中文译名为:《金融交易卡发起消息——交换报文规范》
ISO 8583 是金融交易领域的 应用层协议。此 ISO 协议的目标是通过使用 TCP/IP 套接字的网络传输用于支付处理的信息。ISO 8583 消息最多可以有 63 或 127 个字段,并且以线性方式处理,换句话说,它可以在读取时进行处理。 ISO 8583 消息的结构方式:
+--------+-----+----------------+------------------+--------------+
| Header | MTI | Primary Bitmap | Secondary Bitmap | Data Elements |
+--------+-----+----------------+------------------+--------------+
ISO8583消息前面可以有一个自定义的 (通常是专有的)标头Header,但核心布局始终包含 以下部分:
1)Header(可选):可能包含消息长度或网络标识(如机构代码)。
2)MTI(Message Type Indicator):4位数字,定义消息类型(如授权请求、金融交易响应)。
3)Bitmap:指示哪些数据字段(Data Elements)存在。
4)Data Elements:具体交易数据(如卡号、金额、商户信息)。
下面详细展开介绍各个部分。
4.1 消息类型指示器 (MTI)
MTI 由四个数字组成,用于标识金融交易消息的整体性质,指定 ISO8583 标准的版本、消息类、消息函数和消息源。
1)第一个数字:ISO 8583标准的版本。0-9
该标准存在三个版本:1987、1993 和 2003。 四个 MTI 字段的组合指定交换的类型 正在传输的消息。
2)第二个数字:消息类,及消息的用途类型。0-9
0:保留
1:授权相关
2:财务相关
3:文件作
4:冲销和拒付相关
5:行政相关
6:收费
7:网络管理
3)第三个数字:消息功能
核心作用:
- 定义消息的 交互模式(如请求、响应、通知)。
- 决定消息的 传输路径(点对点或端到端)和 处理规则(如超时、冲正)。
3)第四个数字:消息来源
5)举例理解 | 常用 MTI 收集
发卡行返回预授权结果:
MTI: 0110
┌───┬───┬───┬───┐
│ 0 │ 1 │ 1 │ 0 │ ← 四位数字
└───┴───┴───┴───┘
│ │ │ └── 起源:0=收单行发起
│ │ └────── 功能:1=响应
│ └───────── 类别:1=授权类消息
└──────────── 版本:0=1987版
常用MTI:
0100 授权交易
0110 授权交易答复
0200 金融交易
0210 金融交易答复
0240 查询交易
0250 查询交易答复
0400 冲正交易
0410 冲正交易答复
0800 管理交易
0810 管理交易答复
参考:ISO8583各域段的说明 ; 了解 ISO 8583:金融交易消息传递标准
4.2 一个或多个位图 Bit Map
位图是 ISO 8583 消息中的 二进制控制字段,用于标记消息中 包含哪些数据域(Data Elements)。
其核心功能是:
1) 标识存在的数据域:通过二进制位(0不存 或 1存在)表示某个数据域是否存在。
2) 节省传输带宽:仅传输实际需要的数据域,避免空字段占用空间。
【位图的组成】
1)主位图(Primary Bitmap):
固定为 8字节(64位),对应数据域 DE 1 至 DE 64。
第1位(最高位) 表示是否包含次位图(Secondary Bitmap)。
2)次位图(Secondary Bitmap)(可选):
当主位图的 第1位为1 时存在,扩展支持 DE 65 至 DE 128。
同样是 8字节(64位)。
【示例】
位图 00100110
(二进制)表示 不扩充第二位图,数据域 3、6、7 存在。
4.3 消息数据字段 data / data element
消息数据字段就是对应上一个位图选择的数据域进行相应的解析,举例:
位图 00110110(二进制)表示字段3、4、6、7存在。
数据字段按协议解析
字段3(PAN):读取长度指示符 → 根据长度提取卡号。
字段4(金额):直接读取12位数字。
字段6(发卡机构ID):读取6位字母数字。
字段7(时间):读取10位数字,转换为日期时间格式。
消息数据字段由 ISO8583 标准定义,包含 有关交易的信息,例如金额、日期、时间、 和国家/地区代码。使用 ISO8583 的组织通常会进行自定义 这些字段。
5. ISO8583报文解析
报文的最后一个部分 【应用数据】就包含了上一节提到的 【ISO 8583 消息】
TPDU 和报文头属于 传输层 和 会话层 的封装,确保消息正确路由到目标系统。类似快递包裹的“外包装”,标明收件人、发件人。应用数据对应 ISO 8583 消息,是实际的“包裹内容”,即交易信息。
POS终端在实际传输时,消息通常包含以下层次:
+------+----------+---------------+
| TPDU | 报文头 | 应用数据 |
+------+----------+---------------+
-
TPDU(Transport Protocol Data Unit):属于 传输层协议 的封装,用于路由和网络通信。
包含目标地址(如收单行代码)、源地址、消息长度等。长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。
示例:60 00 00 00 00(目标地址 60000000)。 -
报文头:总长度为12字节,压缩时用BCD码表示为6个字节长度的数值。
可能包含 应用层控制信息(如消息版本、终端编号)。
不同厂商或网络可能有自定义格式。
- 在POS上送的请求/通知报文中,该数值由POS终端应用程序在打包上送时根据POS终端参数和当前状态填入应用类别、软件总版本号、终端状态和软件分版本号(具体指各厂商的程序版本号),用于POS中心根据数值进行相应的处理。
- 在POS中心返回的应答报文中,由POS中心填入处理要求,其他域保持原值返回,POS将根据收到报文头中的处理要求进行相应处理。
- 应用数据:即上一节提到的 ISO-8583 消息
实际承载 ISO 8583 消息结构,即包含 Header、MTI、Bitmap 和 Data Elements
示例:
+---------------------+---------------------+-----------------------------------+
| TPDU | 报文头 | 应用数据(ISO 8583 消息) |
| (传输层) | (应用层元数据) | |
+---------------------+---------------------+-----------------------------------+
| 60 00 00 00 00 | 01 00 00 00 | 0110 8000000000000001 4A6F686E202020... |
| (目标地址:收单行) | (终端编号、版本号) | MTI=0110, Bitmap, 卡号、金额等 |
+---------------------+---------------------+-----------------------------------+
参考:ISO8583报文解析