1. 程式人生 > >java 安全沙箱模型詳解

java 安全沙箱模型詳解

起到第一道安全保障作用的”雙親委派類載入模型”

雙親委派方式的類載入,指的是優先從頂層啟動類載入器開始,自頂向下的方式載入類的模型(參見第一條類裝載器體系結構)。

這種模型的好處是,底層的類裝載器裝載的類無法與頂層類裝載器裝載的類相互呼叫。
哪怕是同包下的類,只要他們不屬於同一類裝載器,都是相互隔絕的。這對一些有安全隱患的類起到了安全隔離的作用。使它不能冒充系統類來破壞程式正常運作。

此外,不同的類裝載器,也有自己的類裝載範圍。比如啟動類裝載器,它只會裝在jdk/lib目錄下的包/類,因此,系統級的類是相對安全的。

java類載入模型

class檔案校驗器,通過四趟掃描,保證了class檔案正確

第一趟是,檢查class檔案的結構是否正確。比較典型的就是,檢查class檔案是否以魔數OxCAFEBABE打頭。
通過這趟檢查,可以過濾掉大部分可能損壞的,或者壓根就不是class的檔案,來冒充裝載。

第二趟是,檢查它是否符合java語言特性裡的編譯規則。比如發現一個類的超類不是Object,就丟擲異常。

第三趟是,檢查位元組碼是否能被JVM安全的執行,而不會導致JVM崩潰。這裡提到了一個停機的問題。內容是這樣的,“即不可能寫出一個程式,用它來判定作為其輸入而讀入的某個程式,是否會停機”。意思是,不可能寫一個程式,讓它告訴你,另外一個程式會不會中斷或崩潰。

第四趟是,符號引用驗證。一個類檔案,它會包含它引用的其他類的全名和描述符,並跟他們建立符號引用(一種虛擬的,非物理連線的方式)。當程式第一次執行到需要符號引用的位置時,jvm會檢查這個符號連結的正確性,然後建立真正的物理引用(直接引用)。

jvm型別安全特性

這些都是基礎的java語言特性,他們降低了java程式出現記憶體混亂,崩潰的機率。
結構化記憶體訪問(不使用指標,一定程度上讓黑客無法篡改記憶體資料)
自動垃圾收集
陣列邊界檢查
空引用檢查
資料型別安全

Java api的安全管理器 securityManager

這是安全沙箱中,離我們程式設計師最接近的一環。
securityMananger,是一個api級別的,可自定義的安全策略管理器,它深入到java api中,在各處都可以見到它的身影。比如SecurityClassLoader。

預設情況下,java應用程式是不設定 securityManager 例項的(意味著不會起到安全檢查),這個例項需要我們在程式啟動時通過 System.setSecurityManager 來設定。

一般情況下,檢查許可權是,通過 SecurityManager.checkPermission(Permission perm) 來完成的。外部程式通過,建立Permission例項,傳遞給前面的check。

Permission是一個抽象類,需要繼承它實現不同的許可權驗證,比如 FilePermission,代表對某個檔案的讀寫許可權。
new FilePermission(”test.txt”, “read”)
你可以將這個例項,扔給 SecurityManager,檢查是否可讀text.txt這個檔案。

java簽名/證書機制

java簽名/證書機制,可以保障使用者,安全地呼叫外部提供的jar,防止你信任的jar被篡改。

首先,java的簽名,必須是基於jar包的。也就是說,你必須將你要提供的class,打包到jar裡。
然後,通過 java 提供的簽名工具(jarsigner)對jar包進行簽名,釋出。

簽名原理:
使用非對稱演算法,生成一對公鑰/私鑰。
java簽名原理

證書
證書是在簽名基礎上,對簽名值,再進一步做一次加密。而這次加密使用的私鑰和公鑰都是證書機構提供的。
這種方式,是為了防止,有些惡意使用者,在公鑰發到你手上前,就對其做了手腳,然後再發一個動過手腳的jar給你,用動過手腳的公鑰解動過手腳的jar包,是可以解開的。
而使用證書後,它會對已經加密的簽名值,再做一層加密,這樣,到你手裡,你只需要通過證書機構的公鑰進行解密,然後再用jar包釋出者的公鑰解密就行了。(只能在一定程度上,提供一些安全性)

相關推薦

java 安全沙箱模型

起到第一道安全保障作用的”雙親委派類載入模型” 雙親委派方式的類載入,指的是優先從頂層啟動類載入器開始,自頂向下的方式載入類的模型(參見第一條類裝載器體系結構)。 這種模型的好處是,底層的類裝載器裝載的類無法與頂層類裝載器裝載的類相互呼叫。 哪怕是同包下的類,只要他們不屬

java內存模型

讀寫 tro center 設計者 === 就是 單線程 名稱 1-1 對於本篇文章,將從四個概念來介紹:內存模型基礎,重排序,順序一致性和happens-before 1.內存模型基礎 在並發編程中,有兩個關鍵問題:線程之間如何通信和如何同步。由此而引出了兩種並發模型:共

Java基礎:由JVM記憶體模型執行緒安全

1.前言 最近在研究JVM記憶體模型和Java基礎知識。主要講的是執行緒共享變數與執行緒私有變數以及如何寫出執行緒安全的程式碼。這裡列出一條規則,“類中的成員變數,也叫例項變數,也叫全域性變數,它是非執行緒安全,是所有執行緒共享的變數,定義在方法中的私有變數是執行緒安全的,是每個執行緒私

Java虛擬機:內存模型

調用 數據類型 可擴展 空間 共享 sof 虛擬機 進程 部分 版權聲明:本文為博主原創文章,轉載請註明出處,歡迎交流學習! 我們都知道,當虛擬機執行Java代碼的時候,首先要把字節碼文件加載到內存,那麽這些類的信息都存放在內存中的哪個區域呢?當我們創建一個

Java虛擬機器:記憶體模型

      我們都知道,當虛擬機器執行Java程式碼的時候,首先要把位元組碼檔案載入到記憶體,那麼這些類的資訊都存放在記憶體中的哪個區域呢?當我們建立一個物件例項的時候,虛擬機器要為物件分配記憶體,Java虛擬機器又是如何配分記憶體的呢?這些都涉及到Java虛擬機器的記

【搞定Java併發程式設計】第7篇:Java記憶體模型

上一篇:ThreadLocal詳解:https://blog.csdn.net/pcwl1206/article/details/84859661 其實在Java虛擬機器的學習中,我們或多或少都已經接觸過了有關Java記憶體模型的相關概念(點選檢視),只不過在Java虛擬機器中講的不夠詳細,因此

Java執行緒安全的集合

一、早期執行緒安全的集合 我們先從早期的執行緒安全的集合說起,它們是Vector和HashTable 1.Vector Vector和ArrayList類似,是長度可變的陣列,與ArrayList不同的是,Vector是執行緒安全的,它給幾乎所有的publ

Java記憶體模型

前言 Java記憶體模型(Java Memory Model,簡稱JMM),即Java虛擬機器定義的一種用來遮蔽各種硬體和作業系統的記憶體訪問差異,以實現讓java程式在各種平臺下都能夠達到一致的記憶體訪問效果的記憶體模型。本篇文章大致涉及到五個要點:Java記憶體模型的基礎,主要介紹JMM抽象結構;Jav

java Io 流類

修改 文件目錄 != exe [] 深入 clas one fileinput 關於java 流類的復習;習慣性的復習按照圖結構一層層往下深入去了解去復習,最後通過代碼來實現感覺印象會更深刻一些; 關於 I/O流:IO可以理解為JAVA用來傳遞數據的管道

java Pattern和Matcher

而且 建議 exc regex 示例 aabb 工廠 sta 數字 結論:Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持. 單獨用Pattern只能使用Pattern.matcher(String reg

Java 多線程(三)------線程的同步

alt 來看 監聽 介紹 創建進程 java 多線程 system ima 關鍵字 Java 多線程詳解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多線程詳解(二)------如何創建進

Java反射機制深入

const 運行時 設計 應用程序 類加載器 分配 import 程序 為什麽 一.概念   反射就是把Java的各種成分映射成相應的Java類。   Class類的構造方法是private,由JVM創建。   反射是java語言的一個特性,它允程序在運行時(註意不是編譯的

綜合運用: C++11 多線程下生產者消費者模型(轉)

並發 rep 生產 我會 交流 模型 操作 const ref 生產者消費者問題是多線程並發中一個非常經典的問題,相信學過操作系統課程的同學都清楚這個問題的根源。本文將就四種情況分析並介紹生產者和消費者問題,它們分別是:單生產者-單消費者模型,單生產者-多消費者模型,多生產

10.5-全棧Java筆記:常見流(三)

java上節我們講到「Java中常用流:緩沖流」,本節我們學習數據流和對象流~ 數據流數據流將“基本數據類型變量”作為數據源,從而允許程序以與機器無關方式從底層輸入輸出流中操作java基本數據類型。 DataInputStream和DataOutputStream提供了可以存取與機器無關的所有Java基礎類

java字符串

字符串 [] min 詳解 pro java true 常量 intern class StringEqualTest { public static void main(String[] args) { String s1 = "Programming";

OSI七層模型

集線器 提高 ram 轉發數據 -m 數據傳遞 prot 電子郵件 bio OSI 七層模型通過七個層次化的結構模型使不同的系統不同的網絡之間實現可靠的通訊,因此其最主要的功能就是幫助不同類型的主機實現數據傳輸 。 完成中繼功能的節點通常稱為中繼系統。在OSI七層

Java的反射機制(一)

pbc spa 詳解 uno face target lan tor cin 8n72q傅釁8戰sig叢http://www.docin.com/app/user/userinfo?userid=179185461 8u炊3F7LB椒1http://huiyi.docin.

Java線程池

最大 rar exception subject alt mod allow 隨著 double 一、線程池初探 所謂線程池,就是將多個線程放在一個池子裏面(所謂池化技術),然後需要線程的時候不是創建一個線程,而是從線程池裏面獲取一個可用的線程,然後執行我們的任務。線程池

Java中反射機制

turn face instance java struct () 分享 2.6 一個     序言       在學習java基礎時,由於學的不紮實,講的實用性不強,就覺得沒用,很多重要的知識就那樣一筆帶過了,像這個馬上要講的反射機制一樣,當時學的時候就忽略了,到後來學習

Java Web(一) Servlet!!

註意 ont 道理 resource 通過 long values arr 客戶端請求     這篇文章到上一篇,距離的有點遙遠呀,隔了大概有兩個月把,中間在家過了個年,哈哈~ 現在重新開始拾起,最近在看一本個人覺得很棒的書,《Java Web 整合開發王者歸來》,現在寫的