Java虛擬機之 網絡安全

Java提供可配置的沙箱來限制代碼的行爲

 1、類加載器

    不同的applet程序使用不同的類加載器,不能相互訪問;

    雙親委派模式:每個類加載器都直接或間接繼承啓動類加載器,子加載器加載一個類時會默認的調用父加載器進行加載,保證Java api類都是由啓動類加載器加載的安全的類;

    運行時包概念:子加載器加載的類即使與父加載器加載的類包名一樣也處於不同包,受到跨包訪問限制;

2、class文件檢驗器

  第一步 class文件結構檢查:

 檢查文件是否是符合規定的字節碼文件(以特定的字符串開頭、聲明主版本號與次版本號,該版本在本虛擬機可支持範圍內)、文件的完整性。   第一步直接掃描class文件,二、三、四步是將類加載到內存中檢驗

第二步 類型數據的語義檢查

  定義語句是否正確:變量與方法的定義是否符合語法規範(出現新的內並不會在這一步裝載),是否繼承了object類:是否添加了object中的方法。

第三步 字節碼驗證

 檢查方法 確保變量是正確的類型,正確的值,在被訪問前擁有合適的值,使用運算符符合規範,沒有明顯的停機錯誤(無返回值,永真的循環..)

第四步 符號引用的驗證

如果預先加載 :第四步緊跟第三步執行,裝載相關引用類。現在大部分是熱加載:當字節碼文件第一次被執行時加載引用類,判斷是否能夠加載,是否有當前需要的變量然後再將引用替換爲對應的指針或偏移量。

3、Java虛擬機內置的安全特性

  1、類型安全的引用轉換

  2、結構化的內存訪問(無指針算法)

  3、自動的垃圾收集(沒有顯式的釋放內存)

  4、數組邊界檢查

  5、空引用檢查

  異常處理機制:程序出現了一個未捕獲的異常只會終止當前線程而不是整個程序崩潰

   另外一個內置的安全管理器能夠識別(可配置)當前程序是否能夠裝載動態連接庫,在調用本地方法(不管是自定義的還是Java Api的本地方法)都需要裝載動態連接庫

4 、安全管理器與Java Api

  安全管理器定義了沙箱的邊界,當Java Api執行任何可能不安全的操作時都會調用安全管理器對應的check方法(checkread、checkwrite)來確定是否擁有權限,安全管理器可由程序自定義、也可以選擇不要

5、代碼簽名和認證

   提供代碼的組織或機構在自己的代碼的後面簽名進行擔保:將代碼組成的jar包進行散列得到一串字符,在用私鑰進行加密,將加密後的字符串添加到jar包結尾

  用戶在下載jar包後 將jar包後的字符串用機構提供的公鑰進行解密,將jar包進行散列的到散列字符串,如果解密後的字符串與自己散列得到的字符串一樣代表該jar包是提供擔保組織發佈的未被惡意修改的代碼(私鑰與公鑰如何設計我不瞭解)

jvm可以爲每個擔保者的代碼提供單獨的沙箱,執行不同的安全策略

6、策略

  與代碼簽名共同作用,爲不同的代碼建立更加細粒度的權限控制

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章