编码 APDU 命令以验证 PIN 的问题

Posted

技术标签:

【中文标题】编码 APDU 命令以验证 PIN 的问题【英文标题】:Problems coding an APDU command to verify PIN 【发布时间】:2014-08-06 09:04:02 【问题描述】:

我正在尝试使用javax.smartcardio API 发送 VERIFY (pin) 命令。我的密码是 12345678。

根据我在网上找到的一些示例,我尝试使用此 APDU:

00 20 00 83 08 01 02 03 04 05 06 07 08

但结果是: 69 84 (reference data invalid).

我也尝试过:

00 20 00 83 08 12 34 56 78

但我仍然遇到同样的错误。

根据我的 SmartCart 规范,该卡支持:

ISO 7816 智能卡类型 A、B 和 C(5 V、3 V、1.8 V) 与通信协议 T=0、T=1 兼容 支持 PPS(协议和参数选择)

我有点绝望,因为我找不到出路。您能否建议我对我的 APDU 进行一些更改,或者甚至是一种完全不同的方法(另一种库或语言来连接我的智能卡)?

【问题讨论】:

从“无效”更改为“无效”和一些格式。该卡规范非常笼统,它本身并没有说明如何处理 PIN,除了它将可能使用VERIFY 命令。第五个字节是命令数据(PIN)的长度,所以你的第二次尝试显然是无效的。 【参考方案1】:

由于您的卡是 ISO 7816,请参阅以下 link 第 6.12 节中的 APDU。

你需要做的是:

    检查使用的参考数据 (P2)。对于 PIN,通常是“01”或“81”。但是,请再次从您的卡供应商那里检查正确的。 在执行实际的 VERIFY 命令之前,首先尝试获取剩余的尝试。这将帮助您避免锁定 PIN,因为每次错误验证都会减少您剩余的尝试次数。这可以通过设置 Lc = '00' 并删除您的命令数据来完成。响应为 SW1='63' 和 SW2='CX',其中 X 表示剩余的尝试次数。 APDU 命令示例:00 20 00 81 00 您需要将您的 PIN 码转换为 ASCII 十六进制字节。因此,如果您的 PIN 是 12345678,那么 APDU 就是 00 20 00 81 08 31 32 33 34 35 36 37 38

【讨论】:

感谢您的友好回复。好吧,我发现发送 00 20 00 83 00 会产生结果“63 CF”和返回字符串“非易失性内存已更改”。似乎前进了一步。但是尝试使用 00 20 00 83 08 31 32 33 34 35 36 37 38 的 PIN 仍然返回 ": 69 84 "Reference data invalidated" 。我可以假设至少我猜到了正确的参考数据 (P2) 吗?谢谢! 不,你不能假设。实际上,这是一个很好的迹象,表明它是正确的。而且 - 在这种情况下很重要 - 它是“参考数据无效”而不是“参考数据无效”。 谢谢。嗯,P2 参考数据没有被卡供应商公开,所以我唯一的机会是用一些从 00 到 99 循环的代码行来猜测它。希望我能找到一些东西。 @user2824073:实际上合理的范围是 0x01..0x1F 和 0x81..0x9F。 非常感谢,我已经把正确的值设为 0x90。我还有一个问题,但我会为它打开一个单独的线程。

以上是关于编码 APDU 命令以验证 PIN 的问题的主要内容,如果未能解决你的问题,请参考以下文章

APDU 命令将更改的 PIN 写入卡

使用 smartcardio 签署文件

APDU 更改 Mifare Ultralight C 身份验证

APDU FF 88 00 给出的长度不正确

使用 ISO 7816-4 APDU 的 DESFire 卡中的外部身份验证

使用 APDU C# 设置自己的身份验证密钥 MiFare Classic