2015-04-05 51 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