摘 要: 針對(duì)利用網(wǎng)絡(luò)服務(wù)時(shí)產(chǎn)生許多憑證信息或重要信息需要妥善保管這一實(shí)際應(yīng)用問題,利用JavaCard技術(shù)并結(jié)合JAAS認(rèn)證和授權(quán)服務(wù),提出了基于Java智能卡的移動(dòng)解決方案,實(shí)現(xiàn)了用戶憑證信息管理的雙因素認(rèn)證防護(hù),并分析了該方案的安全機(jī)制,實(shí)現(xiàn)了用戶憑證信息安全" title="信息安全">信息安全。
關(guān)鍵詞: 憑證管理 JavaCard技術(shù) 智能卡
隨著因特網(wǎng)的普及,人們可以越來(lái)越多地使用網(wǎng)絡(luò)服務(wù),網(wǎng)絡(luò)服務(wù)在給人們帶來(lái)便利的同時(shí),也帶來(lái)了一些麻煩。用戶收發(fā)電子郵件需要憑證(用戶名/密碼或相關(guān)信息);登錄網(wǎng)上銀行需要相應(yīng)的憑證;訪問特定的信息也需要輸入憑證,類似的例子舉不勝舉。不同的系統(tǒng)平臺(tái)對(duì)信息認(rèn)證有不同的要求。而且用戶對(duì)各種各樣的憑證信息很容易遺忘或記錯(cuò)。毫無(wú)疑問,憑證對(duì)保護(hù)個(gè)人信息是至關(guān)重要的。憑證信息的可靠保存應(yīng)具備如下特征:
(1)憑證保存必須保證安全性。這表現(xiàn)在能正確保存各種用戶名、密碼等信息;防止黑客竊取憑證信息;保證憑證數(shù)據(jù)的私有性;需要對(duì)信息加密并安全存儲(chǔ)。
(2)用戶在需要時(shí)能方便地獲取憑證。這主要表現(xiàn)在憑證信息的可移動(dòng)性;用戶可以在任何需要的地方(如辦公室、家里等)獲取相應(yīng)的憑證訪問相應(yīng)的服務(wù);保存憑證的設(shè)備是可隨身攜帶的,甚至可放在錢包里(如智能卡)。
(3)保存憑證的技術(shù)需具有可移植性。JAVA語(yǔ)言編寫的軟件具有較強(qiáng)的可移植性,適用于不同的操作系統(tǒng)平臺(tái)。
基于上述三點(diǎn),明確了用戶憑證管理的解決方案:使用JavaCard技術(shù)和JAVA平臺(tái)設(shè)計(jì),一個(gè)用戶使用一張智能卡,用戶經(jīng)身份認(rèn)證" title="身份認(rèn)證">身份認(rèn)證后可對(duì)保存在智能卡中的憑證操作,該方案必須包含上述三點(diǎn)要求及安全性要求。
1 Java Card技術(shù)概述
Java Card最初由Schlumberger 提出,目前已被JavaSoft制定為一項(xiàng)標(biāo)準(zhǔn),作為一項(xiàng)極有潛力占踞主導(dǎo)地位的智能卡標(biāo)準(zhǔn)。Java Card技術(shù)使得Java語(yǔ)言編寫的程序能夠運(yùn)行在智能卡上或其他內(nèi)存受限的設(shè)備中。Java Card技術(shù)可被部署在許多產(chǎn)業(yè)部門,如手機(jī)、社會(huì)保障卡及金融服務(wù)等。Java Card技術(shù)包含三個(gè)部分:
(1)Java Card虛擬機(jī)(JCVM)規(guī)范,定義了用于智能卡的Java程序語(yǔ)言的一個(gè)子集和虛擬機(jī)規(guī)范。
(2)Java Card運(yùn)行時(shí)環(huán)境(JCRE)規(guī)范,定義了Java Card運(yùn)行時(shí)環(huán)境的行為:內(nèi)存管理、應(yīng)用管理、安全執(zhí)行,以及其他運(yùn)行時(shí)特性。
(3)Java Card應(yīng)用編程接口(API)規(guī)范,描述了專門為智能卡程序進(jìn)行程序設(shè)計(jì)所用的Java Card包和類核心及擴(kuò)展的集合。
以上三個(gè)部分為智能卡提供了一個(gè)安全的平臺(tái)。Java Card平臺(tái)依據(jù)智能卡廠商的特定技術(shù),將應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序拆分成小應(yīng)用程序,并且為這些小應(yīng)用程序提供標(biāo)準(zhǔn)系統(tǒng)和API接口。
Java Card規(guī)范使得Java技術(shù)能夠在智能卡和其他內(nèi)存受限的設(shè)備上運(yùn)行。Java Card技術(shù)具有獨(dú)特的優(yōu)勢(shì):
(1)互操作性。用Java Card技術(shù)開發(fā)的小應(yīng)用程序可以運(yùn)行在任何基于Java Card技術(shù)的智能卡上,而獨(dú)立于卡的生產(chǎn)商和底層的硬件。
(2)安全性。Java Card技術(shù)依賴于Java編程語(yǔ)言的內(nèi)在安全性,從而提供了一個(gè)安全可靠的執(zhí)行環(huán)境。
(3)多應(yīng)用并存。Java Card使得多個(gè)應(yīng)用程序可以在單個(gè)智能卡上并存。一張卡發(fā)放后,新的應(yīng)用程序可以安全地安裝。
(4)和現(xiàn)有標(biāo)準(zhǔn)的兼容性。Java Card API和現(xiàn)有的智能卡國(guó)際標(biāo)準(zhǔn)兼容,如ISO7816標(biāo)準(zhǔn)。
在Java Card技術(shù)中,即使卡被斷電以后,卡上存儲(chǔ)的幾乎全部信息都還保留著。持續(xù)內(nèi)存技術(shù)使得在掉電時(shí)智能卡仍然能保存信息。由于虛擬機(jī)和卡上創(chuàng)建的對(duì)象用來(lái)表示持續(xù)化信息,JCVM看起來(lái)一直在運(yùn)行。斷電時(shí),VM只是暫時(shí)停止。當(dāng)下次卡重新啟動(dòng)時(shí),VM重新啟動(dòng)并且從持續(xù)化存儲(chǔ)器中恢復(fù)前面的對(duì)象堆。除了其持續(xù)化特性,Java Card虛擬機(jī)和Java虛擬機(jī)是基本一樣的[4]。
2 基于Java Card的用戶憑證管理模型設(shè)計(jì)
根據(jù)Java智能卡的特點(diǎn)及用戶憑證管理的目的,可設(shè)計(jì)如下管理模型,如圖1所示。
該模型采用C/S結(jié)構(gòu),每一臺(tái)客戶應(yīng)用計(jì)算機(jī)作為Client,而java智能卡充當(dāng)Server角色,兩者通過(guò)與計(jì)算機(jī)相連的卡接收設(shè)備(CAD)連接??ń邮赵O(shè)備又可稱作終端、讀卡器和IFD(接口設(shè)備),它們都具有相同的基本功能,即向智能卡提供電源和建立數(shù)據(jù)傳輸連接。當(dāng)Client端某個(gè)服務(wù)需要輸入憑證(如用戶名/密碼)時(shí),讀卡器激活插入的java智能卡,經(jīng)驗(yàn)證java智能卡用戶身份后返回卡中相應(yīng)的憑證信息到Client端,這時(shí)候用憑證信息可以訪問相應(yīng)的服務(wù)資源。該方案利用二道關(guān)卡保護(hù)系統(tǒng)的安全,即雙因素認(rèn)證(two-factor authentication),通過(guò)安全裝置(用戶自己保管智能卡)和智能卡的個(gè)人辨識(shí)密碼(PIN)雙重保護(hù),避免對(duì)服務(wù)資源非授權(quán)存取。
2.1 Java智能卡的身份認(rèn)證
本文中的模型完全基于Java技術(shù),Java技術(shù)廣泛應(yīng)用于多用戶環(huán)境中。合法使用java智能卡是以用戶為中心(user-centric)的訪問控制,因此必須基于用戶的身份授予其不同的許可。用戶必須經(jīng)身份認(rèn)證后才有權(quán)使用保存在java智能卡中的憑證信息,這是保證用戶信息安全的第一道關(guān)卡。本文通過(guò)Java認(rèn)證和權(quán)限服務(wù)JAAS(Java technology Authentication and Authorization Service Software)來(lái)完成。JAAS已完全集成在J2SE1.4平臺(tái)中,它是Java平臺(tái)的擴(kuò)展security API,是可插拔鑒定模塊(Pluggable Authentication Module,PAM)的java實(shí)現(xiàn)。JAAS分為認(rèn)證(authentication)和授權(quán)(authorization)兩部分。
認(rèn)證就是對(duì)一個(gè)用戶身份鑒定權(quán)限的處理過(guò)程。JAAS認(rèn)證機(jī)制是基于PAM的,所以它支持允許系統(tǒng)管理員插入適當(dāng)?shù)蔫b別機(jī)制以滿足安全要求的體系結(jié)構(gòu),這種體系結(jié)構(gòu)也允許應(yīng)用程序獨(dú)立于底層鑒別技術(shù)。因此,當(dāng)有新的鑒別服務(wù)出現(xiàn)或當(dāng)前服務(wù)需要更新時(shí),系統(tǒng)管理員無(wú)需調(diào)整或重新編譯現(xiàn)有的應(yīng)用程序就能輕松進(jìn)行部署??蛻魬?yīng)用(Clinet Application)總是通過(guò)登錄上下文(LoginContext)對(duì)象和JAAS交互,如圖2所示。
典型的認(rèn)證處理過(guò)程要經(jīng)過(guò)下面的步驟:(1)生成一個(gè)LoginContext對(duì)象。這個(gè)LoginContext尋找登錄配置文件以決定使用那個(gè)LoginModule。(2)通過(guò)調(diào)用LoginContext的login方法執(zhí)行認(rèn)證,它會(huì)加載預(yù)定義的LoginModule去檢驗(yàn)是否用戶可以被認(rèn)證。(3)如果用戶被認(rèn)證,則用規(guī)則(Principal)和標(biāo)識(shí)和其所屬項(xiàng)(subject)進(jìn)行關(guān)聯(lián)。(4)或者在登錄失敗的情況下拋出一個(gè)LoginException。(5)使用LoginContext的logout方法進(jìn)行注銷登錄。
在JAAS中,登錄是一個(gè)二階段(two-phase)的處理過(guò)程。第一階段是“登錄(login)”階段如上面步驟2所描述的。這個(gè)階段惟一的任務(wù)是認(rèn)證。只要處理過(guò)程成功通過(guò)這個(gè)階段,認(rèn)證處理過(guò)程就進(jìn)入了“提交(commit)”階段如上步驟3,這一階段LoginModule的commit方法被調(diào)用去關(guān)聯(lián)所屬子項(xiàng)(subject)相關(guān)的規(guī)則(Principal)和標(biāo)識(shí)。在JAAS中一個(gè)所屬子項(xiàng)表示一個(gè)認(rèn)證實(shí)體,例如一個(gè)人或者一臺(tái)設(shè)備。
鑒別是授權(quán)的基礎(chǔ),特別是在知道subject的身份時(shí),應(yīng)用程序要指定subject可以執(zhí)行的動(dòng)作行為。Subject只是表示無(wú)名的容器,用來(lái)為subject容納相關(guān)信息,而Principal表示subject的鑒別身份。授予subject的許可集取決于與subject相關(guān)聯(lián)的Principal,而不是取決于subject本身,這就是說(shuō),根據(jù)subject包含的鑒別Principal來(lái)賦予subject的權(quán)限。授予的權(quán)限許可集可以通過(guò)外部訪問控制策略來(lái)配置,策略配置文件包含了可以進(jìn)行安全敏感操作的入口,如訪問一個(gè)具體的Web頁(yè)面或者本地的文件。
2.2 模型架構(gòu)及實(shí)現(xiàn)
根據(jù)圖1,可設(shè)計(jì)C/S結(jié)構(gòu)的用戶憑證管理模型架構(gòu),如圖3所示。客戶端" title="客戶端">客戶端的任何應(yīng)用都必須經(jīng)過(guò)JAAS對(duì)Java智能卡的認(rèn)證與授權(quán),只有被授權(quán)后,客戶端的應(yīng)用程序才能訪問Java智能卡中的特定信息。這時(shí)通過(guò)Java Card的RMI(Remote Object Invocation)接口JCRMI(RMI for Java Card Platform,Java Card遠(yuǎn)程方法調(diào)用" title="方法調(diào)用">方法調(diào)用)與Java智能卡上通信,從而得到Java智能卡中的相應(yīng)信息。當(dāng)然,這中間需要通過(guò)讀卡設(shè)備連接智能卡,信息傳輸通過(guò)Card Service API支持。當(dāng)二臺(tái)計(jì)算機(jī)彼此進(jìn)行通信時(shí),它們交換根據(jù)一系列協(xié)議構(gòu)造的數(shù)據(jù)包。同樣Java智能卡也使用自己的數(shù)據(jù)包——稱作APDU(應(yīng)用協(xié)議數(shù)據(jù)單元)與外部世界對(duì)話。APDU包含一條指令或響應(yīng)信息。在智能卡里采用的是主從模式,而智能卡扮演從動(dòng)的角色。換句話說(shuō),智能卡總是在等待來(lái)自終端的命令A(yù)PDU。隨后,它執(zhí)行APDU規(guī)定的動(dòng)作,并以一個(gè)應(yīng)答APDU向終端作出回答。JCRMI包含了智能卡與終端之間互相交換命令A(yù)PDU和應(yīng)答APDU的方法exchangeAPDU()。
在圖3右邊,是整個(gè)架構(gòu)的Server端,描繪了JCRMI調(diào)用位于Java智能卡上的方法的機(jī)制。這些方法在Remote Interface(遠(yuǎn)程接口)中聲明。Java智能卡中的應(yīng)用類(實(shí)現(xiàn)用戶憑證操作的類)APP Remote Class繼承Java Card平臺(tái)中的CardRemoteObject類并實(shí)現(xiàn)(Implements)Remote Interface的方法。在實(shí)例中,purseImpl 類代表圖3中的APP Remote Class。Java Card API 中的Dispatcher和RMIService處理APDU(應(yīng)用協(xié)議數(shù)據(jù)單元)對(duì)象及Java Card 平臺(tái)的RMI請(qǐng)求(request)。Java Card應(yīng)用程序稱為applets,一個(gè)卡上可駐留多個(gè)applets。每個(gè)applets均被其AID(應(yīng)用程序標(biāo)識(shí)符)惟一標(biāo)識(shí),如ISO 7816第5部分的規(guī)定。在圖3中,當(dāng)Java智能卡插入讀卡器,執(zhí)行用戶憑證管理的Applet被選中后激活,這時(shí)候Client端的應(yīng)用程序就可以通RMI訪問Java智能卡中的信息了。Java Card applet是用一般的Java編譯器編譯的。編譯器的輸出結(jié)果(class文件)被輸入Java Card轉(zhuǎn)換器,轉(zhuǎn)換并優(yōu)化Java字節(jié)代碼使之更適合在Java Card虛擬機(jī)上運(yùn)行。轉(zhuǎn)換器的輸出結(jié)果被下載到Java Card上。
以上是整個(gè)模型架構(gòu)的工作機(jī)制,這個(gè)模型的第一道安全關(guān)卡由JAAS來(lái)實(shí)現(xiàn),下面分析利用JavaCard實(shí)現(xiàn)用戶憑證管理的其他安全機(jī)制。
(1)JCRMI及事務(wù)的原子性
Java Card遠(yuǎn)程方法調(diào)用是Java遠(yuǎn)程方法調(diào)用(RMI)的一個(gè)子集,它為運(yùn)行在卡接受設(shè)備(CAD)或讀卡器平臺(tái)上的客戶端程序提供了一個(gè)調(diào)用位于卡上的遠(yuǎn)程方法的機(jī)制。程序包javacard.framework.service中的類RMIService為JCRMI提供了卡上傳輸層,當(dāng)基于JCRMI的applet是當(dāng)前選定的applet時(shí),這個(gè)傳輸層被設(shè)計(jì)成一個(gè)由applet請(qǐng)求的服務(wù)。被傳送到RMIService方法的APDU對(duì)象封裝了JCRMI消息。
事務(wù)是持續(xù)性數(shù)據(jù)更新的一個(gè)邏輯子集。例如,從一個(gè)帳號(hào)傳送到另一個(gè)帳號(hào)是一個(gè)銀行事務(wù)。事務(wù)的原子性是很重要的:要么更新所有的數(shù)據(jù)域,要么一個(gè)也不更新。JCRE提供了針對(duì)原子操作的靈活支持,這使得如果事務(wù)沒有正常完成,則卡上的數(shù)據(jù)恢復(fù)到其原始的事務(wù)狀態(tài)。這種機(jī)制防止了一些突發(fā)事件,例如在事務(wù)過(guò)程中突然掉電,以及防止了一些可能造成數(shù)據(jù)錯(cuò)亂的程序錯(cuò)誤,它們可能造成事務(wù)的各個(gè)步驟沒有全部完成[4]。
(2)Java Card的Applet隔離
隔離意味著一個(gè)applet不能訪問在另一個(gè)上下文(context)中的applet的方法或字段,除非其他applet顯式地提供了訪問接口。Java Card防火墻提供了大多數(shù)常見的安全問題的防護(hù):可能允許敏感數(shù)據(jù)泄漏給另一個(gè)applet的開發(fā)錯(cuò)誤和設(shè)計(jì)失誤。為了從一個(gè)公共可訪問的位置獲得一個(gè)對(duì)象引用,applet在使用引用訪問對(duì)象之前,必須滿足某些訪問規(guī)則,防火墻還提供了針對(duì)不正確代碼的防護(hù)。如果卡加載了不正確代碼,防火墻也會(huì)防止這個(gè)代碼訪問對(duì)象。本例中,用戶身份被JAAS認(rèn)證后再被授權(quán)可訪問Java智能卡中的憑證信息,這是由JavaCard中的applet來(lái)引用訪問相應(yīng)的對(duì)象,applet只能跟當(dāng)前的context關(guān)聯(lián),其他applet不能訪問當(dāng)前context中的applet,所以每一個(gè)applet中的數(shù)據(jù)是安全的。
(3)Java Card中的信息加密
Java Card中有一個(gè)安全API javacard.security和一個(gè)密碼學(xué)API java.cardx.crypto,它們分別提供了和J2SE相應(yīng)模塊java.security和javax.crypto類似的功能,這些功能實(shí)現(xiàn)了Java Card的安全和密碼學(xué)框架,提供一系列不同的加密算法,簽名算法、密鑰產(chǎn)生等功能,這些功能方法在JavaCard2.2.1平臺(tái)中已更新并進(jìn)一步加強(qiáng)。對(duì)Java智能卡中的數(shù)據(jù)經(jīng)常需要轉(zhuǎn)移(如讀、寫、存),為保證在這個(gè)轉(zhuǎn)移過(guò)程中信息的安全性,信息可以被加密以保證完整性和正確性。運(yùn)用javacard.security和javacardx.crypto程序包,首先創(chuàng)建DES密鑰,然后創(chuàng)建和初始化一個(gè)cipher對(duì)象,最后加密信息。在讀取卡中保存信息時(shí),使用RMI調(diào)用解密方法對(duì)信息解密。
2.3 關(guān)鍵代碼實(shí)現(xiàn)
(1)定義purse接口(remote interface),包含驗(yàn)證PIN信息,保存憑證信息、刪除憑證信息等方法。
public interface purse extends RemoteInterface
{
……
public void verfyPIN(byte[]PIN) throws RemoteException,UserException;
public void createNewCredential(String serviceName,String login,String password)
throws RemoteException,UserException;
public void deleteCredential(String serviceName) throws RemoteException,UserException;
……
}
(2)定義類purseImpl(見圖3中的My Remote Class),繼承CardRemoteObject,并實(shí)現(xiàn)purse接口(remote interface)。
public class purseImpl extends CardRemoteObject implements
purse
{……
public void verifyPIN(byte[]PIN) throws RemoteException, UserException {
//check the PIN here
}
}
(3)定義類myApplet(見圖3中的Applet),它是javacard.framework.Applet的子類。實(shí)例化purseImpl,并通過(guò)Dispatcher和RMIService處理Client和java智能卡間的信息交換。
public class myApplet extends javacard.framework.Applet
{
private Dispatcher disp;
private RemoteService serv;
private Remote purse;
public myApplet() {
purse=new purseImpl();
disp=new Dispatcher( (short) 1);
serv=new RMIService(purse);
disp.addService(serv,Dispatcher.PROCESS_COMMAND);
register();
}
public void process(APDU apdu) throws ISOException
{ disp.process(apdu);}
}
智能卡是越來(lái)越受歡迎的易攜帶設(shè)備,使用此方案,用戶使用一張隨身帶的智能卡,可實(shí)現(xiàn)對(duì)多種密碼、憑證信息的管理(讀、寫、備份)。本文中的模型架構(gòu)充分利用了Java Card平臺(tái)的優(yōu)勢(shì),并結(jié)合JASS認(rèn)證與授權(quán)的功能安全處理卡中的信息,實(shí)現(xiàn)了用戶憑證信息管理(credential management)的雙因素認(rèn)證防護(hù),同時(shí)分析實(shí)現(xiàn)了Java智能卡中的信息安全。另外,該模型是開放的體系結(jié)構(gòu),可方便地與其他應(yīng)用集成,具有擴(kuò)展性。Java Card技術(shù)是基于Java語(yǔ)言的,所以,它還具有Java程序應(yīng)用的優(yōu)點(diǎn)??傊?,本文描述的用戶憑證管理模型設(shè)計(jì),是針對(duì)普遍的用戶需求而設(shè)計(jì),具有較強(qiáng)的實(shí)用價(jià)值。隨著Java Card技術(shù)的日益成熟,java智能卡將越來(lái)越普及,用戶只要擁有一張智能卡,生活將變得更輕松。
參考文獻(xiàn)
1 Java Card Technology(2.2.1).http://java.sun.com/products/javacard/
2 Java Card RMI.http://java.sun.com/products/javacard/RMI_Client_API.pdf
3 JAAS.http://java.sun.com/products/jaas
4 Gong L著,朱岱譯.深入Java 2平臺(tái)安全——體系架構(gòu)、API設(shè)計(jì)和實(shí)現(xiàn)(第二版).北京:電子工業(yè)出版社,2004