天津工業大學計算機科學與軟件學院 王 輝
隨著Java技術的發展,安全技術也在各方面進行了完善和改進。Java安全性不是自運行的,是通過安全管理器來實現安全策略,這個安全管理器沒有自動安裝在應用程序中。安全策略是基于代碼來源的授權,它是根據代碼的來源來設置代碼可以有哪些權限、可以訪問用戶的哪些資源,從而保護代碼執行者的安全性。Java安全性是整個Java語言的有機組成部分,Java平臺本身具有內置且一致的安全特性,如果能夠恰當地使用,它可以很好地控制每一個Java應用程序。
Java的安全模型是由安全策略、訪問許可、保護域、訪問控制檢查、權限操作以及類加載和解析等部分組成。安全策略和訪問許可定義了哪些動作是允許的,而保護域和訪問控制檢查則提供了執行的功能,權限操作、類加載和解析則對整個保護機制是很有幫助的。
Java運行時環境的安全行為由安全策略來指定,安全策略是一個典型的訪問控制矩陣,即什么樣的系統資源、用哪種形式、在哪些環境下可以被訪問。一個安全策略是從描述運行代碼的一系列特征到代碼允許的訪問許可權限之間的映射。在Java的安全體系結構中將保護域分為系統保護域與應用保護域。前者對文件系統或網絡套接字(socket)等系統資源的訪問加以控制。而后者對各種組件或應用程序某部分的訪問進行控制,它是針對具體應用程序的。應用保護域使用應用安全(例如,使用AS包或J2EE的容器管理安全機制)增強了當前的安全策略。然而,應用安全通常使用定制的權限來限制對特權代碼的訪問。
Java2依賴于安全策略給運行代碼授予許可權限,以代碼為中心的訪問控制方式不同于依賴于代碼的各種特性的傳統安全措施,它是很合理的。然而,Java技術被廣泛應用于多用戶環境中,必須與不同的用戶打交道,而且還要基于其身份授予這些用戶不同的許可。Java認證和授權服務(JAAS)可以為用戶鑒別和權限分配提供一個標準的編程接口,它被完全集成在J2SE1.4中。這樣應用程序可以提供以代碼為中心的訪問控制,或者以用戶為中心的訪問控制,以及可以是兩者的結合。有了JAAS之后,Java就能完全提供兩個重要的服務:認證(檢查用戶的合法性)、授權(確認合法用戶執行的任務)。認證是要確定誰正在運行代碼,不管代碼是如何運行的。授權是確定用戶執行某些動作的權限。在JAAS之前,Java安全先檢查代碼來源和誰做的簽名,正確后再執行JAAS,從而增強了Java的安全性。
由于Java程序可運行在多個平臺上,將安全建立在應用級上常常比建立在操作系統上的系統級安全更有效。在Java應用級別上,有很多技術可以用于保護系統不受攻擊,在對應用程序采取好基本的安全措施后,應用程序就不那么好對付了,就可以阻止或預防除了刻意黑客之外的所有攻擊。
在本地存儲數據的獨立應用程序存在一個問題:運行應用程序的用戶通常需要讀取和寫入數據文件,這就意味著他們可以不通過應用程序就可以讀取,修改數據。如何防止這種類型的攻擊?最簡單的辦法是將信息存儲在更安全的地方,例如放在遠程服務器的數據庫中。但是,如果一定要求在本地存儲信息,又怎么辦呢?幸運的是Java提供了強有力的技術。使用JCE可以容易地加密數據,然后將它放到文件中。由于對稱密鑰算法比非對稱密鑰算法快幾倍,所以加密時一般采用對稱密鑰,然而,對稱密鑰卻缺乏公/私鑰結合的安全性。所以,在生成加密密鑰時,為了安全起見,在密鑰中加入口令和鹽。加密時輸入口令,口令可以由使用者自己確定,解密時只有輸入口令才能夠得到明文。鹽是一個無關的數據序列,它被添加到將要加密的數據中,解密時先將它從明文中去掉。這樣就能防止黑客進行加密逆向處理。
盡管確信系統的各種安全漏洞都堵死了,但它仍然是易受攻擊的,即代碼濫用的危險。即使沒有應用程序源代碼,對于一個技術高超的人來說,也可以采用與開發者原意不同的方式來使用應用程序。因此,必須采用一種機制來防止對軟件的盜版,防止無授權的方式復制并使用軟件。雖然現實中沒有完善的防范措施來對抗軟件盜版,但是可通過巧妙地使用JCE,讓黑客難于攻擊而遠離應用程序。其中一個方法是開發一個全面的軟件授權策略。以前,這方面的很多機制是使用哈希碼或簡單的加密方案來傳輸或確認授權信息。在Java應用中,這些技術仍然可用。此時我們假定可以向系統所有的合法用戶傳遞一個專門的“鑰”,當解密時,它包含了增強授權方法的所有必要信息。
RMI建立在Java語言的許多特性之上,它是一種設計非常簡單并且靈活的技術,可以實現跨網絡的方法調用,但RMI包含默認高級安全機制。然后,通過網絡上的客戶應用調用遠程對象的方法,就會打開很多的安全漏洞。RMI使用明文實現跨網絡的方法調用,但是沒有進行任何認證。這使得應用暴露給很多可能的危險者,使其允許未認證用戶訪問他們不應該訪問的信息,執行不應該執行的方法調用。為了降低風險,所有使用RMI的程序都必須安裝安全管理器,或者除了本地類之外,不能下載作為參數接收的對象類、返回值類、遠程方法調用的異常類,這個限制確保下載代碼的操作經過一系列安全檢查。
在J2EE中EJB是提供的最好特性之一,它有多種不同類型的EJB可以用于實現組件。實體Bean代表持續數據,會話Bean代表與客戶端的一次會話,用于為客戶端會話管理業務處理,消息驅動Bean允許EJB組件處理異步消息。如果只使用容器提供的標準J2EE安全服務,EJB是最容易保護的一種J2EE組件類型。EJB實現允許容器增強安全性,使用這種安全機制是對于EJB的最好實踐。沒有這些安全機制,任何遠程用戶(包括可能的攻擊者),只要能夠訪問EJB服務器并且知道關于遠程部署的Bean(不聲明為本地Bean)的接口信息,就可以訪問服務器并執行遠程方法。
安全本身是蘊涵矛盾的問題,任何保證安全的措施其實也是一道無形的屏障,會帶來一定的運行效率的損失,同時在開發上也需要加入更加完備的考慮。Java技術有許多安全特性,而Java平臺通過自身基礎來實現一個可靠的平臺。如果沒有Java語言自身提供的安全性,那么Java2的安全模型是不可能實現可信賴特征的。Java語言規范了類型安全和引用完整的語義,但是如果沒有Java虛擬機提供的執行和保證,Java語言仍然是不完備的。因此,通過采用各種各樣的安全子系統,創建了一個強大的安全體系是十分必要的。
[1]陳磊.Java的安全機制研究與分析[J].電腦知識與技術(學術交流),2007(12).
[2]房偉.基于J2ME平臺的移動應用系統的安全性研究[D].大連交通大學,2010.