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