【问题标题】:Javax SmartCardIO: Sending 0x00 to Read Record is not returning lengthJavax SmartCardIO:向读取记录发送 0x00 未返回长度
【发布时间】:2016-07-19 04:23:57
【问题描述】:

我正在开发一个个人应用程序,使用 EMV 阅读器和 Javax SmartCardIO,我正在尝试从智能卡中获取所有纯数据,我一直在阅读规范和一些教程,甚至在这里阅读了一些问题,但我遇到一个问题:

我正在尝试获取 SFI 中记录的大小,以便使用该信息迭代所有记录。

我在一些教程中读到,我需要发送长度为 0 的请求,并且芯片将以错误代码和正确的记录长度(“6C XX”)来回答,但是在我的卡片中( Visa and AMEX)正在返回另一个响应,该响应转换为卡类型(“VISA ELECTRON and AMERICAN EXPRESS”),我没有收到“6c xx”错误。

到目前为止,我的代码如下所示:

byte[] commandArr = {(byte)0x00, (byte)0xB2, (byte)0x01, (byte)0x0C, (byte)0x00};
CommandAPDU commandTest = new CommandAPDU(commandArr);
ResponseAPDU test = this.channel.transmit(commandTest);
System.out.println(hexToAscii(bytesToHex(test.getBytes())));

两张卡都有 01 中第一个 PSE 记录的 SFI(通过 88 标签后的 select PSE 命令获得)。

我是使用这项技术的新手,我现在有点迷茫,欢迎任何帮助。

谢谢!

【问题讨论】:

    标签: java smartcard emv


    【解决方案1】:

    除了 Alexander Vaganov 的回答——javax.smartcardio 包会自动处理 61XX6CXX 情况,除非被告知不要这样做(通过 sun.security.smartcardio.t0GetResponsesun.security.smartcardio.t1GetResponse 系统属性)。

    将此属性设置为false 应该会产生预期的行为(即获得6CXX 状态字)。

    我不知道这方面的任何文档,因此请查看source code

    要禁用61XX6CXX 情况的上述自动处理,请将以下参数添加到java 命令行:

    -Dsun.security.smartcardio.t0GetResponse=false -Dsun.security.smartcardio.t1GetResponse=false
    

    祝你好运!

    【讨论】:

    • 您好,感谢您的回答,很抱歉询问,这是否意味着我必须下载源代码并重新编译库?谢谢!
    • @user2465233 您不需要更改源代码。您只需要设置系统属性(编辑答案)。
    • 再次感谢,这是我第一次这样做!
    【解决方案2】:

    当您以接触模式与卡建立连接时,您可以选择T0T1两种传输协议之一。它们的主要功能是相同的——与卡通信,但实现和接口不同。购物车可能支持这些协议之一或两者。不同之处之一是如何从卡中获得响应。在 T0 中,响应可能由两部分(命令)组成。当您获得 SW=61XX 其中 xx 响应长度时,您需要执行命令 GetResponce 00C00000XX 来“读取”响应数据。在 T1 中,您可以使用 SW 一次性获取所有数据。

    在您的情况下,它似乎使用 T1,因此卡返回所有数据而不 SW=61XX。

    文档的某些部分:

    public abstract Card connect(String protocol) throws CardException
    

    使用任何可用协议进行连接时使用的协议(“T=0”、“T=1”或“T=CL”)或“*”。

    public abstract ResponseAPDU transmit(CommandAPDU command) throws CardException
    

    实现应该透明地处理传输协议的工件。例如,当使用 T=0 协议时,应按照 ISO/IEC 7816-4 中的描述进行以下处理:

    • 如果响应 APDU 的 SW1 为 61,则实施应使用 SW2 作为 Lefield 发出 GET RESPONSE 命令。只要接收到 61 的 SW1,就重复该过程。这些交换的响应正文被连接起来形成最终的响应正文。
    • 如果响应 APDU 是 6C XX,则实现应使用 XX 作为 Le 字段重新发出命令。

    【讨论】:

    • 非常感谢Alexander,你帮了大忙,如果你想读取所有类型的银行卡,似乎有很多尝试错误。最后一个问题,你知道有没有办法从emv阅读器中获取持卡人的地址?
    • 不客气。持卡人的地址呢?EMV 卡保存了大量的技术信息,但是你找不到任何关于持卡人的个人信息。只有持卡人姓名和一些间接信息,如国家代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多