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