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