gpt4 book ai didi

javacard - Java Card 小程序、安全数据传输和安全通道

转载 作者:行者123 更新时间:2023-12-04 18:05:30 27 4
gpt4 key购买 nike

我想以一种方式编写我的小程序,它的 APDU 命令和状态字在我的卡和我的读卡器之间的传输 channel 中不清楚。我的意思是我不想将 APDU 命令和响应发送为第三方的纯文本。

我想我有两个选择:

  • 在卡上选择我的小程序后,对于所有其他命令,在上做一个加密功能。数据部分 APDU 命令并在卡上解密它们,然后分析它们。请注意,我无法使用这种方法加密整个命令,因为结果可能与另一个 SELECT 冲突。 APDU 命令和卡的 SD 将其识别为 SELECT命令错误。那正确吗?

  • 它的图表:

    enter image description here
  • 使用 SD 安全 channel :据我所知,安全 channel 意味着: APDU 命令 回复 以加密形式传输(即它们在源(安全域/读卡器)中加密并在目标(安全域/读卡器)中解密。对吗?据我所知,SD 在此执行加密方法的作用我的小程序和 SD 之间的机制和通信很简单(下图),对吗?

  • 它的图表:
    enter image description here

    有没有其他办法?

    似乎第一个解决方案还不够好,因为:
  • 我必须自己实现! :)
  • 我们无法对第三方隐藏所有部分的命令和响应。(我们只能隐藏数据)

  • 我对吗?

    现在,假设我想确保我的小程序仅适用于使用安全 channel 传输的 APDU 命令。我想我又有两个选择:
  • 把卡放进SECURED状态。由于用户在这种状态下无法使用纯文本 APDU 命令与卡通信(对吗?)因此他必须使用安全 channel 将命令发送到我的小程序。对?如果不正确,是否有任何方法可以强制 SD 仅使用安全 channel ?
  • 将卡保持在它所处的任何生命周期(例如 OP_READY),但相反,在接收任何 APDU 命令时,检查 CLA 部分以查看它是否是安全传输的! (这可能吗?来自安全 channel 的 APDU 命令的 CLA 部分和其他命令之间有什么区别吗?我说得对吗?)

  • 有没有其他办法?

    最后是主要问题:

    如何使用 SD 与我的小程序进行安全通信?因为我认为我必须使用 GlobalPlatform 类(我是吗?),所以我查看了它的 API-s。我找到了一个名为 getSecureChannel 的方法在名为 org.globalplatform.GPSystem 的包中.我的方式正确吗?我必须使用这种方法吗?

    我知道回答这个问题可能太长了,但我相信它不仅为我,也为其他 future 的观众澄清了很多问题。

    我很感激任何机构为我解决了这个问题。

    一个示例小程序更可观。

    最佳答案

    不用担心通过小程序的安全 channel 通信。如果您在小程序中使用 Global Platform API,这将非常简单。

    您不需要考虑很多问题,只需尝试编写一个安全 channel 小程序,它就会按照命令数据中定义的安全级别处理您的小程序。

    请参阅 GP 安全 channel API:
    http://www.win.tue.nl/pinpasjc/docs/apis/gp22/

    并且您应该将卡保持在 SECURED 状态。

    这是安全 channel scp02 的示例小程序:

    package secureChannel;

    import javacard.framework.APDU;
    import javacard.framework.Applet;
    import javacard.framework.ISO7816;
    import javacard.framework.ISOException;

    import org.globalplatform.GPSystem;
    import org.globalplatform.SecureChannel;

    public class Scp02 extends Applet
    {
    final static byte INIT_UPDATE = (byte) 0x50;

    final static byte EXT_AUTHENTICATE = (byte) 0x82;

    final static byte STORE_DATA = (byte) 0xE2;

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

    public void process(APDU apdu) throws ISOException
    {
    SecureChannel sc = GPSystem.getSecureChannel();

    byte[] buffer = apdu.getBuffer();

    short inlength = 0;

    switch (ISO7816.OFFSET_INS)
    {
    case INIT_UPDATE:
    case EXT_AUTHENTICATE:
    inlength = apdu.setIncomingAndReceive();
    sc.processSecurity(apdu);
    break;

    case STORE_DATA:
    //Receive command data
    inlength = apdu.setIncomingAndReceive();
    inlength = sc.unwrap(buffer, (short) 0, inlength);

    apdu.setOutgoingAndSend((short)0, inlength);

    //Process data
    break;
    }
    }
    }

    关于javacard - Java Card 小程序、安全数据传输和安全通道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29455715/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com