Java何以保網(wǎng)絡(luò)安全

字號:

Java是惟一一種從設(shè)計(jì)的開始就考慮安全性的移動(dòng)代碼。雖然并不完美,Java卻在程序的功能性和保護(hù)主機(jī)的安全性兩方面達(dá)到了的平衡,并且Java非常適合將代碼從一個(gè)平臺向另一個(gè)平臺的移植。
    Java采用一個(gè)稱為“sandbox”的模型來運(yùn)行移動(dòng)代碼。不被信任的移動(dòng)代碼只能在sandbox中運(yùn)行而不能進(jìn)行多數(shù)針對主機(jī)的操作,比如讀、寫或刪除文件,監(jiān)聽或接受網(wǎng)絡(luò)連接等等。
    當(dāng)瀏覽器加載含有Java Applet的頁面時(shí),它從Web服務(wù)器上取Java的字節(jié)代碼,然后將代碼傳給稱為字節(jié)代碼檢驗(yàn)器的Java部件。檢驗(yàn)器確保字節(jié)代碼有正確的格式,不會超出內(nèi)部堆棧的邊界,這就防止了程序的崩潰。第二個(gè)Java部件——類加載器,決定一個(gè)Java applet在何時(shí)、以何種方式將代碼加入正在運(yùn)行的Java環(huán)境,保證此applet不會取代任何系統(tǒng)級別的內(nèi)容。(每一個(gè)Java程序由一個(gè)或多個(gè)類、數(shù)據(jù)對象以及如何操作數(shù)據(jù)的方法所組成。)
    最后,還有第三個(gè)部件稱為安全管理器,當(dāng)一個(gè)有潛在危險(xiǎn)的方法試圖運(yùn)行時(shí),安全管理器就會起作用。是否運(yùn)行這種有潛在危險(xiǎn)的方法取決于需求此種方法的類來源于何處。舉例來說,內(nèi)部本身的類比通過網(wǎng)絡(luò)獲取的類具有更大的特權(quán)。(因?yàn)檫@一原因,要注意千萬不要將不明出處的類通過將其路徑放在系統(tǒng)的CLASSPATH下而成為內(nèi)部本身的類。)
    由此可見,字節(jié)編碼檢驗(yàn)器、類加載器和安全管理器使得Java程序高效而安全。即使這樣,任何一個(gè)部件中的編程錯(cuò)誤都會導(dǎo)致安全問題。這就是為什么某些攻擊只是針對某一個(gè)特定廠商的JVM,這是因?yàn)椴⒉皇荍ava本身的安全模型出了問題,而是因?yàn)閷?shí)現(xiàn)這一模型的方法出了問題。
    隨著Java程序的復(fù)雜化、實(shí)用化,必須要脫離“sandbox”運(yùn)行。這可以通過Java開發(fā)工具包JDK(Java Development Kit )1.1來實(shí)現(xiàn),JDK在系統(tǒng)中擴(kuò)展了加密的API,并且支持?jǐn)?shù)字簽名。在Java文檔中(.JAR文件)的applet可以通過簽名來保護(hù),允許最終用戶知道程序是來自可信任的地方,并且未經(jīng)過任何修改。通過JDK1.1,如果用戶通過簽名確信applet代碼來自可信任的地方,便通知瀏覽器和JVM將獲取的代碼與本地代碼同樣對待,獲取完全的權(quán)限。
    Java 1.2(后來更名為Java 2)在安全方面更進(jìn)一步,它提供權(quán)限不同的模型來運(yùn)行不同的代碼,也就是說,不管是本地代碼、下載的信任代碼或下載的非信任代碼都可以在不同的特權(quán)環(huán)境中運(yùn)行??偟恼f來,Java的安全漏洞較少,尤其是Java 2 ,在安全和性能兩方面都有很大提高。