如何获得唯一的智能卡ID?
How to get a unique smart card ID?
我正在寻找一种方法来为我使用的每张智能卡找到唯一编号。我听说每张卡都有唯一的IC制造日期、IC序列号和IC批号。
如何从我的卡中获取这些信息?
对于大多数用例,PC/SC UID 应该足够了。这是一个 4 到 7 字节的标识符,在与卡建立 非接触式 通信时无论如何都会被读取。虽然有些卡可能被配置为 return 随机 UID,但是如果您的项目卡在控制之下,这不是问题
肯定每个硬件供应商都会将上述信息集成到芯片中。不幸的是,这会留下以下问题:
- 操作系统可能会或可能不会提供这些信息
- 在全局维护的单字节制造商 ID 下,几个硬件供应商之间几乎没有共同点(参见 chip manufacturer byte);因此晶圆上的 x 和 y 坐标可能会根据制造商的不同而有不同的偏移量,并且该块的长度甚至可能会因芯片而异。在任何情况下都需要硬件参考手册。
总结:如果你需要一个独特的信息,规范必须在一开始就说明这一点,很可能是通过指定的指令来检索它。在多供应商环境中,其他一切都可能失败。剩下的唯一选择就是,添加一种ID作为自己管理的用户数据。
亚伯拉罕追加:
由于问题带有 javacard
标记,我们断定您的卡是 GlobalPlatform 兼容卡。
1:对于 GP 卡,SD(安全域:默认安装在卡上的强制性小程序)负责 returning 卡特定数据,包括 IC 制造日期、IC 序列号和IC 批次标识符等。只要您没有在卡和卡外实体之间使用安全通道,就不能信任 SD 响应。但为什么?因为任何恶意用户都可以编写一个简单的小程序,其 AID 等于您的卡 SD 的 AID returns his/her 任意数据到您的命令并将其安装到智能卡上并使其默认选中。在这种情况下,当 he/she 将卡放在您的读卡器上时,他的小程序会响应您的卡外应用程序命令,并且您无法检测到假卡。
2:正如上面提到的亲爱的 guidot,不同的卡可能支持也可能不支持对 return 这些卡特定数据的相同命令。
因此,我建议您在小程序中添加一对 setSerialNumber()
和 getSerialNumber()
方法,并在您的 offcard 和小程序之间实施安全通道,以确保您的卡片的唯一性。
我正在寻找一种方法来为我使用的每张智能卡找到唯一编号。我听说每张卡都有唯一的IC制造日期、IC序列号和IC批号。
如何从我的卡中获取这些信息?
对于大多数用例,PC/SC UID 应该足够了。这是一个 4 到 7 字节的标识符,在与卡建立 非接触式 通信时无论如何都会被读取。虽然有些卡可能被配置为 return 随机 UID,但是如果您的项目卡在控制之下,这不是问题
肯定每个硬件供应商都会将上述信息集成到芯片中。不幸的是,这会留下以下问题:
- 操作系统可能会或可能不会提供这些信息
- 在全局维护的单字节制造商 ID 下,几个硬件供应商之间几乎没有共同点(参见 chip manufacturer byte);因此晶圆上的 x 和 y 坐标可能会根据制造商的不同而有不同的偏移量,并且该块的长度甚至可能会因芯片而异。在任何情况下都需要硬件参考手册。
总结:如果你需要一个独特的信息,规范必须在一开始就说明这一点,很可能是通过指定的指令来检索它。在多供应商环境中,其他一切都可能失败。剩下的唯一选择就是,添加一种ID作为自己管理的用户数据。
亚伯拉罕追加:
由于问题带有 javacard
标记,我们断定您的卡是 GlobalPlatform 兼容卡。
1:对于 GP 卡,SD(安全域:默认安装在卡上的强制性小程序)负责 returning 卡特定数据,包括 IC 制造日期、IC 序列号和IC 批次标识符等。只要您没有在卡和卡外实体之间使用安全通道,就不能信任 SD 响应。但为什么?因为任何恶意用户都可以编写一个简单的小程序,其 AID 等于您的卡 SD 的 AID returns his/her 任意数据到您的命令并将其安装到智能卡上并使其默认选中。在这种情况下,当 he/she 将卡放在您的读卡器上时,他的小程序会响应您的卡外应用程序命令,并且您无法检测到假卡。
2:正如上面提到的亲爱的 guidot,不同的卡可能支持也可能不支持对 return 这些卡特定数据的相同命令。
因此,我建议您在小程序中添加一对 setSerialNumber()
和 getSerialNumber()
方法,并在您的 offcard 和小程序之间实施安全通道,以确保您的卡片的唯一性。