摘要:該文對Java平臺中Applet安全性方面的問題,從1.0 版本至今的發(fā)展過程進行了討論。詳細(xì)討論了Java 2 平臺對移動代碼安全性的解決方案及Java 6.0平臺安全性的增強,對于在java平臺下進行移動代碼開發(fā)有一定指導(dǎo)意義。
關(guān)鍵詞:Java;Applet;SunPKCS11;SunMSCAPI;沙箱;簽名
中圖分類號:TP309 文獻標(biāo)識碼:A 文章編號:1009-3044(2009)15-3874-02
JAVA Platform Based on the Mobile Code Security of Investigate
LIU Meng-fei
(Shandong Yingcai College, Department of Computer, Jinan 250100, China)
Abstract: This paper discusses the history of the security of java applets in java platform. This paper emphasizes discusses the security solution of java applets in Java 2 platform and the Security Enhancements of Java 6 platform. The developer on mobile programs may under this paper's directing.
Key words: Java; Applet; SunPKCS11; SunMSCAPI; Sandbox; Signature
1 移動代碼的安全性
隨著Java平臺的廣泛使用,Java平臺下移動代碼的安全性受到越來越多人的關(guān)注。Java 平臺的安全模型從JDK1.0 到現(xiàn)在的Java 6.0,Java平臺的安全體系不斷改進,整體安全性也不斷得到加強。
網(wǎng)上程序在動態(tài)性上是令人滿意的,但它們在安全性和可移植性方面也顯示出嚴(yán)重的缺陷。在Java產(chǎn)生以前,當(dāng)前賽百空間有一半的對象實體無法進入網(wǎng)絡(luò)世界,是Java為它們打開了便利之門,而且在這個過程中定義了一種全新的程序形式:Applet(Java小應(yīng)用程序)。
Java可用來生成兩類程序:應(yīng)用程序(Applications)和Java Applet(小應(yīng)用程序)。應(yīng)用程序是可以在你的計算機的操作系統(tǒng)中運行的程序。小應(yīng)用程序是可以在Internet中傳輸并在兼容Java的Web瀏覽器中運行的應(yīng)用程序。小應(yīng)用程序?qū)嶋H上就是小型的Java程序,能像圖像文件、聲音文件和視頻片段那樣通過網(wǎng)絡(luò)動態(tài)下載,它與其他文件的重要差別是,小應(yīng)用程序是一個智能的程序,能對用戶的輸入作出反應(yīng),并且能動態(tài)變化,而不是一遍又一遍地播放同一動畫或聲音。
Java移動代碼是一種可以通過網(wǎng)絡(luò)從一臺計算機傳到另一臺計算機上運行的Java程序(如:Java Applet),在現(xiàn)代網(wǎng)絡(luò)計算及電子商務(wù)中具有廣泛應(yīng)用。
Java 平臺的安全模型經(jīng)歷了一個不斷發(fā)展的過程,從JDK1.0 到現(xiàn)在的Java 2 SDK v1.4,再到Java 6.0。Java平臺的安全體系不斷演變,新的安全模型和機制不斷提出,而整體安全性也不斷得到加強[1]。由此使得Java移動代碼的安全性也不斷演變。
2 JDK1.1安全模型
在Sun Java平臺最初的版本———Java開發(fā)包(Java Development Kit,JDK)1.0.x中,引入了基于沙箱(Sandbox)的安全模型。該模型主要支持安全地下載和運行Java Applet,并規(guī)避所有針對用戶資源的潛在風(fēng)險。
沙箱模型的實質(zhì)是本地代碼對重要的系統(tǒng)資源有全部的訪問權(quán)限,而下載的代碼(例如Applet)則不被信任并且僅能夠訪問沙箱提供的有限資源。沙箱模型如圖1所示。
在JDK1.0沙箱安全模型中,所有的Applet 都被認(rèn)為是不可信的,被限制在沙箱模式中運行。這種限制對于計算機環(huán)境的安全非常有利,但卻太苛刻了。JDK1.1引入了“Signed Applet”的概念,如圖2所示。在該版本中,允許在驗證Applet簽名者的信息后,將Applet作為可信代碼下載并執(zhí)行。為支持簽名Applet,JDK1.1.x還新增了對加密算法的支持以便提供數(shù)字簽名功能。有了這些支持,就可以對Java Applet類進行數(shù)字簽名,生成Java(Java Archive Format,JAR)歸檔格式文件。被簽名的Applet和他們的簽名一起以JAR的格式發(fā)送,未簽名的Applet仍然運行在沙箱環(huán)境中。如果某個Applent的簽名者被驗證為可信,那么這個Applent就可以像本地資源一樣自由的訪問系統(tǒng)了。
3 Java 2安全模型
從JDK1.2開始,Sun將Java平臺升級為Java 2平臺,Java 2安全模型彌補早期安全模型的局限性(此問題的詳細(xì)論述可參閱文獻[2]),并且在Java 2平臺提出了全新的安全體系結(jié)構(gòu),如圖3所示。
引入新的安全體系結(jié)構(gòu)的重大優(yōu)勢:
1) 細(xì)致的訪問控制。這種能力一開始就存在于JDK中,但是使用它需要程序開發(fā)人員做大量的編程工作,例如繼承(Subclassing)和定制SecurityManager和ClassLoader類。HotJava瀏覽器1.0就是這樣的應(yīng)用程序,因為它允許瀏覽器用戶選擇不同的安全級別。然而,這種編程方法具有極端的安全敏感性,并且要求高超的技術(shù)和深厚的計算機安全知識。新的安全體系結(jié)構(gòu)使得這個過程比較簡單和安全。
2) 容易配置的安全策略。這種能力也較早出現(xiàn)在JDK中并且不易使用,更為重要的是編寫安全代碼不夠直觀,讓程序開發(fā)人員和用戶不需要編程只需配置安全策略,這才是大家所期望的。
3) 容易擴展的訪問控制結(jié)構(gòu)。新的體系結(jié)構(gòu)允許類型化的許可權(quán)限(每一個許可權(quán)限代表著對一個系統(tǒng)資源的訪問)以及對正確類型的所有許可權(quán)限的自動處理(包括還沒有定義的許可權(quán)限)。
4) 安全檢查擴展到所有的Java程序。不再有內(nèi)在的“所有本地代碼都是可信” 的概念。盡管,需要的話可以讓本地代碼具有最自由的安全政策——使得那些代碼完全被信任并且有效的運行,但是在新的安全體系結(jié)構(gòu)里面,本地代碼(例如非系統(tǒng)代碼,安裝在本地文件上的應(yīng)用程序包)象Applet一樣受到嚴(yán)格的安全控制。
5) 對安全類(包括SecurityManager和ClassLoader)的設(shè)計中作內(nèi)部調(diào)整以減少在未來編程中存在細(xì)小安全漏洞的風(fēng)險等。
4 移動代碼安全性在Java 6中的增強
在Java 6的安全部分,又增加了 XML-Digital Signature (XML-DSIG) APIs, 整合了GSS/Kerberos的操作API、LDAP上的JAAS認(rèn)證。現(xiàn)在Sun公司的Java 6平臺,更是提供了一整套安全有效的移動代碼安全性解決方案,我們通過使用Java 6 平臺,可以使自己開發(fā)的移動代碼獲得足夠高的安全性,以及足夠的靈活性。既可以達(dá)到安全使用的目的,同時又不喪失移動代碼可以進行的工作以及進行操作的簡易性。
4.1 算法支持
1) SunPKCS11支持橢圓曲線算法(Elliptic Curve Cryptography)。
如果底層PKCS#11接口支持ECC算法,SunPKCS11可以在Java平臺提供ECC的支持,包括了ECDSA簽名、驗證,ECDH密鑰協(xié)商,以及EC密鑰對生成。
ECC是美國家安全局所選擇的下一代安全技術(shù),其宗旨是保護美國政府的機密信息。Java System Web Server中的組件可大大減少完成安全在線處理的時間,因此可提高系統(tǒng)的性能和縮放能力。同時,ECC加密技術(shù)也提高了Java System Web Server的安全性能。
ECC加密技術(shù)比起傳統(tǒng)加密技術(shù)在解密時使用的公鑰較小,但可獲得同等級的安全性能。較小的公鑰就能獲得更高的資源利用率、更長的電池壽命和更快的計算速度。
2) SunJSSE支持橢圓曲線算法。
現(xiàn)在如果JDK中存在合適的密碼算法提供者提供ECC算法(例如,有合適的底層PKCS#11庫支持的SunPKCS11),SunJSSE可支持RFC4492(傳輸層安全(TLS)的ECC密碼組)中定義的ECC算法。
4.2 對本地Microsoft Windows系統(tǒng)PKI和密碼服務(wù)的調(diào)用
增加了一個JCE提供者SunMSCAPI,SunMSCAPI使用Microsoft CryptoAPI(CAPI)提供各種RSA算法的功能實現(xiàn)。它成為Java應(yīng)用程序和通過CAPI中CSP(Cryptographic Service Provider)提供的RSA 算法服務(wù)之間的橋梁。SunMSCAPI提供了使用X.509證書和RSA密鑰對的方法,可以進行RSA加密和解密,可以創(chuàng)建和驗證RSA簽名等,同時提供密碼算法中使用的隨機數(shù)生成器。
4.3 強化了PKI證書路徑驗證的實現(xiàn)
增加了分段和重定向CRL的支持,提高了兼容PKIX 的性能(RFC3280)。
4.4 使用LDAP實現(xiàn)JAAS為基礎(chǔ)的身份鑒別
JAAS中增加了一個登錄模塊,從而用戶可以使用LDAP中儲存的證書進行身份認(rèn)證。它為JAAS為基礎(chǔ)的那些希望支持使用LDAP進行身份認(rèn)證的已有應(yīng)用程序提供了一種解決方式。
4.5 其他相關(guān)安全性改善
1) SunPKCS11支持訪問NSS(Network Security Services)
SunPKCS11提供者現(xiàn)在支持新的配置方式,使用戶可以訪問NSS(Netscape Security Services)安全庫。這種方式使得Java應(yīng)用程序可以從NSS數(shù)據(jù)庫文件中讀取密鑰,從而可以使用ECC算法,并且將NSS軟件Token做為一個兼容FIPS140的密碼算法提供者。
2) SunJSSE兼容FIPS140
SunJSSE現(xiàn)在實驗性的支持FIPS140兼容模式。當(dāng)一起激活并使用SunPKCS11提供者和經(jīng)FIPS140認(rèn)證的合適的PKCS#11接口庫,SunJSSE就可兼容FIPS140。
3) 套接字(Socket)讀取超時在SunJSSE SSLSocket中已經(jīng)可以完全支持。
前面的版本中,調(diào)用setSoTimout()可能有時導(dǎo)致不可預(yù)知的結(jié)果,現(xiàn)在已經(jīng)被修正。
4) SunJCE分組密碼中增加CTS(Cipher Text Stealing)模式。
CTS是Bruce Schneier在“應(yīng)用密碼學(xué)-第二版”中描述的,并被用在一些Kerberos實現(xiàn)中。CTS是算法的密文挪用模式,處理任意長度的明文且密文的長度匹配明文的長度。
5) Java GSS支持SPNEGO
Java GSS現(xiàn)在支持SPNEGO。SPNEGO(Simple and Protected GSS-API Negotiation)機制是一種偽安全機制,使得GSS-API端端之間可以安全的協(xié)商一個公共的安全機制來使用。
6) Java GSS/Kerberos支持新的Pre-Authentication機制。
Java GSS/Kerberos支持在最新的Kerberos規(guī)范中描述的Pre-Authentication機制。
7) Java GSS/Kerberos 支持AES加密類型
Java GSS/Kerberos現(xiàn)在可以支持AES加密類型(包括AES128和AES256)。這項改動增強了Java SE Kerberos實現(xiàn)與其他Kerberos實現(xiàn)的互操作性(例如Solaris 10 和MIT Kerberos)。
8) Java GSS/Kerberos 支持RC4-HMAC加密類型
Java GSS/Kerberos現(xiàn)在可以支持RC4-HMAC加密類型。這項改動增強了Java SE Kerberos實現(xiàn)與其他Kerberos實現(xiàn)的互操作性(例如Windows,Solaris 10 和MIT Kerberos)。Windows AD(Active Directory) 支持將RC4-HMAC做為Kerberos默認(rèn)加密類型。
5 結(jié)論及討論
Java平臺的安全模型是經(jīng)歷了一個發(fā)展過程才轉(zhuǎn)變?yōu)楝F(xiàn)在的形式,在這個轉(zhuǎn)變過程中Java平臺的安全性不斷得到加強,并且提供了一整套安全有效的移動代碼安全性解決方案,我們通過使用Java 平臺,可以使自己開發(fā)的移動代碼獲得足夠高的安全性,以及足夠的靈活性。既可以達(dá)到安全使用的目的,同時又不喪失移動代碼可以進行的工作以及進行操作的簡易性。Java平臺實現(xiàn)的移動代碼擁有廣闊的前景
參考文獻:
[1] Li Gong,Security on the Java Platform: Recent Developments and Future Directions, JavaOne 1998.
[2] Li Gong,Inside Java 2 Platform Security Architechture,API design and Implementation,Sun Microsystems Inc,1999.
[3] JavaTM 2 SDK.Standard Edition Documentation Version 1.4.2. Sun Microsystem,2004.
[4] JavaTM Archive (JAR) Features.Sun Microsystem,2003.
[5] jar-The Java Archive Tool.Sun Microsystem,2003.
[6] [美]CarLisle, Adams SteveLloyd(著),公開密鑰基礎(chǔ)設(shè)施—概念、標(biāo)準(zhǔn)和實施[M].馮登國,譯.北京:人民郵電出版社,2001.