【问题标题】:How to get SAK to Identify smart card type using JAVA?如何让 SAK 使用 JAVA 识别智能卡类型?
【发布时间】:2013-04-12 09:06:40
【问题描述】:

我正在使用 Java Smart Card API 进行访问。 我有 NXP Mifare desfire 4K、1K、Ultra light 智能卡,并试图在 JAVA 中以编程方式找出它的类型。

我参考了 NXP 网站 (http://www.nxp.com/documents/application_note/AN10833.pdf) 的文档 AN10833。 我有以下相关查询:

  1. 如何使用 JAVA 获取 SAK?
  2. 执行 REQA 命令的 APDU 是什么?

【问题讨论】:

  • 向我们展示您尝试过的东西,我们或许可以为您提供帮助。
  • 通过使用 Native 命令,我已经检索到以下信息,1)cmd : 90, 60,00,00,00 response> 04 01 01 00 02 18 05 2)cmd : 90,AF, 00,00,00 响应 > 04 01 01 00 06 18 05 3)cmd : 90,AF,00,00,00 响应 04 2C 32 F9 B8 23 80 8F D5 15 49 20 10 09. 这里 UID- 04 2C 32 F9 B8 23 80 批号 - 8F D5 15 49 20 周 10 年 09 UID[0] 是 04 NXP Semiconductors。但是我无法通过上述命令返回的信息来识别卡的类型是超轻还是其他。
  • 您是否尝试按照package summary of javax.smartcardio末尾的步骤进行操作?
  • 有一种方法可以使用 Get DATA APDU 来获取 ATQA SAK UID 为:0xFF,0xCA,0xF0,0x00,0x05,但响应为空白?
  • javax.smartcardio包总结最后的步骤是执行APDU命令。我正在使用相同的方法来执行我的 APDU 命令。

标签: java smartcard


【解决方案1】:

找出卡的ATR,ATR包含卡类型的信息。我在这里上传图片查看 ATR 的结构... 欲了解更多信息Here the full PDF 请看第 6 页。

【讨论】:

  • 非常好的回答,vikky。我唯一的评论是,对于非接触式卡,我的公司通常将此信息称为非接触式卡的 ATS(选择答案而不是重置答案)。 +1 希望会有更多的支持...
【解决方案2】:

编辑:很抱歉,这并没有直接回答问题,但当前的最佳答案可能有害。我正在尝试了解如何获取 SAK,我自己会尝试发布更新。

从 ATS/ATR 确定卡类型是司空见惯的,但却是错误的。 NXP 建议使用 SAK。

"由于不同MIFARE IC的ATS可以定制,所以 当然不建议依靠 ATS 来区分 IC 类型”

参考:http://www.nxp.com/documents/application_note/AN10833.pdf

相反,请在此处查看有关如何从 SAK 确定卡类型的详细树: http://www.nxp.com/documents/application_note/130830.pdf

顺便说一句,在生产过程中,如果您可以确信您的所有卡上始终会获得相同格式的 ATR/ATS,那么这可能是一个可行的选择。但不能保证。

我不知道 VCA 到底是什么,但从第一个文档来看:

“未来,NXP 建议使用“虚拟卡架构 (VCA)” 用于PICC选择和类型识别。如果安装不 取决于卡的 ATQA、SAK 和/或 ATS 的实际内容 选择和识别,这允许多个 MIFARE 产品同时在单个设备中启用 时间。在这种情况下,VCA 允许高效且隐私友好 选择目标 MIFARE 产品。这在一个 单独的应用说明。”

【讨论】:

  • 后期跟进:我们始终无法找到令人满意的解决方案。由于 ATS/ATR 是可定制的,我们能找到的最佳方法就是进行上下文相关检查。示例:调试程序将允许您选择要尝试的卡类型,并返回是否可以获得连接。这意味着我们不能说尝试了错误的类型,只能说无法获得连接。
【解决方案3】:

我知道这是一个旧博客,但我一直在研究同样的问题并想分享我的发现。

在 AN10833 中明确指出,UID + SAK 是通过执行选择返回的。使用 java smartcard io 库,我可以执行如下选择:

// Send pseudo APDU to retrieve the card serial number (UID)
int cla = 0xFF;
int ins = 0xCA;
int p1 = 0x00;
int p2 = 0x00;
byte[] data = null;
int dataOffset = 0x00;
int dataLength = 0x00;
int le = 0x00;

CommandAPDU getDataApdu = new CommandAPDU(cla, ins, p1, p2, data, dataOffset, dataLength, le);
ResponseAPDU r1 = channel.transmit(getDataApdu);

但是,我只返回了 UID。我在 PC/SC API 上找到了更改 P1 = 0x01 将更改对历史字节的响应的文档(这对我有用)。

(此处的第 3.2.2.1.3 节:http://pcscworkgroup.com/Download/Specifications/pcsc3_v2.01.09.pdf

不幸的是,对于我可以访问的现成读者,我找不到返回 SAK 的参数。在另一个阅读器的 API 文档中,我发现如果 p2 = 0x01,则返回 ATQA + UID + SAK(此阅读器是专用的,我无法共享文档)。

我相信,如果您的阅读器支持它(或者您的编码水平足够低以控制阅读器本身),您可以获得/请求确切的 SAK。否则您可能需要使用 ATS/ATR 来确定卡类型。

注意,在 Java 中,这里是获取 ATS/ATR 的代码:

// wait 10 seconds for a card
CardTerminal terminal = terminal.waitForCardPresent(10000);

Card card = terminal.connect("*");
ATR atr = card.getATR();

从那里,ATR 可以像上面提到的 vikky 一样处理。

我会用我学到的任何其他东西来回应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2011-12-18
    • 2011-02-18
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多