摘 要: 針對利用網(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ī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è)計所用的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ù)Java智能卡的特點(diǎn)及用戶憑證管理的目的,,可設(shè)計如下管理模型,,如圖1所示。
該模型采用C/S結(jié)構(gòu),,每一臺客戶應(yīng)用計算機(jī)作為Client,,而java智能卡充當(dāng)Server角色,兩者通過與計算機(jī)相連的卡接收設(shè)備(CAD)連接,??ń邮赵O(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è)計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ì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è)計成一個由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è)計失誤,。為了從一個公共可訪問的位置獲得一個對象引用,,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è)計,,是針對普遍的用戶需求而設(shè)計,,具有較強(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è)計和實(shí)現(xiàn)(第二版).北京:電子工業(yè)出版社,,2004