java - 如何验证小程序是否已安装在 Java 卡上
问题描述
我正在编写一个程序,一旦将卡插入读卡器,它就能够自动上传小程序。
我已经完成了这部分,我希望能够在尝试再次安装之前验证小程序是否已安装在卡上。我正在使用该javax.smartcardio
软件包
这就是我认为我应该用来发送命令的东西:
Card card = terminal.connect("T=0");
CardChannel channel = card.getBasicChannel();
ResponseAPDU resp = channel
.transmit(new CommandAPDU());
但我不知道如何使用 may applet 的 AID 发送命令。我的小程序的 AID 是01020304050607080900
解决方案
每个小程序都有一个唯一的 AID(应用程序标识符)。您可以使用 GlobalPlatform GET STATUS 命令列出所有已安装的应用程序,但最简单的方法是只执行一个 SELECT 命令。如果安装了小程序,则 SELECT 命令将返回以 9000 作为状态字结尾的响应。6a82 表示“找不到文件”——这表示找不到文件,即未安装小程序。
命令是:
00A40404 <AID length> <your AID>
byte[] aid = {(byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08, (byte)0x09, (byte)0x00};
ResponseAPDU resp = channel
.transmit(new new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0xFF));
if (resp.sw == 0x9000) {
// applet is already installed
}
请注意,如果小程序安装失败,只会安装包,小程序不会被实例化并且无法通过这种方式检测到,但我假设您已经在安装过程中处理了这个问题。
另一种选择是让安装发生,通常在安装过程中报告的错误是0x6A89,意思是“文件已经存在”。
推荐阅读
- mysql - MySQL 错误 1148 和 1290:通过在 MySql Workbench 8 中导入 csv 文件来自定义日期类型格式 dd-mm-yyyy
- php - 获取 xml 文件以查找和替换文本。PHP
- node.js - Angular CLI 创建组件抛出错误;找不到 NgModule
- ios - 专门的 Cell.init(coder:) 崩溃
- javascript - 我需要在 Ajax 中传递什么才能通过 SFTP(JS + PHP)上传文件
- regex - 如何在 vimscript 或 UltiSnips 中扩展当前文件名而不使用“测试”
- mysql - MySql <> NULL 和 IS NOT NULL 的区别
- xml - 如何最大化 SVG 图表中的条形
- html - Bootstrap 4 表格垂直居中对齐
- php - 使用 PHP、Mysql、Js 创建云