Javacard - 垃圾回收期间断电

6

我在使用智能卡(NXP J2E145, J3A081, J3C145和Omnikey 5121读卡器)时发现了一些非常奇怪的行为:在调用JavaCard方法后出现了电源丢失。

JCSystem.requestObjectDeletion()

可能会损坏卡片:在大约10%的这种电源中断后,ATR命令非常缓慢(1000ms),我对任何其他APDU(应用程序选择、卡管理器身份验证等)都没有响应。

我知道requestObjectDeletion()的行为取决于供应商特定的实现,所以我的问题相当广泛和开放......

垃圾收集通常在单个事务中处理吗?

是否有任何“官方”建议,在可能发生电源故障的情况下不要调用requestObjectDeletion()?

您是否有NXP卡类似的经验?

编辑:

  • 所有我的智能卡上都是JCSystem.isObjectDeletionSupported()== true。
  • 尝试连接已损坏卡的卡管理器应用程序时,Eclipse IDE中的JCOP shell报告如下:
  • ATR: 3BFB9600008131FE454F4450204D41502053414D3E

    ATR: T = 1
    jcshell:终端存在未知问题。 最后一个终端错误:由于I / O设备错误,无法执行请求。


你有检查过 boolean JCSystem.isObjectDeletionSupported() 吗? - Paul Bastian
我没有亲自测试过,但是垃圾回收器通常都能正常工作,而且不会抛出任何异常。在调用requestObjectDeletion后,读卡器会有约5秒钟的操作(读卡器上的灯会闪烁),EEPROM也会被清除(我已经检查过了)。唯一的问题是如果在此过程进行中从读卡器中拔出卡片,那么这张卡片似乎有时会损坏。 - vojta
亲爱的vojta,能告诉我你的电子邮件地址吗?我也在研究NXP智能卡。我相信你可以给我很多帮助,但是我不能在这里问我的问题,因为其中一些不是主题相关的。 - user3739941
抱歉,我的小程序非常复杂,是商业安全项目的关键部分,所以我真的不能与您分享任何代码。如果您有任何问题,请使用 Stack Overflow。 - vojta
这不是一个单卡单读卡器的问题。在我们公司,到目前为止已经有大约20张损坏的卡片,在多台电脑和其他机器(例如现金机)上进行了测试,使用了四种读卡器类型和各种软件...重启真的没有帮助...感谢您的建议! - vojta
显示剩余3条评论
1个回答

6

我认为这可能是一个实现错误。通常,在智能卡上不需要也不使用垃圾收集。

通过良好的应用程序设计,您应该避免任何情况下都需要进行垃圾收集。这样,您就永远不会遇到内存问题。应用程序通常只在其生命周期内安装一次,并应在卡的余生中可用。

垃圾收集通常对于正常使用情况来说太耗时了。也许这就是Java Card或底层系统库的程序员没有预期它会在安全环境之外发生的原因。


1
我在整个applet的生命周期中只调用一次垃圾回收器,这对我来说不是关键问题,我可以轻松避免它。另一方面,我认为所有提供的功能都应该是安全且可靠的。智能卡首要用于安全令牌。如果在NXP卡中存在此类错误,则必须在其所有文档的首页上用巨大的红色字体描述。没有人知道,在这样一个不成功的垃圾回收之后,EEPROM发生了什么事情!我已经向NXP提出了问题,并在获得答案的同时发布他们的答案。感谢您的回答,Paul! - vojta
@vojta他们真的确认了吗?所以在可能发生断电的情况下,我们不应该调用requestObjectDeletion()吗? - Ebrahim Ghasemi
2
@Abraham,很抱歉因为保密协议我不能透露任何细节。不过,我接受了Paul的答案,所以他们很有可能已经确认了 :-) - vojta
有些生产环境甚至都需要很长时间。话虽如此,只有在个性化之后,如果有必要的话,它才应该被放置。即便如此,在将其送往现场之前最好重置和启动该卡... - Maarten Bodewes
@paul-bastian,您有没有关于Applet设计的书籍或网站建议,可以使垃圾回收变得不必要?我在哪里可以了解到应该做什么和不应该做什么? - Dirk Jäckel
我认为只有一本来自陈志群的不错的书,但它已经相当老了。其余的则是实践和经验。 - Paul Bastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接