1. 程式人生 > >介紹下這幾天研究的JAAS

介紹下這幾天研究的JAAS

作者:千年精靈(MSN:j2ee AT hotmail.com,QQ:800736),轉載請著名出處。

(一)JAAS技術簡介

JavaTM Authentication and Authorization Service (JAAS),自JDK1.4以來已經集成於JDK之中。

JAAS可以完成如下兩個功能:

l驗證使用者身份,可靠並且安全的確定當前是誰在執行Java程式碼,無論是作為應用程式執行還是作為一個applet、一個bean還是一個servlet

l為使用者授權,確認他們擁有執行該操作的正確許可權。

JAAS驗證技術是可插拔的,這意味著系統允許多種驗證手段共存。新的或者升級了的驗證模組可以直接使用,而不需要去修改應用本身。系統通過例項化

LoginContext物件來啟用驗證過程,LoginContext物件依次引用一個配置檔案來決定使用哪(幾)種驗證技術或LoginModule。一個典型的LoginModule可能需要使用者名稱和密碼來進行驗證,其他的也可能通過讀取聲音或指紋來進行驗證。

JAAS的認證機制建立於一整套可插拔的模組(參看下圖)基礎上。

圖片

JAAS的可插拔模組認證機制概覽圖

JAAS的核心類和介面:

l公用類

nSubjectPrincipalCredential

l驗證類和介面

nLoginContextLoginModuleCallbackHandlerCallback

l授權類

nPolicy

AuthPermissionPrivateCredentialPermission

 作者:千年精靈(MSN:j2ee AT hotmail.com,QQ:800736),轉載請著名出處。

javax.security.auth.Subject是核心類,它表示和一個實體(例如一個人)有關一系列的相關資訊,包含此實體的Principal,公開Credential以及私有Credential

下面重點談談幾個核心類。

Subject

要授權訪問資源,應用必須首先驗證請求的來源。JAAS框架使用單詞subject來表示請求的來源。Subject類代表了一個驗證實體,它可以是使用者、管理員、Web

服務,裝置或者其他的過程。該類包含了三中型別的安全資訊:

l身份(Identities):由一個或多個Principal物件表示

l公共憑證(Public credentials):例如名稱或公共祕鑰

l私有憑證(Private credentials):例如口令或私有金鑰

Principals

Principal物件代表了Subject物件的身份。它是一個惟一的實體,比如個人或者組的名字、帳號、社會安全號或者類似的惟一標識。為了惟一標識一個 subject(這是認證的關鍵部分),一個或者多個 principal 必須與這個 subject 相關聯。

它們實現了java.security.Principaljava.io.Serializable介面。在Subject類中,最重要的方法是getName()。該方法返回一個身份名稱。在Subject物件中包含了多個Principal物件,因此它可以擁有多個名稱。由於登入名稱、身份證號和Email地址都可以作為使用者的身份標識,可見擁有多個身份名稱的情況在實際應用中是非常普遍的情況。

Credential

在上面提到的憑證並不是一個特定的類或藉口,一個 subject 可能擁有安全相關的屬性,稱為憑證(credential)。憑證可以是從簡單的密碼到複雜的加密金鑰的任何東西。它可以是任何物件。憑證中可以包含任何特定安全系統需要的驗證資訊,例如標籤(ticket),金鑰或口令。Subject物件中維護著一組特定的私有和公有的憑證,這些憑證可以通過getPrivateCredentials()getPublicCredentials()方法獲得。這些方法通常在應用程式層中的安全子系統被呼叫。

下面是通過時序圖表達的JAAS驗證授權過程:

圖片

JAAS 建立在一種稱為可插入的認證模組(Pluggable Authentication ModulePAM)的安全體系結構之上。PAM 的體系結構是模組化的,這意味著它設計為可以通過交換模組,支援從一個安全協議元件無縫地轉換到另一個協議元件。這個框架中定義良好的介面使得無需改變或者干擾任何現有的登入服務就可以加入多種認證技術和授權機制。PAM 體系結構可以整合範圍廣泛的認證技術,包括 RSADCEKerberos 以及 S/Key,因而 JAAS 也可以整合這些技術。此外,這個框架與基於智慧卡的認證系統和 LDAP 認證相容。

就像許多 Java 2 平臺技術一樣,JAAS API 定義了應用程式程式碼與將要執行業務邏輯的物理實現之間乾淨的抽象。這個抽象層不用重新編譯現有的應用程式程式碼就可以作為登入模組的執行時替代。特別是,應用程式寫到 LoginContext API,而認證技術提供程式則寫到 LoginModule 介面。在執行時, LoginContext 將讀取配置檔案以確定應使用哪一個(一些)登入模組對訪問特定應用程式的使用者進行認證。

JAAS 所使用的認證方案以兩種非常重要的實體為基礎:principal subject。實際被認證的人或者服務稱為 subject principal是一個惟一的實體,比如個人或者組的名字、帳號、社會安全號或者類似的惟一標識。為了惟一標識一個 subject(這是認證的關鍵部分),一個或者多個 principal 必須與這個 subject 相關聯。最後,一個 subject 可能擁有安全相關的屬性,稱為憑證(credential)。憑證可以是從簡單的密碼到複雜的加密金鑰的任何東西。

應用程式通過例項化一個 LoginContext 物件開始認證過程。 LoginContext 查詢一個配置檔案以確定進行認證所使用的一種(或者多種)認證技術以及相應的一個(或者多個) LoginModule 。一個非常簡單的 LoginModule 可能會提示輸入使用者名稱和密碼並對它們進行驗證。高階一點的可能會使用現有的作業系統登入身份進行身份驗證。理論上,甚至可以將一個 JAAS LoginModule 構建成與指紋識別器或者虹膜掃描器互動。

(二)JAAS的優點

lJava驗證和授權API)提供了靈活和可伸縮的機制來保證客戶端或伺服器端的Java程式。Java早期的安全框架強調的是通過驗證程式碼的來源和作者,保護使用者避免受到下載下來的程式碼的攻擊。JAAS強調的是通過驗證誰在執行程式碼以及他/她的許可權來保護系統免受使用者的攻擊。它讓你能夠將一些標準的安全機制,例如Solaris NIS(網路資訊服務)Windows NTLDAP(輕量目錄存取協議)Kerberos等通過一種通用的,可配置的方式整合到系統中。

l傳統的軟體在實現身份認證功能過程中,往往自行開發專用的認證模組。由於不同的軟體開發人員在資訊保安方面水平參差不齊,實現的認證模組安全性往往得不到保證。認證和授權應當同業務邏緝分離一個通用的身份認證模組不僅能減輕軟體開發人員的負擔,更能保證認證的強度,確保在當認證方式發生改變時,應用程式不受影響。

l可以基於JAAS建立擁有自有技術的單點登入解決方案。