使用不同的 SC 系列探测智能卡:清除 SC 状态的命令

smartcard probing with different SC families : command to clean the SC state

我想从一堆来自不同供应商、不同用途、不同 APDU 的智能卡中读取一些基本信息。 例如:国家识别智能卡、EMV(支付)、手机SIM、javacard等...

我写了一个 Java 应用程序。 让我将 SC 系列命名为 A B C D E 并使用相同名称的 5 个子例程,每个子例程都具有正确的 APDU 以读取一个特定 SC 系列的基本信息。

不幸的是,我发出例程的顺序会影响成功的结果。

示例:使用子程序顺序 A B C D E,我可以读取 A B C D 类型的 SC,而不是 E。

如果我将执行顺序更改为 E A B C D,我可以读取 E,但现在我无法读取类型为 C 的 SC。

我明白:一些 SC 丢弃外来的 APDUs ...其他 SC "hangs"。

是否有清除智能卡状态的基本命令(和 reader)?

所以子程序的执行顺序不会改变输出?

A 重置 B 重置 C 重置 D 重置等...

是ATR吗?是否对每种 SC 都是强制性的?

你描述的行为听起来很奇怪,因为智能卡 reader 不应该在不同的智能卡之间保持状态。

但是,我不知道有什么通用命令可以重新启动智能卡 readers。例如 HID OMNIKEY readers,您可以使用专有 APDU FF 70 07 6B 08 A2 06 A1 04 A9 02 83 00 00 重新启动(参见 here [7.6.3],尽管本指南说它适用于 OMNIKEY 5022 readers,它适用于更多的 OMNIKEY readers)。因此,对于您的 reader,您必须在互联网上搜索类似的专有 APDU。

请记住,reader 重启也很可能会导致 USB reader 重新枚举。

您可以使用 Card.disconnect() method to reset card (beware of this).

但是(恕我直言)最好的方法是使用卡片 ATR(由 Card.getATR() 给出)来猜测正确的卡片系列(如果可能)。这种方式也快得多。我将这种方法用于处理几种不同的非接触式卡产品的演示,并且效果很好。


一些额外的(随机)注释:

  • 研究所有家庭的文档——肯定有这种行为的原因。尝试跳过一些子例程 and/or 他们的 APDU 命令来固定它。

  • 此外,某些 APDU 可能会在意外发送时引起问题(例如锁定的密码或锁定的身份验证尝试)。你应该知道你在做什么。

  • 大多数产品系列都有一些可靠的检测方法——如果有文档,请参阅文档。

  • 如果任何先前调用的子例程使用 SELECT 更改 selected application/file 并成功它保持 selected。考虑在每个子例程的开头使用明确的 SELECT(例如 select 预期的 AID 或主文件)。

  • DESFire 卡在收到非本机命令 APDU 后离开本机模式并进入包装模式(这可能不是您的情况,因为您通常在使用 javax.smartcardio 时使用 ISO 包装命令)。

祝你好运!