是否可以保存发送到该applet中的Java Card applet的所有APDU命令?例如:终端发送00 B2 01 0C 00
,我想将它保存在我的小程序中的某个位置,以便稍后能够分析它。记录Java Card applet中的所有APDU
回答
当然可以。需要生成某种持久性缓冲区。有很多技巧可以做到这一点。
最简单的方法是生成一个列表,其中每个节点都包含一个新的阵列,在该阵列中复制该命令。只需首先确定命令大小,然后复制所有内容。不要忘记复制类型2和类型4命令的Le字节。
可能最好的方法是生成一个巨大的数组并将每个命令复制到它。持久性数组只是使用new byte[size]
生成的字段。请注意,数组的最大大小为32 Ki - 1您可能希望将命令的大小存储在命令之前,或存储在单独的持久数组中。
由于卡持久存储的数量通常非常少,您可能需要生成某种循环缓冲区,您可以在其中重新使用或覆盖最旧的命令。请注意,通常没有垃圾回收可能,如果存在,通常只在启动时运行,可能需要很长时间。
您可以立即复制小程序的process
方法中的标题。一旦收到字节,您应该只复制其余的命令数据,例如对于Le字节使用setIncomingAndReceive
并最后使用setOutgoing
/setOutgoingAndSend
。
最后你还需要一些命令来读出日志。请注意,如果包含Le字节,则命令可以是4 + 1 + 255 + 1 = 262
字节。命令响应仅保存256个字节+状态字。因此,您可能需要将其读取为多个部分,例如使用计数器来指示特定的APDU和偏移量。
扩展长度的APDU本身应该有一章,所以我现在就把它们留下。
我也将离开实际执行情况,如果你不介意的锻炼,你可能有一个接口,如:
interface APDULogger {
short logNewCommand(byte[] commandHeader, short commandHeaderOffset);
void logNc(short nc);
void logCommandData(byte[] commandData, short commandDataOffset, short commandDataSize);
void logNe(short ne);
}
和
interface APDURetreiver {
void retrieveCommand(short history, byte[] commandHeader, short commandHeaderOffset);
short retrieveNc();
short retrieveCommandData(byte[] commandData, short commandDataOffset, short maxCommandDataSize);
short retrieveNe();
}
但请记住,这只是我头脑中的最高点。您可能还想保留一些状态(称为logNe(short)
方法签名两次可能是错误)。
我没有说它本身很容易。 –
+1循环缓冲区是一个不错的解决方案。但是,要小心它的大小 - 如果时间太短,很快就会损坏持久存储器。另一件事是你应该实现某种开关来启用/禁用日志,你应该启用它来进行调试 - 这种日志记录机制会显着减慢整个applet的速度。 – vojta
全部都是如此。当然,你有一个选择:要么使用大量的内存(可能不存在)*或*重用内存。但是你是对的,通常在写入10K或更多之后,智能卡可能会在一天之内完成。至于减速:写入持久性内存通常非常缓慢,尽管每种内存类型都不相同。 –
- 1. Java Card中的Applet ID和APDU
- 2. Java Card中的En-/Decryption输出+相应的APDU
- 3. 使用Java Card钱包
- 4. APDU更新记录
- 5. 使用ACR122安装Java Card applet
- 6. 在Java applet中加载目录中的所有文件
- 7. Java applet重设所有cookies?
- 8. 记录所有Java输入
- 9. java的记录所有的SQL到Oracle
- 10. 写入记录使用APDU命令
- 11. Java Card applet可以自动“自动选择”吗?
- 12. OTI Copni设备Java Card Applet安装失败
- 13. 所有记录
- 14. Java Card Shuffling App
- 15. 如何在Selenium中记录Java Applet的脚本?
- 16. ClassNotFoundException Java Applet中的错误使用<applet>标记
- 17. 将applet安装到java卡的APDU命令的顺序是什么?
- 18. 使用Java在mysql中删除表中的所有记录
- 19. 在java中检索Berkeley DB中的所有记录
- 20. MongoDB中获取的所有记录的Java API
- 21. 得到子记录所有父记录
- 22. 创建的所有记录
- 23. Rails的 - 让所有记录
- 24. MySQL的:从所有记录
- 25. 查询不返回所有记录,需要所有记录
- 26. 如何记录mobilefirst java适配器中的所有异常?
- 27. WebView中的Java Applet
- 28. Firefox中的Java Applet
- 29. XUL中的Java applet
- 30. Java - Applet中的java.lang.UnsupportedClassVersionError
你的意思是存储在Java卡内?或者在运行时/终端/ IFD /等调用Java卡? –
我的意思是存储在Java卡内供以后分析 – Clarke