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

Abr*_*ham 6 javacard globalplatform

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

我想我有两个选择:

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

它的图表:

在此处输入图片说明

  1. 使用SD安全通道:据我所知的安全的信道的装置:全体APDU命令响应以加密的形式发送(即,它们在源(安全域/卡阅读器)和解密加密的目的地(与危机干预域/卡Reader). 是吗?据我所知,SD 在这个机制中执行加密方法的角色,我的小程序和 SD 之间的通信是简单的(下图),对吧?

它的图表: 在此处输入图片说明

有没有其他办法?

似乎第一个解决方案还不够好,因为:

  1. 我必须自己实现!:)
  2. 我们无法对第三方隐藏所有部分的命令和响应。(我们只能隐藏数据)

我对吗?

现在,假设我想确保我的小程序仅适用于使用安全通道传输的 APDU 命令。我想我又有两个选择:

  1. 将卡置于SECURED状态。由于用户在这种状态下无法使用纯文本 APDU 命令与卡通信(对吗?),因此他必须使用安全通道将命令发送到我的小程序。对?如果不正确,是否有任何方法可以强制 SD 仅使用安全通道?

  2. 将卡保持在它所处的任何生命周期(例如 OP_READY),但相反,在接收任何 APDU 命令时,检查CLA部分以查看它是否是安全传输的!(这可能吗?CLA来自安全通道的部分 APDU 命令和其他命令之间有什么区别吗?我说得对吗?)

有没有其他办法?

最后是主要问题:

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

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

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

一个示例小程序更可观。

小智 5

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

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

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

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

这是安全通道 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Maa*_*wes 4

我按顺序回答:

  1. 是的,对于 ISO/IEC 7816-4,仅数据部分被加密。标头仅受身份验证标签保护。
  2. 不,全球平台安全通道也只是(可选)加密数据。不过,完整性是在标头和命令数据之上的。
  3. 不,安全状态仅适用于 Global Platform,您必须使用卡上 GP API 自行编程。GP API 具有执行身份验证、请求安全通道和检索当前状态的访问方法。
  4. 正确,CLA 字节确定 APDU 是否已加密(但不是如何加密)。如果 CLA 的第一位为零,则您的安全通道必须符合 ISO/IEC 7816-4。