在經驗豐富的 Java 開發人員看來,.Net 可能與 Java 平台很相似,它們都提供了一種創建應用程序的結構化方法,都有編譯為中間代碼的語言,都為應用程序開發提供了一個大型 API 庫。但實際上,.Net 的核心有一套與 Java 平台不同的目標。
從概念上講,Java 是兩樣東西:Java 平台(運行時和 API)和 Java 語言。Java 平台的用途是支持用 Java 語言編寫並被編譯為 Java 字節碼的應用程序。盡管進行了許多試圖將其他語言編譯為 Java 字節碼的工作,但是這些工作大部分都是學術活動。Java 的理想目標一直是“在多種平台上使用一種語言”。
.NET 也是兩樣東西:.NET Framework(運行時和 API)和大量支持它的編程語言。.NET Framework 的用途是支持用任一種語言編寫並被編譯為 MSIL 的應用程序。.Net 的目標是“多種語言共享一種平台”。
第一部分 安全配置和代碼封裝
安全配置
兩個平台的配置都是通過XML或純文本文件,兩個平台最大的區別在於處理安全配置體系的方式不同。
在.Net平台,有圖形接口和命令行二種方式來修改安全配置參數。Mscorcfg.msc是圖形接口方式,CASPol.exe提供了命令行方式,適用於批處理或配置文本。
Java平台只提供了圖形接口的工具policytool.exe。和.Net不同的是,它的目標對象(配置文件)的名字和位置不是固定的。
.Net定義了不同范圍的安全配置文件:系統范圍,本機范圍,本用戶范圍。在配置有沖突時,原則上小范圍的參數有優先權。
Java和J2EE的核心配置文件都保存在固定位置,但擴展配置文件隨廠家不同而不同。
代碼封裝:檢驗
Java 和.Net 的Common Library Runtime (CLR) 都實行內存安全或類型安全的保護機制,在這些平台開發的應用的安全性也是可以檢驗的。他們的實現機制有很大的不同。
在.Net, CLR總是執行編譯好的代碼,它不解釋代碼。但是在中間語言(IL)被編譯之前,編譯器會有驗證和檢驗的步驟。第一步是檢查文件的結構和代碼完整性;第二步包括一些擴展的檢查,內存安全、堆棧跟蹤、數據流分析、類型檢查等。在運行階段,由VES (Virtual Execution System) 來負責安全性檢查和出錯意外情況處理。
在JAVA平台,Java虛擬機(JVM)負責類的載入、鏈接、檢驗和執行。對於已經編譯和優化的代碼,JVM也用二個無條件調用堆棧來保留最初的字節代碼信息。
小結:和.NET不同,JVM的默認設置是不檢驗本地代碼。另外,JVM保留最初的字節代碼供運行時檢查,而.Net把靜態分析和運行時插入檢驗代碼相結合。
代碼封裝:應用隔離
在.NET, 域隔離建立在內存安全機制的基礎上,不同的域不能直接訪問彼此的地址空間,只能通過.Net遠程通信機制訪問。
在Java平台,應用隔離是通過ClassLoaders 和 ProtectionDomains 相結合來實現的,安全類加載是JVM安全機制的基石。
小結:.Net的 AppDomains 就象操作系統的進程一樣,使用起來比Java的 ProtectionDomains 更直接、容易一些。
代碼封裝: 語言特征
兩個平台基本上差不多,.Net在靈活性上稍微好一點。
總結:
Java在安全配置上有較多的優勢,.Net在代碼封裝的選擇性和易用性好一些。
第二部分 加密和通信
加密法:概論
.NET的加密法主要基於CryptoAPI 和相關擴展。大多數有關加密的類都在System.security.Cryptography, X509Centificates 和XML中。.NET利用基於流的模型來完成加密傳輸,所有的算法都被默認為最高的安全級別。.Net也允許用戶自己在 Machine.config 中定義自己的算法。
JAVA平台的加密算法分二個部分:Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE)。 JCE的出口受到有關法律的限制。如果要使用用戶自己的加密算法,必須得到認證機構(SUN 或 IBM)的認證。
加密法:算法
.Net主要提供了下面幾大類加密算法:非對稱算法、HASH算法、對稱算法、隨機數生成法。
JAVA提供的加密算法更多,但是較少第三方廠商可以在Java中提供自己的算法。
安全通信
SSL已經是事實的傳輸安全的工業標准了。Java和.Net都支持最新版本 SSL 3.0。