SmartCardIO EMV 读卡器,仅使用 ATR 编号查找我的卡类型
Posted
技术标签:
【中文标题】SmartCardIO EMV 读卡器,仅使用 ATR 编号查找我的卡类型【英文标题】:SmartCardIO EMV Reader, find my card type with only the ATR number 【发布时间】:2016-03-30 00:49:43 【问题描述】:我正在开始一个新项目,我是使用 EMV 阅读器和 Javax SmartCardIO 的新手。
我有每种卡的 RID 列表,但是我唯一可以在不知道卡类型的情况下访问的是 ATR,我想知道是否有办法获取 RID 或卡类型仅此信息,欢迎提供任何帮助。
提前致谢!
编辑:
我尝试用这种方法执行 select PSE 命令:
public static byte[] selectPSE(CardChannel channel) throws CardException
byte[] selectPSE = (byte)0x00, (byte)0xA4, (byte)0x04, (byte)0x00, (byte)0x0E, (byte)0x31, (byte)0x50, (byte)0x41, (byte)0x59, (byte)0x2E, (byte)0x53, (byte)0x59, (byte)0x53, (byte)0x2E, (byte)0x44, (byte)0x44, (byte)0x46, (byte)0x30, (byte)0x31;
CommandAPDU command = new CommandAPDU(selectPSE);
ResponseAPDU response = channel.transmit(command);
System.out.println(response.getBytes());
return response.getBytes();
但是,它只适用于 AMEX 和 Visa,我在两张 MasterCard 卡(信用卡和借记卡)上收到错误 6a82。
这看起来很奇怪,据我所知,所有主要的发卡机构(包括 MasterCard)都使用 1PAY.SYS.DDF01,我可以通过 AID 的 Try and Error 获得我想要的信息,但我不这么认为是最好的解决方案。
【问题讨论】:
您是否要读取EMV卡数据,请详细说明您的目的。 是的,我正在尝试创建一个应用程序来识别和显示智能卡中的所有数据。 【参考方案1】:AID(应用程序 ID)= RID(注册应用程序 ID)|| PIX(物业应用程序扩展)
识别卡上安装了哪些应用程序的最佳方法 - 制作选择 PSE。详细说明见EMV Book 1, 12 Application Selection, 12.3.2 Using the PSE。
您可以在图 17 中找到完整算法:使用目录的终端逻辑。
快速算法:
1) 命令选择 PSE或PPSE。
Send: 00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
Responce will will contain:
'6F' FCI Template M
'84' DF Name M
'A5' FCI Proprietary Template M
'88' SFI of the Directory Elementary File M
'5F2D' Language Preference O
'9F11' Issuer Code Table Index O
'BF0C' FCI Issuer Discretionary Data O
在这里您可以找到 PSE 的 SFI。
2) 命令 ReadRecord 1 SFI X
Send: 00 B2 01 0C 00
Receive list of tag.
'70' Application Elementary File (AEF) Data Template
'61' Application Template
'70' Application Elementary File (AEF) Data Template
'61' Application Template
'4F' Application Identifier (AID)
'50' Application Label
... and so on
在此处查找 标记“4F” 应用程序标识符 (AID)。您可以从中提取和比较 RID。
你也可以:
1) 获取自己的 AID 列表并从中依次选择应用程序。
2) 选择默认或下一个应用程序并从响应中获取 AID。
【讨论】:
感谢您的回答,我正在使用美国运通卡和两张万事达卡(借记卡和信用卡)测试应用程序,据我了解,该命令仅适用于美国运通卡 1PAY.SYS。 DDF01 命令应该在所有三张卡中都可用,对吧?我正在用结果编辑我的帖子 卡上可能没有PSE,这是正常情况。我想,您从卡 SW=0x6A82(而不是 6a62)得到响应,这意味着“找不到文件”。这是 PSE 不存在时的情况。按照图 17:使用目录的终端逻辑。当 PSE 未找到时,终端(您的代码)应从终端(您自己的)AID 列表中执行选择(尝试和错误)。但要小心,卡片可能支持粒子选择。当您直接选择 MasterCard A0000000041010 时,您可能会选择实例 A0000000041010000000,您将在答案中看到。【参考方案2】:无法通过 ATR 从卡中获取 RID 值。 ATR 用于识别卡的硬件和软件,它不用于获取有关已安装应用程序的信息(签证、签证电子、万事达卡等)https://eftlab.com/index.php/site-map/knowledge-base/212-emv-rid
有一种方法可以安装应用程序,读取卡的支付系统环境(PSE)。您可以向接触式卡发送读取 PSE 命令,向非接触式卡发送 读取 Proximity PSE 命令
联系 PSE:
00A404000E315041592E5359532E4444463031
非接触式 PPSE:
00A404000E325041592E5359532E444446303100
然后你必须解析是否有多个安装的应用程序。
【讨论】:
感谢您的回答,我正在使用美国运通卡和两张万事达卡(借记卡和信用卡)测试应用程序,据我了解,该命令仅适用于美国运通卡 1PAY.SYS。 DDF01 命令应该在所有三张卡中都可用,对吧?我正在用结果编辑我的帖子 如果这些卡是非接触式的,您必须发送“读取 PPSE”命令。如果您确定它们是联系卡,则应该还有另一个问题。有些卡不支持读取 PSE 命令,它们只包含一个应用程序并允许直接选择它。这称为显式选择。对于这些卡,“选择 pse”将不起作用以上是关于SmartCardIO EMV 读卡器,仅使用 ATR 编号查找我的卡类型的主要内容,如果未能解决你的问题,请参考以下文章
使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器
通过 javax.smartcardio 读取虚拟 NFC 标签
omnikey 3121 windows 动态 emv 读卡器和写卡器