You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java Card读写存储姓名?附示例(基于JCIDE 5.0)

Java Card 姓名存储与读取实现指南(JCIDE 5.0)

核心思路

  • 利用Java Card的持久化存储(byte[]数组)保存姓名的字节数据(需统一编码,如UTF-8)
  • 定义两类APDU指令:一类用于写入姓名数据,一类用于读取已存储的姓名
  • 在Applet的process方法中处理指令,完成存储与读取逻辑

代码实现

完整Applet代码

package com.example.namecard;

import javacard.framework.*;

public class NameCardApplet extends Applet {
    // 指令定义:写入姓名/读取姓名
    private static final byte INS_WRITE_NAME = (byte)0x01;
    private static final byte INS_READ_NAME = (byte)0x02;
    
    // 持久化存储姓名的字节数组
    private byte[] name;

    private NameCardApplet() {}

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new NameCardApplet().register();
    }

    public void process(APDU apdu) {
        if (selectingApplet()) {
            return;
        }

        byte[] buffer = apdu.getBuffer();
        byte ins = buffer[ISO7816.OFFSET_INS];

        switch (ins) {
            case INS_WRITE_NAME:
                writeName(apdu);
                break;
            case INS_READ_NAME:
                readName(apdu);
                break;
            default:
                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

    private void writeName(APDU apdu) {
        byte[] buffer = apdu.getBuffer();
        short dataLen = apdu.setIncomingAndReceive();
        
        // 初始化/扩容存储数组,保证持久化
        if (name == null || name.length < dataLen) {
            if (name != null) JCSystem.requestDeletion(name);
            name = new byte[dataLen];
            JCSystem.makePersistent(name);
        }
        
        // 复制输入数据到存储数组
        Util.arrayCopy(buffer, ISO7816.OFFSET_CDATA, name, (short)0, dataLen);
        ISOException.throwIt(ISO7816.SW_NO_ERROR);
    }

    private void readName(APDU apdu) {
        byte[] buffer = apdu.getBuffer();
        
        if (name == null || name.length == 0) {
            ISOException.throwIt((short)0x6A83); // 无存储数据
        }
        
        // 复制存储数据到APDU缓冲区并返回
        short len = (short)name.length;
        Util.arrayCopy(name, (short)0, buffer, (short)0, len);
        apdu.setOutgoingAndSend((short)0, len);
    }
}

JCIDE 5.0 操作流程

  1. 创建新Java Card项目,选择适配的Java Card版本(推荐3.0.5及以上)
  2. 将上述代码放入项目包路径下,编译生成CAP文件
  3. 启动JCIDE模拟器,加载生成的CAP文件并选择Applet
  4. 发送APDU命令测试:
    • 写入姓名示例:00 01 00 00 05 4A 6F 68 6E 44(存储"JohnD",UTF-8字节长度5)
    • 读取姓名示例:00 02 00 00 00,模拟器会返回存储的字节数组,转码后即可得到姓名字符串

关键注意事项

  • 姓名转字节数组时需固定编码(如UTF-8),写入与读取阶段编码必须一致
  • 处理APDU数据时要校验长度,避免数组越界
  • 若读取时返回6A83,说明卡内无已存储的姓名数据

内容的提问来源于stack exchange,提问作者bujji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:52:39