-3

我们正在使用自定义智能卡,通过 COM(通过 USB)接口读取和写入数据。

每当我们添加或更新记录时,都需要对卡进行一些管理,以确保更新其他信息(主要是指针)。卡上的信息基本上是一个 64k 字节的数组。在单个添加或更新时,数据在字节数组中的不同点被读取和写入。

我想强制执行一种以原子方式进行整个更新的方法。如果我们在写入过程中拔出智能卡,数据很容易损坏,特别是因为本质上它只是一个连续的字节数组,一个字节错位会破坏整个数组的有效性。我想让这种情况发生的机会尽可能小。

我研究过TransactionScope,但这似乎主要用于数据库事务。这样的机制对我的问题有用吗,还是我应该寻找其他方法来强制我的软件块以有效的方式读写?

我们使用的智能卡由政府机构提供给我们,因此不会更改。它有一个存储芯片,与您在电话 SIM 卡上看到的相同,许多银行卡也有它(与磁条相反)。该卡是使用 ISO-7816-15 规范设计的。进出卡的接口最初是由另一个程序员设计的,他基本上对我说:我只处理字节输入和字节输出,我不做任何验证。这对我来说似乎很奇怪,因为我认为他有责任不让卡片如此容易损坏。显然它是我的。

我会研究更多的技术规格,尽管这让我走出了我的舒适区,除非我绝对需要,否则我不想弄乱他的代码。也许这张卡有一些比目前使用的更好的方法。

有一个简单的 READ 命令,它只支持一次读取 231 个连续字节。当我问他为什么会这样以及为什么我不能一次获得整个字节数组时,他说这就是所有卡的支持。所以阅读整个文件真的很尴尬。它变得更糟,因为一旦它“满”,它就应该跳到数组的开头。:S

4

2 回答 2

0

如果您有一张真正的智能卡(与存储卡相反,但我无法从“自定义智能卡”中获得它),将其内存寻址为字节数组是主机应用程序(一切)和智能卡应用程序(几乎没有)。这也使智能卡的事情变得更加困难,因为文件的校验和是一种标准机制,但如果您必须在校验和中集成一个 64kByte 数组,这可能需要相当长的时间。跨越多个语句的事务是不寻常的,但可能的(比较 ISO 7816 第 7 部分,它也在卡片 SQL 的附近,又名 CSQL);必须在文档中查找您的卡是否支持非 CSQL 序列。

我的建议是:

  • 尝试使用更多的卡片功能,在单个卡片命令中尽可能覆盖不同但相互关联的信息。(这也有助于在需要时提供细粒度的访问条件)。

  • 检查手册并可能使用其他制造商的卡,支持多报表交易。

于 2013-04-22T12:09:48.540 回答
0

您已经表明您正在使用基于文件的智能卡,因为 ISO 7816-15 定义了用于查找文件和对象(例如卡上的密钥)的“目录结构”。智能卡是可以以某种方式编程的处理器卡(直到它们被融合,并且只有当您当然可以访问正确的密钥时)。

基于文件的卡基于 ISO 7816-4,如果您想对智能卡进行任何操作,它应该是您库存的一部分。其中有关于文件应该是什么样子的定义。听起来您正在处理支持循环 EF 的卡,这是一种不太常见的基本文件 (EF) 结构。

在 ISO 7816-4 中也有确定文件大小的方法。通常,此信息是使用 FCI(文件控制信息)信息返回的,该信息由 FID APDU 指令从正确格式化的 SELECT FILE 返回。要将所有数据作为事务读取,只需读取所有信息并在返回指示错误的 ISO 7816-4 状态字或发生传输错误时返回某种异常。

现在写入数据有点问题,因为您需要智能卡的支持才能完成这样的事情。许多卡确实支持这种功能,主要表示为“卡撕裂”支持,因为一旦卡突然从读卡器中取出(!),所有电源都会从处理器中断开。

您可以在一种方法中结合上述两种方法(聚合 APDU 调用)来创建事务。无论如何,在内存中缓冲所有数据应该很容易,我们这里不是在谈论千兆字节的数据。

于 2013-04-25T21:11:42.683 回答