2015-04-05 140 views
3

我想写我的小程序,使其APDU命令和状态字在我的卡和我的阅读器之间的传输通道中不明确。我的意思是我不希望发送APDU命令和响应以便为第三方使用纯文本。Java卡小程序,安全数据传输和安全通道

我想我有两个选项:

  1. 选择我的小程序中的卡上,所有其他的命令后,执行对数据部分APDU的命令加密功能和解密他们的卡上之后分析它们。请注意,我无法使用此方法对整个命令进行加密,因为结果可能与另一个SELECT APDU命令发生冲突,并且卡的SD错误地将其识别为SELECT命令。是对的吗?

其框图:

enter image description here

  • 使用SD安全通道:据我所知的安全通道装置:的整个APDU命令响应以加密形式(即它们在源(安全域/读卡器)中加密并在目的地(Secutity域/读卡器)中解密)是正确的吗?据我所知SD执行cr yptography方法在这个机制中的作用和我的小应用程序和SD之间的通信是平淡无奇的(下图),对吧?
  • 其框图: enter image description here

    有没有其他办法?

    看来,第一个解决方案是不够的,因为:

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

    我说得对不对?

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

    1. 把卡在SECURED状态。由于用户无法在此状态下使用纯文本APDU命令与卡进行通信(对吗?),因此他必须使用安全通道将命令发送到我的小程序。对?如果它不正确,有什么方法可以强制SD仅与Secure Channel协同工作?

    2. 请任何生命周期,这是(例如OP_READY)的卡,而是在任何APDU命令的接收,检查CLA部分,看看它是否是安全的发送或不! (可能吗?安全通道中的CLA部分APDU命令和其他命令之间是否有区别?是吗?)

    有没有其他办法?

    最后的主要问题:

    如何使用SD来与我的小应用程序的安全通信?正如我以为我必须使用GlobalPlatform类(是吗?),我看看它的API。我在名为org.globalplatform.GPSystem的软件包中找到名为getSecureChannel的方法。我的方式是否正确?我必须使用这种方法吗?

    我知道这可能太长而无法回答,但我确信它不仅为我澄清了很多问题,而且也为其他未来的观众阐明了许多问题。

    我很欣赏任何身体在这个问题上为我阐明任何光。

    而一个示例小程序更明显。

    +0

    1.这是太多的问题。 2.有些问题不属于SO 3.这些问题是标准问题,已经解决了很多次4.为什么你不试图解决你的问题,而不是问问所有问题? – 2015-04-06 10:25:11

    +0

    @PaulBastian 1-你是对的,但我认为所有这些问题都是针对**一个**问题的。 2-那些与我的SO问题有关。 3-我可以请你把这些问题和答案转给我吗? 4-当然,我试图自己解决它们,但是我做不到。而且,我认为这个问题也能帮助未来的观众,不是吗? – Abraham 2015-04-06 11:04:07

    +0

    @Abraham你知道我可以如何将org.globalplatform导入到我的项目中吗?我认为它没有安装在我的系统上。从哪里我可以找到并下载它? – MJay 2016-01-06 11:55:57

    回答

    2

    我会为了回答:

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

    如果Applet是安全域(SD),那么我不是100%确定3是否正确。我对SD的说法可以说很少。 – 2015-04-16 10:35:35

    +0

    我高度赞赏你的时间,谢谢。 _标头只受认证标签保护._:这是什么认证标签?如果头部未在安全通道协议中加密,则第三方可以通过嗅探通道来获取头部。 – Abraham 2015-04-16 12:40:08

    +1

    @Abraham对。认证标签= MAC机制的结果。是的,标题通常是可见的。这是必需的,因为ISO/IEC 7816没有像应该那样分层(应用协议和传输协议混合在一起)。通常头文件不包含任何机密数据,但您应该记住使用P1/P2作为机密信息不是一个好主意。 – 2015-04-16 17:38:43

    2

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

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

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

    你应该保持卡安全状态。

    这是对安全通道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; 
         } 
        } 
    } 
    
    +0

    这实际上是如何使用实际的USB读卡器获得SecureChannel的? – codenamezero 2017-01-31 18:21:35