如何验证Java Card上是否已安装指定AID的Applet
Java Card Applet存在性校验实现方案
要校验指定AID的Applet是否存在,只需向卡片发送标准的SELECT BY AID指令,根据返回的响应状态码判断即可,具体实现如下:
核心指令说明
标准SELECT AID指令的参数如下:
- CLA:
0x00(标准命令类) - INS:
0xA4(SELECT指令标识) - P1:
0x04(指定按AID选择对象) - P2:
0x00(要求完全匹配AID,返回首次匹配结果) - 数据域:你的Applet AID对应的字节数组,即
01 02 03 04 05 06 07 08 09 00 - Le:
0x00(允许卡片返回最多256字节的响应数据,无特殊需求可留空)
完整代码实现
import javax.smartcardio.*; public class AppletChecker { // 你的Applet AID,16进制字符串转字节数组 private static final byte[] TARGET_AID = new byte[]{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00 }; public boolean isAppletInstalled(CardChannel channel) throws CardException { // 构造SELECT APDU命令 CommandAPDU selectCmd = new CommandAPDU( 0x00, // CLA 0xA4, // INS 0x04, // P1 0x00, // P2 TARGET_AID // 数据域为目标AID ); // 发送命令并获取响应 ResponseAPDU resp = channel.transmit(selectCmd); // 获取响应状态码SW1+SW2 int sw = resp.getSW(); // 状态码0x9000表示选择成功,Applet存在 if (sw == 0x9000) { return true; } // 状态码0x6A82表示未找到对应AID的对象,Applet不存在 else if (sw == 0x6A82) { return false; } // 其他状态码可根据实际业务场景处理,这里默认返回不存在 else { return false; } } // 调用示例 public static void main(String[] args) throws Exception { // 你原有连接卡片的逻辑 TerminalFactory factory = TerminalFactory.getDefault(); CardTerminal terminal = factory.terminals().list().get(0); Card card = terminal.connect("T=0"); CardChannel channel = card.getBasicChannel(); AppletChecker checker = new AppletChecker(); boolean installed = checker.isAppletInstalled(channel); if (installed) { System.out.println("Applet已安装"); } else { System.out.println("Applet未安装,可执行安装流程"); } // 断开卡片连接 card.disconnect(false); } }
补充说明
- 不同厂商的Java Card实现可能存在小差异,若出现非
0x9000和0x6A82的响应码,可参考对应卡片的技术手册判断 - 若你的卡片要求使用安全通道发送命令,需要先完成安全通道认证再发送SELECT指令
内容的提问来源于stack exchange,提问作者Salomon Diei
相关产品推荐
相关产品推荐

