天天看點

Java核心技術卷二筆記9

第九章 安全

對Java而言,安全機制是一個不可分割的組成部分。Java提供以下三種確定安全的機制:

語言設計特性,如對數組的邊界檢查。

通路控制機制,如檔案通路。

代碼簽名,代碼的使用者可以知道誰建立了代碼以及是否被修改。

每個Java程式至少擁有三個類加載器

引導類加載器,用于加載系統類,沒有ClassLoader對象

擴充類加載器。從jre/lib/ext目錄加載标準的擴充

系統類加載器,加載應用類

類加載器有一種父子關系,除了引導類加載器之外,每個類加載器都有一個父類加載器。加載時會先加載父類,隻有當父類加載器加載失敗後才會加載給定類。

每一個線程都一個對類加載器的引用,稱為上下文加載器。主線程的上下文類加載器是系統類加載器。當新線程被建立時,它的上下文類加載器就是建立該線程的上下文類加載器。是以所有線程的預設上下文加載器是系統類加載器。

同一個虛拟機中可以有類名和包名完全相同的兩個類。

自定義類加載器隻需要将其繼承ClassLoader類,覆寫findClass方法。ClassLoader類本身的超類的loadClass方法将類的加載操作委托給其父類加載器進行,隻有該類及其父類都未加載該類時才調用findClass方法。

實作findClass方法,首先要為來自本地檔案及其他各個來源的類加載其位元組碼,其次要調用ClassLoader超類的defieClass方法,向虛拟機提供位元組碼。

當類加載器将自己嗎傳遞給虛拟機時,位元組碼要先接受校驗器的校驗。校驗器負責檢查那些指令無法執行的有明顯破壞性的操作。除了系統類外的所有類都要被校驗,校驗器有以下校驗内容。

變量在使用前需初始化。

方法調用和對象引用類型之間要比對。

通路私有資料和方法的規則沒有被違反。

對本地變量的通路都落在運作時堆棧内。

運作時堆棧沒有溢出。

安全管理器是一個負責控制u具體操作是否允許執行的類。

從Java1.2之後,Java平台的安全政策建立了代碼來源和通路權限集之間的映射關系。

代碼來源由一個代碼位置和證書集組成,權限是指由安全管理器負責檢查的任何屬性。

每個類都有一個保護域,它是用于封裝類的代碼來源和權限集合的對象。

政策管理器要讀取對應的政策檔案,這些檔案包含了将代碼來源映射為權限的指令。

Windows驅動器名前面的斜杠是可有可無的。

登入時要對登入的主體Subject進行認證,該主體可以有多個特征principal。特征描述了主體的某些屬性,比如使用者名、組ID、角色等。特征管制着各個權限。

消息摘要是資料塊的資料指紋。如SHA1可将任意長度資料塊壓縮為160位的序列。它具有兩個基本屬性。

如果資料改變了,消息摘要也将改變。

擁有給定消息的僞造者無法建立與原消息具有相同摘要的假消息。

MessageDigest類是用于建立封裝了指紋算法的對象的工廠以及作為所有消息摘要算法的超類,它的靜态方法getInstance傳回了繼承MessageDigest類的某個類的對象,其中的update方法需要在整個對位元組的循環中反複調用。如果位元組存放在數組中則可以省去循環,一次性完成整個數組的更新。随後調用的digest方法會議位元組數組的形式傳回消息摘要。

消息發送者對摘要進行私鑰加密形成簽名,消息接收者對簽名使用公鑰解密,如果解密成功則說明消息确實來自于該發送者。

通過一個受信任的中間人對發送者的公共密鑰進行私鑰加密,接收方再對該加密後的公鑰使用中間人的公鑰進行解密,確定發送方的公鑰的可靠性。

Cipher類是所有加密算法的超類。通過getInstance方法擷取一個密碼對象,再對其設定模式和密鑰進行初始化。

非對稱密碼的關鍵在于使用接收者的公鑰将發送者的對稱密鑰進行加密,該加密後的對稱密鑰隻能被接收者用自己的私鑰解密。隻有擷取解密後的發送者的對稱密鑰,才能将加密後的明文解密。