我只是在阅读 ISO/IEC 7816 第 4 部分标准。不幸的是,它对我来说有些模糊,我希望我能在这里得到答案。
第一个模糊点是关于Data Objects。定义了数据对象构成Simple-TLV或Ber-TLV类别,并对这些类别进行了一些描述。但是什么是数据对象本身?是我们存储在卡上的数据吗?如果是这样,据我所知,我们将数据存储在小程序的不同字段中,我们不考虑它们的任何BER-TLV或Simple-TLV类别!它们只是一系列十六进制数字。
第二个模糊点是关于结构选择部分。它被定义为我们可以通过以下五种不同的方式:
模糊的一点是,据我所知,我唯一可以在卡片上选择的东西是小程序,没有别的。对于小程序,我可以选择默认值(这可以是上述选项的第一种方式,隐式选择)或通过将 SELECT APDU 命令发送到带有 Applet AID 的卡片来选择它(上述任何一种方式都没有提到)。
那么这些结构选择方法是什么呢?
第三个模糊点是EF Structures。定义 EF-s 可以具有以下五种结构:
问题又来了,这些结构是干什么用的?这是数据在内存中存储的方式吗?如果是这样,为什么它们在标准中定义,而它们是关于卡片的内部行为?程序员需要了解它们吗?他/她可以检测/更改他/她的卡使用的EF结构吗?
最后,是否所有符合 ISO 7816-4 的卡都支持上述所有项目(因为我在 ISO 7816-4 中找不到任何提到它们是可选的或其他内容)?
是否所有符合 ISO 7816-4 的卡都需要支持在这部分标准中定义的 APDU 命令?
首先,ISO/IEC 7816-4 描述了基于文件的卡。基于文件的卡片可以有不同的应用程序(使用 SELECT by NAME 选择)。然而,最好将这些应用程序视为基于文件的操作系统中的不同数据结构和对象。这些应用程序不提供与Java Card 小程序不同的功能。
7816-3 尤其是 4 还描述了通用的半双工命令/响应 APDU 格式,这是卡符合 7816-4 的最低要求。Java Card 使用 APDU 格式,但它不包括模拟基于文件的卡的功能。你必须自己实现它(当然,或者从某个地方复制它)。
数据对象是具有类型(由标签描述)、大小(或长度)和值的对象:TLV。在 7816-4 中,卡中和运输中的物体都可以存在。最后,您只对输入输出感兴趣;你如何解释、存储或生成它们并不重要。
支持哪些文件选择和结构取决于卡的制造商。一般来说,基于文件的卡片需要支持所有的选择方法,但对于 Java Card 实现来说并不是那么清楚。许多 Java Card 小程序不支持 SELECT by PATH。SELECT by PATH 通常在 Java Card 上很麻烦,因为它不是由操作系统处理的,也不能由 Applet 处理(因为 Applet 实例不能只选择另一个 Applet 实例)。
是的,外部用户可以看到文件结构。实施的内容取决于。同样,基于文件的卡可能支持所有。例如,当您需要在卡上存储记录时,循环结构非常有用。不过,有限的内存可能会提示您删除最旧的记录。例如,您可以想象这用于数字行驶记录卡。记录启用使用 7816 兼容的 SQL 之类的命令进行搜索。
ISO/IEC 7816 是目前最差的标准之一。它确实没有说任何关于可选的东西,这可能会让你相信卡片确实应该实现一切。然而,一些声称合规的卡只保留在开始时定义的 APDU 结构。许多卡片并没有实现所有功能,而那些经常出错的卡片。
这只是我的头顶。
基本上,该标准更像是一组常见的做法。您可以将其用作创建自己的协议或标准的起点,但仅此而已。