??? 摘? 要: 對基于Java卡(嵌入了Java卡虛擬機(jī)的智能卡)技術(shù)的移動平臺的安全機(jī)制及其實(shí)現(xiàn)方法作了分析,給出了ARM9平臺與智能卡硬件的互聯(lián)方法和軟件通信機(jī)制,重點(diǎn)闡述了利用Java技術(shù)在嵌入式平臺上使用智能卡進(jìn)行數(shù)字證書申請、簽名及驗(yàn)證操作的邏輯和實(shí)現(xiàn)方法。?
??? 關(guān)鍵詞: Java卡; SATSA; 公鑰基礎(chǔ)設(shè)施; 移動平臺;智能卡
?
??? 隨著科學(xué)技術(shù)的迅猛發(fā)展,智能移動平臺已成為新的發(fā)展亮點(diǎn),但移動平臺上的安全問題卻相對薄弱。當(dāng)利用移動智能平臺進(jìn)行電子商務(wù)、移動辦公時,如何與從未謀面的合作伙伴、機(jī)構(gòu)等建立信任關(guān)系、彼此驗(yàn)證身份是一個非常現(xiàn)實(shí)的問題?,F(xiàn)有的方法大多是以網(wǎng)絡(luò)服務(wù)商或銀行系統(tǒng)等作為安全服務(wù)的認(rèn)證中心,但這些認(rèn)證服務(wù)都各自獨(dú)立,存在很大局限性。建立一套統(tǒng)一的認(rèn)證系統(tǒng)是我國信用體系的發(fā)展方向,國內(nèi)一些大城市已經(jīng)陸續(xù)建立CA中心。本文介紹利用Java卡技術(shù)在嵌入式平臺上實(shí)現(xiàn)的一種客戶端原型系統(tǒng)。?
1 Java卡介紹 ?
??? Java卡是智能卡的一種,它通常由8位處理器和有限的RAM及非易失性存儲器(EEPROM或Flash)組成。高端的Java卡還帶有RSA加解密專用芯片以及32位處理器,可以把Java卡看成是一種安裝了Java虛擬機(jī)的智能卡。在虛擬機(jī)上可以運(yùn)行各種Java小程序,這種小程序叫做Applet。每個Applet之間被內(nèi)部防火墻隔開,這使得Java卡可以支持一卡多用。?
??? Java卡框架集成的服務(wù)能對外提供基本的密鑰生成、簽名驗(yàn)證等服務(wù),同時它還能夠存儲各種數(shù)字證書、密鑰對(key pairs)、電子錢包數(shù)據(jù)等。由于采用特有的硬件安全措施,且對私鑰的各種操作都在卡內(nèi)完成,不允許復(fù)制與傳出,避免了密鑰被泄露的風(fēng)險。Java卡也因具有很高的安全性而成為PKI技術(shù)最理想的選擇。?
2 硬件設(shè)計(jì)?
??? 本實(shí)驗(yàn)平臺為AT91SAM9260芯片的嵌入式平臺,此芯片是基于ARM9內(nèi)核并帶有Java硬件加速模塊的芯片。軟件平臺為Linux 2.6.19 OS并移植了基于CDC的JVM嵌入式虛擬機(jī)。圖1為嵌入式平臺與智能卡相連接的電路圖。?
?

?
??? 圖中AT9260的TCLK0、TIOA1與智能卡時鐘信號端CLK相連,為智能卡內(nèi)部的CUP和數(shù)據(jù)傳輸提供3.7 MHz外部時鐘脈沖。TIOB0與智能卡的I/O口相連,提供半雙工異步串行通信。TIOB1與智能卡的RST端相連,為智能卡提供復(fù)位信號。?
3 Java卡與移動終端之間的通信?
??? Java卡與移動平臺之間的通信有兩種通信協(xié)議。一種是基于程序協(xié)議數(shù)據(jù)單元(APDU)的消息傳送協(xié)議,它符合ISO/IEC 7816-3、7816-4國際標(biāo)準(zhǔn)。另一種是基于遠(yuǎn)程方法調(diào)用(JCRMI)協(xié)議,它是分布式對象模型的一個子集。這時Java卡小應(yīng)用程序(Applet)相當(dāng)于一個服務(wù)器,而讀卡器端的程序相當(dāng)于客戶端[1]。?
??? 在JSR-177規(guī)范中定義了安全與信任服務(wù)API(SATSA:Security and Trust Services API),它提供了嵌入式平臺與Java卡的通信功能。SATSA屬于可選包之一,在移植JVM時必須安裝。當(dāng)J2ME應(yīng)用程序與Java卡通過APDU協(xié)議進(jìn)行連接時,需要調(diào)用javax.microedition.io.Connector.open()方法來建立連接,并使用exchangeAPDU()方法向Java卡發(fā)送命令。操作完成后使用javax.microedition.io.Connection.close( )方法斷開連接。?
4 數(shù)字證書的申請?
4.1 根證書申請?
??? 瀏覽器軟件中一般都存儲了一個自簽名證書列表(self-signed certificate list)也叫Root CA根證書列表,它是各CA中心給自己的身份信息及其公鑰的一個自簽名證書組成的列表,這個列表是在瀏覽器軟件制作的過程中加入的。如果用戶準(zhǔn)備注冊的CA中心的根證書不在這個列表中,可以先到CA中心填寫申請信息,這時CA中心的審核授權(quán)部門(Registry Authority)會審核申請,申請通過,會發(fā)給用戶一個參照號 Ref.number 及 Auth.code號。有了這兩個號碼,申請人可通過瀏覽器下載安全根證書。根證書列表是各CA中心簽署所有證書的信任基礎(chǔ)。?
4.2 數(shù)字證書的申請?
??? 當(dāng)用戶登錄到CA中心進(jìn)行證書申請時,會要求下載一個CA中心簽名的安全插件,這時瀏覽器會在根證書列表中查找相應(yīng)的公鑰并對插件的簽名進(jìn)行驗(yàn)證。安全插件安裝后會調(diào)用Java卡內(nèi)部的服務(wù)生成簽名密鑰對,并把密鑰對添加到內(nèi)部的安全存儲區(qū)中,同時在卡內(nèi)部對注冊信息進(jìn)行簽名,然后發(fā)送到CA中心注冊。CA中心的簽名服務(wù)器反饋數(shù)字證書給移動終端,終端保存數(shù)字證書到Java卡中。基本過程如圖2所示。?
?

?
??? 數(shù)字證書申請通過調(diào)用generateCSR(java.lang.String nameInfo,? java.lang.Stringalgorithm, intkeyLen, intkeyUsage, java.lang.StringsecurityElementID, java.lang.Stringsecurity?ElementPrompt, booleanforceKeyGen)方法實(shí)現(xiàn)。該函數(shù)首先會讀取智能卡中的密鑰和證書,如果有多對密鑰和證書,則會進(jìn)一步提示選擇哪一個密鑰用于申請數(shù)字證書。如果沒有找到密鑰,這時設(shè)置forceKeyGen標(biāo)志位,申請產(chǎn)生新密鑰。選擇完后會把有關(guān)信息簽名后發(fā)送到CA中心的注冊服務(wù)器。服務(wù)器返回數(shù)字證書。這時再調(diào)用addCredential(java.lang.String certDisplayName, byte[]pkiPath, java.lang.Stringuri)方法將證書存儲到智能卡中。?
5 數(shù)字簽名與證書驗(yàn)證過程?
5.1 數(shù)字簽名過程?
??? 簽名時使用sign(java.lang.String stringToSign, intoptions, java.lang.String[]caNames, java.lang.StringsecurityElementPrompt)方法。其中參數(shù)stringToSign就是待簽名的字符串,它必須符合UTF-8標(biāo)準(zhǔn),簽名產(chǎn)生的加密摘要符合RFC2630標(biāo)準(zhǔn)。參數(shù)caNames指定簽名密鑰。在簽名過程,sign()方法會通過APDU協(xié)議調(diào)用卡上的簽名服務(wù)。它首先使用摘要算法產(chǎn)生一個16 B的摘要,然后使用非對稱加密算法用私鑰對摘要加密。基本過程如圖3 所示。?
?

?
5.2 簽名驗(yàn)證過程?
??? 在數(shù)字證書中記錄了摘要版本號和生成摘要的算法信息。待驗(yàn)證信息首先拆分成原始信息和摘要密文兩部分,原始信息通過證書中提供的摘要版本號選擇對應(yīng)的摘要算法對原始信息進(jìn)行摘要計(jì)算,接著使用對方的簽名公鑰對加密摘要進(jìn)行解密。解密后的摘要值與先前計(jì)算出的摘要值進(jìn)行對比,如果一致,說明這份信息真實(shí)可靠,沒有被他人截獲偽造。在驗(yàn)證過程中驗(yàn)證用戶還需要發(fā)送消息到證書庫查明簽名用戶證書的狀態(tài)和有效性。簽名驗(yàn)證使用authenticate(byte[] byteArray ToAuthenticate, intoptions, java.lang.String[] caNames, java.lang.StringsecurityElementPr-ompt )方法。其中byteArrayToAuthenticate參數(shù)為待驗(yàn)證的信息,caNames指定驗(yàn)證使用的密鑰對。當(dāng)調(diào)用驗(yàn)證函數(shù)后,函數(shù)會把待驗(yàn)證信息發(fā)送到卡中進(jìn)行簽名驗(yàn)證并返回驗(yàn)證結(jié)果。驗(yàn)證邏輯如圖4所示。?
?

?
6 實(shí)驗(yàn)及結(jié)果?
??? 實(shí)驗(yàn)中對字符串“基于Java卡技術(shù)的移動平臺安全研究與實(shí)現(xiàn)”用私鑰進(jìn)行了簽名。其中簽名私鑰為0123456789,摘要算法采用 SHA1,加密算法選用1024位RSA。通過客服端調(diào)用Java卡中的簽名服務(wù),返回結(jié)果如下:?
??? 基于Java卡技術(shù)的移動平臺安全研究與實(shí)現(xiàn)iQCVAw?UBSG5Go7C6kfBHes8iAQKy4gP/Vil3eIqv/YOewJETaD3Qpc?WtxZnP4woiLCU1D+oitJ4NFycM+JUToJ3DMXUf57T5OZKft8wohMA6fPlqmhAC48ovVbJX6RCC7XUcveTZuIgaWPQtE/svw?
X6IdeVojg/idOL2NCdL5yFhO40w54Jhf5OipKTI3bKncWncUijw?NgU==EWFm?
??? 在驗(yàn)證過程中,當(dāng)把上面的字符串發(fā)送到卡中,最后運(yùn)算結(jié)果返回“true”,表白驗(yàn)證成功。?
??? 本文重點(diǎn)闡述嵌入式系統(tǒng)與Java卡交互的工作機(jī)制和數(shù)字簽名在客戶端的實(shí)現(xiàn)方法。利用Java技術(shù),有效降低了智能卡程序開發(fā)的難度。使得Java開發(fā)人員無需深入了解復(fù)雜的智能卡硬件和智能卡專用技術(shù)就能進(jìn)行開發(fā)。同時在不同的Java卡上的應(yīng)用也可以很方便地移植。?
參考文獻(xiàn)?
[1] Sun Microsystems Inc. Java card platform specification?2.2.2.[S].?
[2] Sun Microsystems Inc. IncSecurity and trust services?API (SATSA) for Java 2 platform[S], Micro Edition?Version 1.0, 2004.?
[3] Fabio Martinelli, Paolo Mori. Enhancing Java security?with history based access control[C]. FOSAD 2006/2007, LNCS4677, 2007.?
[4] 劉春,熊璋. Java卡平臺安全性研究與應(yīng)用.計(jì)算機(jī)工程與設(shè)計(jì)[J], 2004(10).?
[5] 馬多賀. Java智能卡開發(fā)及應(yīng)用技術(shù)研究[D]. 哈爾濱工業(yè)大學(xué)學(xué)報, 2006(6).?
[6] 謝冬青,冷鍵.PKI原理與技術(shù).北京:清華大學(xué)出版社[M], 2004(1).
