熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

JAVA的安全結構

2013-11-23 19:50:45  來源: Java高級技術 

   JAVA的安全模型不同於傳統的安全方法傳統的安全方法中大多數操作系統允許應用程序充分訪問系統資源在操作系統不提供安全保護的機器裡運行環境不能被信任為了彌補這個缺陷安全策略經常要求在應用程序執行之前對應用程序建立信任例如要求程序員在執行從網上獲得的應用程序前先檢查病毒和源代碼中不安全的代碼這種方法有個問題()確定程序是否安全的檢查很復雜很浪費時間很少有程序員願意花時間讀程序的源代碼然後再將它編譯成本地機器碼以保證程序是安全的()病毒檢查要不斷維護以保證有效性
  
    JAVA的安全模型是不同的為了防止用戶系統受到通過網絡下載的不安全程序的破壞JAVA提供了個自定義的可以在裡面運行JAVA程序的沙盒JAVA的安全模型使得JAVA成為適合於網絡環境的技術JAVA的安全性允許用戶從Internet或Intranet上引入或運行appletapplet的行動被限制於它的沙盒applet可以在沙盒裡做任何事情但不能讀或修改沙盒外的任何數據沙盒可以禁止不安全程序的很多活動
    對硬盤進行讀寫
    和別的主機(不包括程序所在的主機)進行網絡連接
    創建個新過程
    載入個新的動態庫並直接調用本地方法
  
    沙盒模型的思想是在信任的環境中運行不信任的代碼這樣即使用戶不小心引入了不安全的appletapplet也不會對系統造成破壞
  
   沙盒模型
  
    沙盒安全模型是內建於JAVA結構的它主要由以下幾部分構成
    內建於JAVA虛擬機和語言的安全特性
    類的載入結構
    類文件校驗器
    安全管理器和JAVA API
  
    下面分別進行闡述
  
     內建於JAVA虛擬機和語言的安全特性
  
    JAVA語言有一些機制使得JAVA程序很穩健這些機制也是JAVA虛擬機(JVM)的特點它們是
  
    安全的類型轉換在CC++中可以通過指針進行任意的類型轉換但常常帶來不安全性而在JAVA中運行時系統對對象的處理要進行類型相容性檢查以防止不安全的轉換
  
    沒有指針指針是C和C++中最靈活也最容易產生錯誤的數據類型由指針所進行的內存地址操作常會造成不可預知的錯誤同時通過指針對某個內存地址進行顯示類型轉換後可以訪問個C++中的私有成員從而破壞安全性造成系統的崩潰而JAVA對指針進行完全的控制程序員不能直接進行任何指針操作
  
    自動的垃圾收集在C中程序員通過庫函數malloc()和free()來分配和釋放內存C++中則通過運算符new和delete來分配和釋放內存再次釋放已釋放的內存塊或未被分配的內存塊會造成系統的崩潰同樣忘記釋放不再使用的內存塊也會逐漸耗盡系統資源而在JAVA中所有的數據結構都是對象通過運算符new為它們分配內存堆通過new得到對象的處理權而實際分配給對象的內存可能隨程序運行而改變JAVA對此自動進行管理並且進行垃圾收集有效地防止了由於程序員的誤操作而導致的錯誤並且更好地利用了系統資源
  
    數組界限檢查若程序中有數組訪問JVM就會檢查數組訪問是否越界從而防止了由數組越界引起的錯誤
  
    檢查null引用若使用的引用為nullJVM就會拋出個例外
  
  
  
     類載入器結構
  
    類載入器結構在沙盒模型中起了重要作用在虛擬機中類載入器負責引入定義運行程序的類和接口的二進制數據在虛擬機中可能有不止個類載入器
  
    個JAVA程序能使用種類型的類載入器原始的類載入器和類載入器對象原始的類載入器是JVM實現的部分它通常從本地硬盤載入安全的類包括JAVA API的類運行時JAVA應用程序安裝類載入器對象類載入器對象使用JAVA語言編寫編譯成類文件後載入到虛擬機像其他的對象一樣初始化類載入器對象用於以自定義的方式載入類例如通過網絡下載類文件JVM把通過原始的類載入器載入的任何類都視為安全的無論這個類是否是JAVA API的部分而將通過類載入器對象載入的類視為可懷疑的缺省情況下視為不安全的
  
    JAVA的結構可以在個應用程序中創建多個命名空間命名空間是由個特定的類載入器載入的類名的集合JVM為每個類載入器維持個命名空間這個命名空間裡有由那個類載入器載入的所有類的名字由不同類載入器載入的類在不同的命名空間裡沒有程序的直接允許這些類不能彼此訪問編寫程序時可以將來源不同的類放在不同的命名空間裡用這種方式就可以使用JAVA的類載入器結構控制來源不同的代碼間的相互作用就可以防止不安全代碼訪問破壞安全代碼對於Applet也是同樣的道理通過將來源不同的Applet類文件放在不同的命名空間防止不安全代碼破壞安全代碼
  
    在沙盒結構中類載入器結構是防止不安全代碼的第一道圍牆它的作用主要有方面
    防止不安全代碼訪問破壞安全代碼
    防止不安全代碼冒充安全的類
  
    這方面作用是通過下述方法實現的
  
    將代碼分放在多個命名空間中並在不同命名空間的代碼之間設置屏障類載入器結構是通過命名空間來防止不安全代碼訪問破壞安全代碼命名空間在載入到不同命名空間中的類之間設置了屏障在JVM中同一命名空間中的類可以直接相互作用不同命名空間中的類甚至不能檢測到對方的存在除非程序允許它們相互作用
  
    保護可信任類庫(像JAVA API)的邊界如果類載入器載入個類這個類用它的名字來冒充是JAVA API的部分(例如類名為javalangvirus)類載入器就傳遞請求給原始類載入器如果原始類載入器不能載入這個類類載入器就拋出安全例外並拒絕載入這個類
  
     類文件校驗器
  
    每一個JVM都有個類文件校驗器用來保證載入的類文件具有正確的內部結構如果類文件校驗器發現類文件有錯誤它就拋出個例外
  
    類文件校驗器能幫助檢查出類使用起來是否安全因為類文件是由二進制數據構成的JVM不知道這個類文件是否是由黑客產生的是否有可能破壞虛擬機的完整性所以虛擬機對引入的字節碼進行校驗是很重要的類文件校驗器校驗的過程可以分為個階段階段發生在類剛載入以後類文件校驗器檢查類文件的內部結構包括校驗所含的字節碼的完整性階段發生在字節碼執行的時候字節碼校驗器確定符號引用的類域和方法是否存在
  
    內部檢查
  
    在階段類文件校驗器檢查類文件是否正確組成內部是否一致是否遵循JAVA編程語言的限制含有的字節碼是否能由JVM安全執行如果類文件校驗器檢查出錯誤它就會拋出個錯誤類文件就不再被程序使用
  
    檢查格式和內部一致性
  
    在階段校驗器除了檢查字節碼的完整性還要檢查類文件的格式和內部一致性例如每一個類文件都必須以同樣的字節數字xCAFEBASE開頭這樣類文件校驗器可能檢查的第一件事就是引入的文件是否以xCAFEBASE開頭
  
    類文件校驗器還要校驗類文件的長度是否與類文件中所記錄的長度一致也即校驗類文件是否完整是否被截去一部分或者被添加類文件校驗器還要檢查類是否遵循Java語言的規定如除了Object類所有的類都必須有個父類等
  
    字節碼校驗
  
    一旦類文件校驗器成功地完成格式和內部一致性的檢查就開始對字節碼進行校驗通過對代表類方法的字節碼流進行數據流分析進行操作碼是否有效及操作碼是否有有效的操作數等的檢查以驗證字節碼流是否可以由虛擬機安全執行
  
    符號引用的校驗
  
    符號引用是給出了引用項的名字和其它信息的字符串這些信息足以用來區分類域或方法符號引用的校驗用來驗證引用是否有效如果引用無效(例如如果類不能載入或者類存在但不含有要引用的域或方法)類文件校驗器就會拋出個錯誤
  
     安全管理器和JAVA API
  
    安全管理器定義了沙盒的外部邊界安全管理器是類javalangSecurityManager的子類它是自定義的
  
    JAVA API類在采取一些行動時通常需要安全管理器檢查這個行動是否安全這些行動包括
    接受來自於特定主機的socket連接
    修改線程(改變線程優先級結束線程等)
    開放對於特定主機的socket連接
    創建個新的類載入器
    刪除特定的文件
    創建新的過程
    程序退出
    調用含有本地方法的動態庫
    等待連接
    從特定的包載入類
    給特定的包中添加個新類
    訪問或修改系統特性
    訪問特定的系統特性
    讀文件
    寫文件
  
    由於在執行上述動作前需要安全管理器進行檢查JAVA API不執行安全管理器建立的安全措施所禁止的任何動作
  
    JAVA API執行個可能不安全活動的過程通常分為首先JAVA API代碼檢查安全管理器是否已安裝如果沒有安裝就無法進行第步的檢查則直接執行可能不安全的代碼如果安裝了就繼續執行第步的檢查調用安全管理器中合適的檢查方法對動作進行檢查如果動作被禁止檢查方法就
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27554.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.