Java 三大特性——平台無關、網絡移動、安全性——由嚴謹的體系架構支撐。本文深度剖析 Java 安全模型的四大支柱:語言級防護、類加載器命名空間隔離、安全管理器沙箱與權限控制、標準加密 API(JCE/JSSE/JAAS)。
源碼 → javac → 字節碼 → 類加載器(加載/鏈接/初始化) → 執行引擎(解釋/編譯) → 安全管理器(權限檢查) → 本地 OS。先編譯、後解釋、再執行 實現「一次編寫,到處運行」。
new 分配,GC 回收,開發者不可干預,避免 free/delete 導致的懸空指針、雙重釋放、內存洩漏。transient 跳過敏感字段;實作 Externalizable 完全掌控 writeExternal/readExternal。rt.jar)。jre/lib/ext 擴展庫。classpath 應用類。加載請求向上委派至啟動類加載器,找不到再向下由子加載器載入。確保 java.lang.String 等核心類永遠由啟動類加載器從 rt.jar 載入,惡意同名類無法替換核心 API。
每個加載器擁有獨立命名空間,同名類在不同空間互不干擾。跨空間交互需顯式機制,保護可信類邊界。
運行期補充檢查:陣列越界、類型轉換、訪問控制。
jarsigner:SHA-1 摘要 + 私鑰簽名 → 公鑰驗證完整性與來源。CodeSource 封裝位置 + 證書鏈。
grant signedBy "father" {
permission java.io.FilePermission "order.txt", "read";
};
grant codeBase "file:${java.home}/lib/ext/*" {
permission java.io.FilePermission "order.txt", "read,write";
};
grant signedBy "wife", codeBase "file:${java.home}/lib/ext/*" {
permission java.net.SocketPermission "*:8080", "accept,connect,listen";
};
grant { // 所有代碼
permission java.io.FilePermission "appversion.properties", "read,write";
};
SecurityManager(-Djava.security.manager 或代碼 System.setSecurityManager())。CodeSource 查策略構建 ProtectionDomain(權限集合)。checkRead/Write/Connect/...。AccessController.checkPermission(perm) 遍歷調用棧 ProtectionDomain,全棧通過才允許。AccessControlException,操作中止。核心 API 類(啟動類加載器載入)不受 SecurityManager 限制,這也是類加載器必須守護核心類不被替換的原因。
| API | 全稱 | 核心功能 | 典型場景 |
|---|---|---|---|
| JCE | Java Cryptography Extension | 對稱/非對稱加密、摘要、MAC、密鑰管理、填充/模式 | 數據加密存儲、簽名驗證、密鑰協商 |
| JSSE | Java Secure Socket Extension | SSL/TLS 協議、HTTPS、證書管理、密鑰庫/信任庫 | 安全通訊通道、Web Service 安全、雙向認證 |
| JAAS | Java Authentication and Authorization Service | 主體認證、登入模組、基於主體的授權 | 登入模組、單點登入、動態權限綁定 |
keytool 管理 Keystore(私鑰+證書)與 Truststore(信任 CA)。SSLSocketFactory、服務端 SSLServerSocketFactory 獲取安全 Socket。Java 安全框架提供靈活健壯的防護,但仍面臨挑戰:
隨著技術演進,Java 安全模型持續增強(模組系統強封裝、外部金鑰存儲 SPI、Post-Quantum 密碼學預研),開發者需配合最佳實踐:最小權限原則、定期輪換金鑰、審計敏感操作、升級運行時版本。