<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 93,  comments - 2,  trackbacks - 0

    JAVA卡介紹

     

    JAVA卡與智能卡

        什么是 JAVA 卡呢?JAVA 卡是一種可以運行 JAVA 程序的接觸式微處理器智能卡。1996 年 11 月,JAVA 卡 1.0 版本的規范正式發布了。如今 JAVA 卡最新的規范已經到了 2.1 版。

    相信對智能卡比較了解的讀者一定會問:智能卡的出現和使用已經快有二十年了,為什么會在最近出現 JAVA 卡的呢?為什么 JAVA 卡會變得如此受歡迎?為了回答這個問題,我們先來回顧一下 JAVA 卡出現之前的智能卡,看看它存在著什么樣的問題。

    JAVA卡之前的智能卡

        早期的智能卡主要是以一種介質形式出現的,它可以在卡體內存儲金額,從而能在公共電話機或自動售貨機上被使用。它完成的是一種存儲信息的應用。這時卡的需求量并不大。同時卡的應用也不多。而近來,隨著智能卡地越來越智能”,由于智能卡的優點越來越被人認可,它的應用范圍也越來越廣泛:從銀行的借貸卡,存放個人醫療信息的醫療卡,到有線和無線網絡的安全模塊卡等等。智能卡的應用可以說是涉及到了各個領域,幾乎每個人都要與智能卡打交道。市場的需求量急劇上升,同時越來越多的智能卡新應用也隨之誕生。

    但與智能卡需求量急劇上升所矛盾的是:智能卡應用的研發是一個復雜漫長的過程。盡管對智能卡的結構大小和通信協議,國際規范 ISO7816 早已規定,但各個卡生產商對智能卡的研制都各不相同。各個卡生產商對自己的智能卡操作都有自己獨特的一套指令集。
    此外,智能卡編程接口(APIs)非常復雜,用之編程,需要開發人員非常熟悉低層通信接口協議,內存管理和一些智能卡硬件的細節。因此,在開發智能卡應用之前,開發人員就需要花費大量時間來了解智能卡的復雜開發環境,而且在他們研究后會發現并不存在現代化的開發工具(象 Visual Studio 那樣工具)。更糟糕的是:對不同的智能卡并沒有一個通用的開發環境。每次你要開發一種新的應用,可能你都必須從新了解一種新的開發環境。

    情況有可能還沒有這么簡單。由于所有的智能卡都是在專門的開發環境中開發出來的,不同的卡的生產商生產出來的相同應用的卡可能并不兼容,這使同一系統中使用不同生產商的卡變得很復雜。
    據估計,2001 年,智能卡的需求量為 10-30 億片。而了解智能卡編程的人員少之又少。智能卡編程的復雜性,不統一性將嚴重阻礙智能卡的發展。市場的需求為智能卡的發展提出了新的要求。然而這一切將隨著 JAVA 卡的出現而改變。


    JAVA卡的出現

        JAVA 卡是一種可以運行 JAVA 程序的接觸式微處理器智能卡,在卡中運行的程序叫 Applet。Applet 可以動態裝載到 JAVA 卡上。JAVA 卡的 API(JAVA Card 2.1.1 Application Programming Interfaces Specification )為智能卡制定了一個 JAVA 語言的特殊子集。如今95%智能卡制造商已經支持了 JAVA 卡的 API。JAVA 卡和 JAVA 卡 API 的出現使智能卡的編程變得既快又簡單,同時這些卡的應用程序(Applet)可以在任何支持 JAVA 卡 API 的智能卡上運行??梢哉f JAVA 卡的出現立刻解決了 JAVA 卡出現之前智能卡所遇到的問題。
    JAVA 卡是如何完成這一巨大的功能的呢?原來在 JAVA 卡內有一個能執行 JAVA 字節碼(Applet)的 JAVA 虛擬機-它提供一整套標準的 JAVA 卡編程的 API,使得開發人員無需了解復雜的智能卡硬件和智能卡專用的技術,就可以進行智能卡應用的開發,從而大大減少開發時間和降低開發難度。據粗略的統計,用 JAVA 來編程可以比用 語言來編程節約 60% 的開發時間,如與智能卡特殊的匯編語言來比,這種優勢將更為明顯。同時由于 JAVA 虛擬機的使用,JAVA 卡的 Applet 能夠在不同卡片的 JCAE(JAVA Card Application Environment)上執行,即透過 JAVA 虛擬機的機制來達到跨平臺的能力。

    JAVA 是一種面對對象的編程語言,智能卡的基于對象的 API 大大簡化了卡內 Applet 與終端或后臺服務器的通信。

    JAVA 卡的另一巨大優勢是:開發人員可以任意選擇他們所熟悉和喜歡的開發工具。由于對 JAVA 卡的編程是用 JAVA 語言,所有幾乎當今所有流行的 JAVA 開發環境,如 VJ++,Vcafe ,都可以被用來進行 JAVA 卡的開發。正因如此,快速完成和調試 JAVA 卡的應用程序也變為了可能。而在這之前,調試卡的應用程序是一個極復雜漫長的過程,因為應用程序首先要被裝載到卡的 ROM 中,而裝載到卡的 ROM 中的程序是無法更新的,所以對一個應用程序的調試將占用大量的時間。

    同時由于任何 JAVA 開發人員都可以變為 JAVA 卡開發人員,這就為智能卡的發展提供了強有力的保證。
    JAVA 卡還有兩大優點:支持一卡多用途和重用。支持一卡多用途是指 JAVA 卡上可以同時存在多個不同的應用。這些應用可以來自同一個卡供應商,也可以來自不同的卡供應商。這樣一張 JAVA 卡就可以完成不同的功能,例如,它可以有電子錢包功能,同時也可以有身份鑒別功能。重用是指 JAVA 卡上的應用可以根據需要進行刪除或重新添加新的應用,而無需更換新的智能卡,這樣大大增強智能卡的靈活性。
    綜上所述,JAVA 卡的出現統一了智能卡的編程接口(API),統一了智能卡的編程語言(JAVA 語言),為智能卡的更大范圍的使用提供了基礎,真正使智能卡行業成為一個統一標準的產業。


    JAVA卡的結構

        可以說 JAVA 卡是 JAVA 平臺中最小的子集。JAVA 卡 2.1 的規范可以在 http://www.javasoft.com/javacard 這個網址得到。JAVA 卡 2.1 規范主要包括有:JAVA 卡虛擬機規范,JAVA 卡編程接口(API)和 JAVA 卡運行環境規范。

    JAVA 卡有點象一部功能齊全,但規模較小的電腦,其硬件主要是為了保證 JAVA 卡的運行環境的需要,其最小的硬件配置要求為:

    n 512 bytes RAM:主要用于存放程序執行時的堆棧、暫存資料以及做為I/O的緩沖區。 

    n 24 KB ROM:主要用于存放操作系統以及運行環境(Runtime Environment),如 JAVA 虛擬機、Applet 等。 

    n 8 KB EEPROM:用于儲存我們開發并裝載至 JAVA 卡上的Applet。 

    n 8-bit processor: JAVA 卡需要至少8位的處理器支持。

    那么 JAVA 卡的內部結構究竟是怎么樣的呢?根據上述的硬件介紹,基本上我們可以將 JAVA 卡想像為一部 PC 的縮影:JAVA 卡的內部結構由 OS、native functions、JAVA VM(JAVA 虛擬機)、JAVA Framework 以及架構在此上的應用程序(Applet)所構成。下圖即為 JAVA 卡內部結構:
    在此結構中,最底層的 OS(操作系統) and Native Functions(基本函數)是負責低層的處理工作,如同 PC 的操作系統。

    n JAVA 虛擬機處于OS and Native Functions 之上,它的存在實現了卡接口的統一和編程語言的統一。并且也隱藏了卡底層各個卡供應商不同的技術。 

    n JAVA 卡 Framework 為開發人員定義了一整套編程接口類,主要負責執行 JAVA 卡 Applet 以及提供 Applet 執行所需要的環境。 

    n Industry Add-on Classes 則是服務方所提供的類,使得企業與公司能夠提供屬于自己的服務程序,例如,如果這張卡是 GSM 網絡的 SIM 卡,那么這一層就是 SIM 卡所需的接口類。 

    n JAVA 卡的最上層就是所謂的 JAVA 卡 Applet,也就是我們要進行開發的應用。如圖所示,一個 JAVA 卡可以執行多個 JAVA 卡 Applet。每個 Applet 是靠 AID (應用ID)來識別的。但是要特別注意,JAVA 卡的執行環境并不支援多線程,所以一次只能執行一個 Applet,并且 Applet 與 Applet 之間也有防火墻的阻隔。


    JAVA卡的生命期

    n JAVA 卡的生命期

    當 JAVA 卡的 OS,虛擬機,編程接口(API)類庫裝載到卡的 ROM 之后,JAVA 卡即開始了它的工作使命。這個把 JAVA 卡的固定不變的組件放入芯片的不可重寫區域(ROM)的過程叫掩膜(MASK)。不過,要使 JAVA 卡真正能使用還要兩個必須的過程:初始化和個人化。初始化是指:在卡體內(一般在 EEPROM )創建文件結構。這個文件結構是大家都有的,它的具體內容是與你這張 JAVA 卡的功能有關。比如:你的卡是銀行卡,那么卡內結構就是由銀行業規定的結構;如卡是 SIM 卡,那么卡的結構就要根據 GSM 規范來定。初始化并沒有涉及到個人信息。如果卡要發行給指定的某個人,就要通過個人化過程來完成。個人化就是把個人信息附于卡。它可以是物理過程,如打印某人的照片;也可以是電子過程:把個人信息寫入卡中。如你的 ID 號,PIN 碼等等。初始化和個人化可以由制卡商或發行商來完成。當初始化和個人化完成后,這張 JAVA 卡就可以被使用了。你可以把卡插入讀卡器,對它發出 APDU 指令,或下載更多的 Applet。JAVA卡的生命期將一直持續到它被物理損害,被不正確的操作鎖死或卡的應用過期。 

    n JAVA 卡虛擬機的生命期
        與 PC 中的 JAVA 虛擬機不同,JAVA 卡中的虛擬機將永遠運行。那怕掉電后,卡上的信息也將被保存下來。所以 JAVA 卡虛擬機的生命期是與 JAVA 卡生命期一致的。當沒有電源時,虛擬機就象在一個無限大的時鐘頻率下運行。 

    n JAVA 卡 Applet 的生命期
        Applet 開始于 Applet 被安裝并在卡的注冊表中注冊,終止于 Applet 被從注冊表中注銷。一般 Applet 在卡中是沒有被激活的,只有當這個 Applet 被終端選擇”(Select)到時,Applet 才被激活。


    JAVA卡的JAVA語言

    JAVA 卡的程序當然是由 JAVA 語言寫的。也是由一般的 JAVA 編譯器編譯的。但由于 JAVA 卡硬件限制(內存大小,CPU 的能力),JAVA 卡并不支持所有的 JAVA 語言的特性。以下的 JAVA 語言特性,JAVA 卡是不支持的:

    n 動態類裝載(Dynamic class loading) 

    n 安全管理(Security manager) 

    n 對象克隆(Object cloning) 

    n finalize()方法 

    n 一些數據類型:float,double,long,char 

    n 多線程

    而這些關鍵字也不被支持:native,synchronized,transient,volatile。同時幾乎所有的 JAVA 核心 API 的類都不被 JAVA 卡支持,只有一些從 JAVA.lang package 來的類才被支持。
    JAVA 語言其他的特性,JAVA 卡都支持。有關 JAVA 卡 JAVA 語言詳細資料,請參閱 JAVA Card 2.1.1 Virtual Machine Specification.

    JAVA卡的API

        n 根據 JAVA 卡 2.1 的規范規定(JAVA Card 2.1.1 Application Programming Interface),目前 JAVA 卡共支持 個 Packages (),現就其中一些重要的類進行介紹:

        n java.lang package:提供 JAVA 語言一些重要的類,如 Object 類,因為所有的 JAVA 類皆繼承它。 

        n Object – class(說明它的類型為class,若寫interface,說明類型為接口,以下相同),所有類的基類 

        n Throwable – class, 為所有 error 及 exception 的父類,這表示 JAVA 卡也支持 exception

        n javacard.framework package :是 JAVA 卡 API 主要的核心 package,提供并實現了 JAVA 卡 Applet 基本的接口與工具。

        n AID – class,用來唯一表示 JAVA 卡 Applet 的 ID 號 

        n APDU – class,通過一個 byte 數組緩沖來接收與傳送終端的指令與回傳 Applet 執行的結果與狀態的標準格式。這一過程與我們在上一篇文章介紹的APDU是完全一樣的。我們在進行 Applet 開發時,可以想象 APDU 是一個卡與終端通信的緩沖區,終端和卡都把信息放入這一緩沖進行通信。 

    n Applet – class,每一個 JAVA 卡的 Applet 都必須繼承此類。其中在實現時要特別注意幾個方法,如 select()、 deselect() 是終端根據 Applet 的 AID 下達選擇或不選擇。而 install()register() 則是 Applet 裝載至 JAVA 卡上,并向 JAVA 卡注冊表進行注冊的方法 。等到 Applet 安裝注冊完成,并且被終端所選擇時,所有下達的 APDU 命令都會交由 Applet 的 process() 方法來處理并負責回傳結果。 

        n IOS7816 – interface,提供了 ISO7816 所使用的常數值 

        n PIN – interface, 使其子類通過實現此接口完成驗證 PIN 碼的功能 

        n Shareable – interface,使得不同的 Applet 能夠通過實現此接口來達到互相溝通的功能 

        n JCSystem – class,負責管理 Applet 與 JAVA 卡的系統資源,如 AID 與 Transaction 的管理。 

        n OwnerPIN – class,繼承自 PIN interface,負責維護卡片持有人的 PIN 碼,并提供相關 check() 與 update() 等方法。 

        n Util – class,一個提供常用工具的類 ,如 byte 數組拷貝與比較等功能。

        n javacard.security package:提供安全機制的包,其中幾個重要的 interface(接口)class(如下:

        n Key – interface,是 DESKey、 PrivateKey、 PublicKey等接口的共同接口 

        n KeyBuilder – class,創建各種安全的 key 的工廠(factory) 

        n MessageDigest – class,可以將信息做數字簽名的對象

        n javacardx.crypto package:其中包含了關于加密與安全的對象,而此 package 僅包含了一個接口與一個類:

        n Cipher – class ,使得在 JAVA 卡中的信息得以加密保護

        以上只是簡單的介紹了一下 JAVA 卡 API 的接口,我們將通過一些例子進行詳細介紹,當然最完整的資料和解答還    得    參    考: JAVA Card 2.1.1 Application Programming Interface規范。
    

    Applet 的簡單例子

     
        以下我們介紹一個極為簡單的 Applet 的例子,通過對它的介紹,我們將初步了解 Applet 的組成結構,和一些必須實現的方法(構造函數,install()方法,register()方法,select()方法,process()方法)。這個例子完成的功能是:當讀卡器對 JAVA 卡發送取隨機數的APDU(00 84 00 00 04)指令時,JAVA 卡會返回4個字節的16進制隨機數的響應。

    package Random;

    import javacard.framework.Applet;

    import javacard.framework.ISO7816;

    import javacard.framework.ISOException;

    import javacard.framework.APDU;

    import javacard.framework.JCSystem;

    import javacard.framework.Util;

    import javacard.security.*;

    import javacardx.crypto.*;

    /**

     * @author Administrator

     *

     */

    public class Random extends Applet {

    /* 定義用到的常量 */

    //CLA

    final static byte CLA_Getchallenge = (byte)0x00;

    //INS

    final static byte INS_Getchalleng = (byte)0x84;

    /* 定義變量 */

    RandomData Random;

    /* 安裝applet */

    public static void install(byte[] bArray, short bOffset, byte bLength) {

    // GP-compliant JavaCard applet registration

    new Random().register(bArray, (short) (bOffset + 1), bArray[bOffset]);

    }

        /* 處理讀寫設備發來的指令 */

    public void process(APDU apdu) {

    // Good practice: Return 9000 on SELECT

    if (selectingApplet()) {

    return;

    }

    byte[] buf = apdu.getBuffer();

    switch (buf[ISO7816.OFFSET_INS]) {

    case (byte) INS_Getchalleng:

    byte LE = buf[ISO7816.OFFSET_LC];

        byte[] RandomBuffer = new byte[LE];

        short ROffset = (short)0;

        short Len = (short)LE;

        RandomBuffer = JCSystem.makeTransientByteArray( Len,

      JCSystem.CLEAR_ON_DESELECT);

        Random = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);

        Random.generateData(RandomBuffer,ROffset,Len);

        Util.arrayCopyNonAtomic(RandomBuffer,(short)0,buf,(short)0,Len);

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

    break;

    default:

    // good practice: If you don't know the INStruction, say so:

    ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

    }

    }

    }



    posted on 2014-03-14 17:48 Terry Zou 閱讀(215) 評論(0)  編輯  收藏 所屬分類: JavaCard

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2014年3月>
    2324252627281
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    Java

    搜索

    •  

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级毛片免费在线| 亚洲videos| 91亚洲国产在人线播放午夜| 亚洲日韩中文字幕| 亚洲欧美日韩自偷自拍| 美女羞羞喷液视频免费| 精品久久久久久国产免费了| 亚洲免费人成在线视频观看 | 一级毛片在播放免费| a级片免费在线观看| 91人成网站色www免费下载| 精品女同一区二区三区免费站| 四虎影视www四虎免费| 亚洲午夜AV无码专区在线播放| 亚洲色图在线播放| 亚洲欧美国产国产一区二区三区 | 精品女同一区二区三区免费播放 | 亚洲日韩激情无码一区| 亚洲不卡视频在线观看| 精品韩国亚洲av无码不卡区| 中国毛片免费观看| 91香蕉视频免费| 久久青青草原亚洲av无码| 久久久亚洲欧洲日产国码是AV| 亚洲国产成人精品无码区二本 | 精品亚洲成AV人在线观看| 亚洲国产精品无码久久| 国精产品一区一区三区免费视频| 日韩欧毛片免费视频| 亚洲片国产一区一级在线观看| 91亚洲国产在人线播放午夜| 色多多免费视频观看区一区| 在线看片免费人成视久网| mm1313亚洲精品无码又大又粗| 亚洲首页在线观看| 一本到卡二卡三卡免费高| 午夜性色一区二区三区免费不卡视频| 免费v片视频在线观看视频| 亚洲无成人网77777| 亚洲免费日韩无码系列| 免费无码AV电影在线观看|