Java 以「平台無關性、網路移動性、安全性」三大特性著稱。其體系架構透過編譯 → 位元組碼 → 類加載 → 執行引擎 → 安全管理器的流程,為這三大特性提供底層支撐。本文聚焦於安全性實現原理。
.class 位元組碼。「先編譯、後解釋、再執行」的模式實現「一次編寫,到處執行」,若應用僅使用標準 API 且不調用本地方法,即可跨平台部署。
Java 在 C++ 基礎上移除高風險特性,從源頭降低漏洞風險:
new 配置物件,垃圾回收器(GC)自動回收無引用物件並整理碎片,消除手動釋放導致的記憶體洩漏或雙重釋放風險。transient 關鍵字排除敏感欄位;實作 Externalizable 介面自訂序列化邏輯,防止私有資料外洩。類加載器不僅載入位元組碼,更負責連結(分配靜態記憶體、解析符號引用)與初始化(執行靜態初始化區塊)。
不同加載器建立獨立命名空間,同一空間內類別可直接互動,跨空間需顯式機制。此機制保護受信任類別(如核心 API)不被惡意同名類別替換。
| 加載器 | 來源 | 說明 |
|---|---|---|
| 啟動類加載器 | 本地系統 | 載入核心 rt.jar,由 C++ 實現,無 Java 參考 |
| 標準擴展類加載器 | jre/lib/ext | 廠商擴展 API |
| 路徑類加載器 | Classpath | 應用程式類別 |
| 網路類加載器 | HTTP/網路 | 遠端下載類別(Applet、RMI) |
雙親委派模式:除啟動加載器外,每個加載器都有「雙親」。載入請求先委派給雙親,雙親無法載入才由子加載器嘗試。三種指定雙親方式:
loadClass() 顯式指定此機制確保核心類別優先由最受信任的加載器載入,防止偽造核心類別注入。
安全管理器在執行期間攔截敏感操作(檔案 I/O、網路連線、反射、執行緒控制等),依據策略檔(.policy)授予或拒絕權限。典型權限包括:
FilePermission:檔案讀寫執行SocketPermission:網路連線/監聽RuntimePermission:系統屬性存取、執行緒操作PropertyPermission:系統屬性讀寫補足語言與虛擬機層面防護:
jarsigner、KeyStore網路環境下,惡意 Applet、不可信 Jini 服務、駭客利用緩衝區溢位竊取記憶體資料等威脅無處不在。Java 多層次防禦(語言→VM→API)構建纏繞防線,確保:
Java 體系架構從語言設計、類加載隔離、執行期存取控制到豐富的安全 API,構建了完整的資訊安全防護體系。開發者理解這些機制,能編寫更安全的程式碼、正確配置安全策略、排查權限異常,並在架構層面做出更明智的技術選型。