技术文章
如何解码磁条数据
直到不久前,读取信用卡数据还非常简单——只需将卡片在读卡器(例如 ID TECH 出品的众多读卡器之一)上刷一下,虚拟终端应用(或其他应用)便可直接从读卡器中获取磁道数据。相关数据会以未加密的形式,作为键盘按键直接显示在屏幕上。
那真是好时光!
不必多说,如今情况已大不相同。当前的磁条读卡器一般通过 USB(通常采用 HID 模式而非键盘模式)输出加密数据,并且现在大多数读卡器除了磁条卡外,还必须支持芯片卡。芯片卡数据采用 TLV(标签、长度、值)格式,与过去那种"普通磁条数据"看上去差别很大。而且,数据一律是加密的。
在 近期文章中,我演示了如何使用业界标准的 TDES 和 AES 解密算法,结合业界标准(ANSI X9.24)DUKPT 密钥派生技术来解密信用卡数据,但我们没有谈过如何在最初获得已解码的磁条数据。现在的"信用卡磁条数据"是什么样子?如何获取并解码它?如何判断哪些部分是加密的?
如今的读卡器一般通过 USB(通常采用 HID 模式而非键盘模式)输出加密数据,并且现在大多数读卡器除了磁条卡外,还必须支持芯片卡。
对第一个问题(磁条数据是什么样的?)的回答差异很大,不仅取决于所用读卡设备的品牌和型号,还取决于该笔交易是通过刷卡、插卡(接触式 EMV)还是非接触/NFC 方式完成的。一般而言,你做的远不止读取原始磁道数据。你还需要获取 KSN(密钥序列号),用于解密,并收集与交易相关的各类元数据。诚然,你也许只关心(比如)获取原始 Track 2 数据,但在获取过程中,你还得处理大量其他数据。
让我们来快速看一个真实示例,使用一张星巴克礼品卡——这是一位心怀歉意的咖啡师在意外卖光"美索不达米亚金橘苦艾拿铁"后送给我作为补偿的。如果我们把这张星巴克卡通过工作在键盘模式下的 ID TECH Augusta 读卡器刷一下,并打开记事本窗口(光标置于文本窗口中),记事本中会出现以下数据:
02ED01801F4C2800839B%*6010********8765^0254/SERVICERECOVERYUSD^*******************************?*;6010********8765=********************?*95025C86987E4F7DD07D58730EB79FDFB90AB7F23E6ECA6F4F04A67BF511EE13F950903BDE77624680C460E9C36C4F9136256BB93A38CB98F95626DCFAF9335CE0A213074CC1CD84CC911398E06756C464AB036B694228ADA7EC018F495A013AF8A04C976288FE2F80271E6E53D987DE19ACA2707BFF2C78000000000000000000000000000000000000000000000000000000000000000000000000000000003631335435333536313862994900750002A00308108E03
这远不只是"原始磁道数据"。你可以辨认出被掩码处理的磁道数据(以 B% 开头,中间含有许多星号,最后以 ?* 结尾),但其中隐藏了主账户号(PAN),实际是加密的。这里看到的大部分内容是读卡器输出的二进制数据的十六进制表示。
只要掌握方法,解析这一大段内容并不难。最快捷的解码方法是把数据交给 ID TECH 免费的 Parsomatic 工具进行处理,它是一个 HTML 表单,可以以易于理解的方式呈现所有数据片段。
每款读卡器都有其专有的卡数据表示方式。ID TECH 采用一种称为 Enhanced Encrypted MSR 格式的方式表示磁条数据。该格式包含 26 个数据字段;全部 26 个字段在文档 P/N 80000502-001 中有详细描述, ID TECH 加密数据输出.
为了让你了解卡上有哪些信息,我们来看看前 5 个字节的数据(02 ED 01 80 1F)。根据 Parsomatic,这 5 个字节包含以下信息:
第一个字节(02)是 STX,即"起始"字节。接下来的两个字节(ED 01)以十六进制表示整个数据载荷的长度(小端序:ED 01 实际表示 0x01ED 即 493 字节)。Card Encode 类型为 0x80,这(用通俗的话讲)表示读卡器认为这是一张金融卡。Track Status(值:0x1F)是一个状态字节,内含 8 位标志位,用于指明磁条上存在哪些磁道(最多可有 3 条)以及哪些磁道读取成功。在本例中,3 条物理磁道全部读取成功,但仅磁道 1 和磁道 2 上存在数据。
让我们快速看看接下来的 5 个字节。根据 Parsomatic,这些字节及其含义如下:
在金融卡上,Track 1 最长可达 79 字节;Track 2 最长 40 字节;Track 3 最长 107 字节。本例中,Track 1 有 76 字节(十六进制 0x4C)数据,Track 2 有 40 字节(0x28)数据(Track 3 为零字节)。了解这些长度很重要,不仅用于解析掩码磁道数据,也用于确定各磁道加密后的长度。加密后的长度与磁道实际原生长度不同,因为磁道数据需要填充到 8 的倍数才能进行 TDES 加密,或填充到 16 的倍数才能进行 AES 加密。
我们如何判断数据是 TDES 加密还是 AES 加密?这一信息位于 Clear/Mask Data Sent Status 字节的第 4 位(如上所示)。此外,还有一个 Encrypted/Hash Data Sent 状态字节(如上所示),用于告知是否存在加密磁道数据(以及校验哈希),以及是否存在 KSN。
接下来是 Track 1 和 Track 2 的掩码数据,然后是它们的加密版本,接着是一些哈希数据(本例中全为零),以及一些其他数据(下文将描述)。请注意, Parsomatic 已将 ASCII 磁道数据转换为十六进制表示,如下所示:
请注意, Parsomatic 会在加密数据旁边插入一个"Decrypt this data"链接(如上所示)。点击该链接,会跳转至 ID TECH 的 加密/解密工具,可在那里查看该数据的解密形式。
最后几个数据字段包括 Reader Serial Number、Key Serial Number(KSN)、LRC、校验和以及 ETX(传输结束)。LRC 只是一个字节值,代表所有载荷数据字节的 XOR(异或),而校验和则是载荷中所有字节的一字节算术和(显然忽略溢出)。LRC 和校验和可用于检查数据载荷的完整性(它们的计算比真正的 CRC 更简单、更快捷)。
由此可见,磁条数据所包含的内容远远不止"磁道数据"那么简单。我们甚至还没有谈到某些数据字段的意义(也许我们可以在以后的文章中讨论)。也没有谈到 EMV 数据(那肯定要另写一篇)。不过,如果你正打算解码 ID TECH 信用卡读卡器输出的数据,这些内容应该足以让你入门。
如需了解更多信息,请务必(如前所述)查阅我们关于 Enhanced Encrypted MSR 数据格式的技术文档: ID TECH 加密数据输出. 或点击下方链接,迈出简化支付流程的第一步!
