java虛擬機器學習筆記——java安全模型

來源:互聯網
上載者:User
文章目錄
  • 起到第一道安全保障作用的"雙親委派類載入模型"

安全模型簡介

安全模型使Java成為網路環境的技術,因為它們建立了對網路行動程式碼安全執行的必要的可信機制。

Java安全模型側重於保護終端使用者免受從網路下載的、來至於不信任的來源的、惡意程式的侵犯。而“沙箱”機製成為了這一目的的支援機制,在“沙箱”中存放不可信的Java程式。“沙箱”對不可靠的程式的活動進行了限制,程式可以在“沙箱”的安全邊界內做任何事,但是不能進行任何跨越這些邊界的舉動。

比如說,在版本1.0中的沙箱對於很多不可靠的applet進行了如下限制:

a. 對本地硬碟的讀寫

b. 進行任何網路連接,但是不能串連到提供這個applet的源主機

c. 建立新的進行

d. 裝載新的動態連結程式庫

但是,基於版本1.0的沙箱模型過於嚴格,有些善意(但是不可靠)的代碼常常無法進行有效工作,所以,在版本1.1,“沙箱”模型得到了改進,引入了基於程式碼簽署和認證的信任模型。

基本沙箱

Java沙箱的基本組成組件有:

1.類載入器結構

2.Class檔案檢驗器

3.內建於Java虛擬機器的安全特性

4.安全管理器及Java API

其中最重要的特點是: 組件當中的類載入器以及安全管理器是可以由使用者定製的。

起到第一道安全保障作用的"雙親委派類載入模型"雙親委派方式的類載入,指的是優先從頂層啟動類載入器開始,自頂向下的方式載入類的模型(參見第一條類裝載器體繫結構)。


這種模型的好處是,底層的類裝載器裝載的類無法與頂層類裝載器裝載的類相互調用。

哪怕是同包下的類,只要他們不屬於同一類裝載器,都是相互隔絕的。這對一些有安全隱患的類起到了安全隔離的作用。使它不能冒充系統類別來破壞程式正常運作。


此外,不同的類裝載器,也有自己的類裝載範圍。比如啟動類裝載器,它只會裝在jdk/lib目錄下的包/類,因此,系統級的類是相對安全的。   class檔案校正器,通過四趟掃描,保證了class檔案正確第一趟是,在類被載入時進行,檢查class檔案的結構是否正確。比較典型的就是,檢查class檔案是否以魔數OxCAFEBABE打頭。通過這趟檢查,可以過濾掉大部分可能損壞的,或者壓根就不是class的檔案,來冒充裝載。 第二趟是,在串連過程中進行,稱為類型資料的語義檢查,檢查它是否符合java語言特性裡的編譯規則。比如發現一個類的超類不是Object,就拋出異常。檢查每個方法描述符是否符合特定的文法、格式。 第三趟是,在串連過程中進行,稱為位元組碼驗證,檢查位元組碼是否能被JVM安全的執行,而不會導致JVM崩潰。 位元組碼流代表了java的方法,它是由稱為作業碼的單位元組指令組成的序列,每一個作業碼後都跟著一個或多個運算元。運算元用於在java虛擬機器執行作業碼指令時提供所需的額外的資料。執行位元組碼時,依次執行每個作業碼,這就在java虛擬機器內構成了執行的線程。每一個線程被授予自己的java棧,這個棧是由不同的棧幀構成的。每一個方法調用將獲得一個自己的棧幀(也就是一個方法對應一個棧幀)——棧幀其實就是一個記憶體片斷,其中儲存著方法中的局部變數和計算的中間結果。用於儲存方法中間結果的部分稱為該方法的運算元棧。在執行一個作業碼時,除了可以使用緊隨其後的運算元,虛擬機器還可以使用運算元棧中的資料,或局部變數中的資料。 第四趟是,符號引用驗證。是在動態連結時進行,一個類檔案,它會包含它引用的其他類的全名和描述符,並跟他們建立符號引用(一種虛擬,非物理串連的方式)。當程式第一次執行到需要符號引用的位置時,jvm會檢查這個符號連結的正確性,然後建立真正的物理引用(直接引用)。由於第四趟掃描必須檢查被檢測的class檔案以外的其他類,所以這次掃描可能需要裝載新的類。 動態串連是將符號引用解析為直接引用的過程。當java虛擬機器執行位元組碼時,如果它遇到一個作業碼,這個作業碼在第一次使用一個指向另一個類的符號引用,那麼虛擬機器就必須解析這個符號引用。在解析時虛擬機器執行兩個基本任務:1.尋找被引用的類(如果必要的話就裝載它)。2.將符號引用替換為直接引用,例如一個指向類、欄位或方法的指標或位移量。 jvm型別安全特性這些都是基礎的java語言特性,他們降低了java程式出現記憶體混亂,崩潰的幾率。
  • 結構化記憶體訪問(不使用指標,一定程度上讓駭客無法篡改記憶體資料)
  • 自動垃圾收集
  • 數組邊界檢查
  • Null 參考檢查
  • 資料類型安全
 Java api的安全管理器 securityManager這是安全沙箱中,離我們程式員最接近的一環。securityMananger,是一個api層級的,可自訂的安全性原則管理器,它深入到java api中,在各處都可以見到它的身影。比如SecurityClassLoader。 預設情況下,java應用程式是不設定 securityManager 執行個體的(意味著不會起到安全檢查),這個執行個體需要我們在程式啟動時通過 System.setSecurityManager 來設定。 一般情況下,檢查許可權是,通過 SecurityManager.checkPermission(Permission perm) 來完成的。外部程式通過,建立Permission執行個體,傳遞給前面的check。 Permission是一個抽象類別,需要繼承它實現不同的許可權驗證,比如 FilePermission,代表對某個檔案的讀寫權限。new FilePermission("test.txt", "read")你可以將這個執行個體,扔給 SecurityManager,檢查是否可讀text.txt這個檔案。 java簽名/認證機制java簽名/認證機制,可以保障使用者,安全地調用外部提供的jar,防止你信任的jar被篡改。 首先,java的簽名,必須是基於jar包的。也就是說,你必須將你要提供的class,打包到jar裡。然後,通過 java 提供的簽名工具(jarsigner)對jar包進行簽名,發布。 簽名原理:使用非對稱演算法,產生一對公開金鑰/私密金鑰。  認證
認證是在簽名基礎上,對簽名值,再進一步做一次加密。而這次加密使用的私密金鑰和公開金鑰都是認證機構提供的。

這種方式,是為了防止,有些惡意使用者,在公開金鑰發到你手上前,就對其做了手腳,然後再發一個動過手腳的jar給你,用動過手腳的公開金鑰解動過手腳的jar包,是可以解開的。而使用認證後,它會對已經加密的簽名值,再做一層加密,這樣,到你手裡,你只需要通過認證機構的公開金鑰進行解密,然後再用jar包發行者的公開金鑰解密就行了。(只能在一定程度上,提供一些安全性)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.