作為一種誕生於互聯網興起時代的語言,JAVA 從一開始就帶有安全上的考慮,如何保證通過互聯網下載到本地的 JAVA 程式是安全的,如何對 JAVA 程式訪問本地資源許可權進行有限授權,這些安全形度的考慮一開始就影響到 JAVA 語言的設計與實現。 可以說 JAVA 在這些方面的探索與經驗,對後來的一些語言與產品都帶來了積極影響。
本篇文章中將介紹 JAVA 中安全模型,以及如何利用安全HTTP://www.aliyun.com/zixun/aggregation/38609.html">存取控制機制來實現一些特定目的。
JAVA 中的安全模型
在 JAVA 中將執行程式分成本地和遠端兩種,本地代碼預設視為可信任的,而遠端代碼則被看作是不受信的。 對於授信的本地代碼,可以訪問一切本地資源。 而對於非授信的遠端代碼在早期的 JAVA 實現中,安全依賴于沙箱 (Sandbox) 機制。 沙箱機制就是將 JAVA 代碼限定在虛擬機器 (JVM) 特定的運行範圍中,並且嚴格限制代碼對本地系統的資源訪問,通過這樣的措施來保證對遠端代碼的有效隔離,防止對本地系統造成破壞。 如圖 1 所示,
圖 1.JDK1.0 安全模型
但如此嚴格的安全機制也給程式的功能擴展帶來障礙,比如當使用者希望遠端代碼訪問本地系統的檔時候,就無法實現。 因此在後續的 JAVA1.1 版本中,針對安全機制做了改進,增加了安全性原則,允許使用者指定代碼對本地資源的存取權限。 如圖 2 所示,
圖 2.JDK1.1 安全模型
在 JAVA1.2 版本中,再次改進了安全機制,增加了代碼簽名。 不論本地代碼或是遠端代碼,都會按照使用者的安全性原則設定,由類載入器載入到虛擬機器中許可權不同的運行空間,來實現差異化的代碼執行許可權控制。 如圖 3 所示,
圖 3.JDK1.2 安全模型
當前最新的安全機制實現,則引入了域 (Domain) 的概念。 虛擬機器會把所有代碼載入到不同的系統域和應用域,系統域部分專門負責與關鍵資源進行交互,而各個應用域部分則通過系統域的部分代理來對各種需要的資源進行訪問。 虛擬機器中不同的受保護域 (Protected Domain),對應不一樣的許可權 (Permission)。 存在於不同域中的類檔就具有了當前域的全部許可權,如圖 4 所示:
圖 4. 最新安全模型
以上提到的都是基本的 JAVA 安全模型概念,在應用開發中還有一些關於安全的複雜用法,其中最常用到的 API 就是 doPrivileged。 doPrivileged 方法能夠使一段受信任代碼獲得更大的許可權,甚至比調用它的應用程式還要多,可做到臨時訪問更多的資源。 8630.html">有時候這是非常必要的,可以應付一些特殊的應用場景。 例如,應用程式可能無法直接存取某些系統資源,但這樣的應用程式必須得到這些資源才能夠完成功能。 針對這種情況,JAVA SDK 給域提供了 doPrivileged 方法,讓程式突破當前域許可權限制,臨時擴大存取權限。 下面內容會詳細講解一下安全相關的方法使用。