Java Security 介紹

1.介紹

Java平臺設計的重點是安全性。在其核心,java語言自己是類型安全的而且提供了垃圾自動回收,這使其增長了應用程序代碼的健壯性。安全的類加載以及驗證機制確保了只有合法的代碼纔可以執行。
初期的java平臺爲不信任的代碼建立了一個安全的獨立運行的安全環境,例如從公網下載的java applets。隨着平臺的增加以及部署範圍的擴張,Java安全體系結構也相應地演變爲支持日益增加的服務集。時至今日,這個架構包含了一系列的API,工具以及經常使用安全算法、機制和協議的實現。這就給開發者開發應用提供了不少安全框架,爲用戶或者管理員提供了安全管理應用程序的工具集。
Java安全API的範圍很廣,Cryptographic and public key infrastructure (PKI)接口爲開發安全應用提供了基礎。執行安全認證以及訪問控制的的接口確保應用可以組織未受權的方位來保護資源的安全。
API容許對算法以及其餘的安全服務進行多個可操做的實現。由Provider實現服務,經過標準接口嵌入到java平臺,這就使應用程序包含了安全服務而沒必要知道任何關於他們的實現。這就容許開發者專一於怎樣在服務中集成安全機制而不用考慮如何實現複雜的安全機制。
Java平臺提供了許多Providers來實現許多核心的安全服務。一樣頁能夠容許安裝額外的定製Provider。這就確保了開發者可使用新的安全機制來擴展平臺功能。java

2.Java語言安全以及字節碼驗證

Java語言從設計開始就是類型安全的易用的。提供了內存自動管理,垃圾回收以及數據越界檢查等機制。這就減小了開發者的編程壓力,有更少的編程錯誤以及更安全健壯的代碼。
Java定義了不一樣的修飾符,這些修飾符能夠標記在類,方法,字段上使開發人員可以適當地限制對其類實現的訪問。語言定義了4中不一樣的訪問層級:private,protected,public ,package(沒有特殊說明的話)。public是訪問限制最小的修飾符,任何人均可以訪問。private是限制最嚴的修飾符不容許外部訪問私有的成員。protected修飾符容許子類訪問或者同包下的其餘類訪問。包級別的訪問只容許同包下的類訪問。
Java編譯器將java程序翻譯成獨立於機器的字節碼錶示。字節碼驗證的使用就是確保在Java運行的時候合法的字節碼執行。檢查字節碼是否聽從Java語言規範不要違反Java語言罪責以及命名約束。檢車器一樣檢查內存管理問題、棧是否溢出、不合法的數據類型轉換。一旦字節碼經過檢驗,Java運行時就準備執行他們。git

3. 基本安全架構

Java平臺定義了一系列的API來覆蓋了不少主要的安全範圍,包括cryptography, public key infrastructure, authentication, secure communication, and access control。這些API能夠方便開發者很容易的集成安全機制到他們的應用中。可使用以下規則去設計實現:算法

  • 實現獨立性

應用程序不須要本身實現安全,而是能夠從Java平臺中調用安全服務。安全服務在提供者(見下文)中實現,它們經過標準接口嵌入到Java平臺中。應用程序可能依賴多個獨立的Provider來實現安全功能。編程

  • 實現互操做性

Providers 在應用程序之間是可互操做的。應用程序不會綁定到指定的provider上,provider也不會綁定到應用上。安全

  • 算法的擴展性

Java平臺包含了許多內建的實現了一系列經常使用的基本安全服務的provider。然而,一些程序可能會依賴新出現的還沒實現的標準,或者專利服務。Java平臺支持安裝自定義實現這樣服務的provider。架構

Security Providers

Java java.security.Provider 類封裝了Java平臺中的安全Provider的概念。具體說明了Provider的名稱而且列出了他實現的安全服務。同一時間多個Provider可能會被使用,而且在安照優先順利列出。當安全服務被調用的時候,實現該服務的最高權限的Privider將會被選中。
應用程序依賴相關的getInstance方法從底層的provider來獲取安全服務。例如,信息摘要建立表明這provider提供的一種服務類型。應用程序調用java.security.MessageDigest類的getInstance方法來獲取指定信息摘要算法的實現,例如 SHA-256.app

MessageDigest md = MessageDigest.getInstance("SHA-256");

程序能夠選擇性的去調用一個指定的provider實現,像以下同樣,指定provider的名稱:框架

MessageDigest md = MessageDigest.getInstance("SHA-256", "ProviderC");

diagram showing an application requesting an SHA-256 algorithem without specifying a provider name
圖1 Provider 查找
diagram showing an application requesting an SHA-256 algorithem from a specific providerdom

圖2 指定Provider
圖1,2 解釋了請求SHA-256信息摘要算法實現的過程。兩幅圖片都有三個provider實現了信息摘要算法。provider經過引用從左到右順序排列。在圖一中,應用程序請求SHA-256算法實現而沒有指定provider的名稱。
provider就會按照引用的順序去查找,查找第一個實現該算法的privider-ProviderB就被返回了。在圖2中,應用程序請求SHA-256算法,而且帶有相應的privider-ProviderC參數。此時,指定的Provider就返回了
即便有一個更高優先級的ProviderB一樣提供了SHA-256實現。ide

File Locations(文件位置)

本文中提到的Java安全性的某些方面,包括provider的配置,能夠經過設置安全屬性來定製。 您能夠在安全屬性文件中靜態設置安全性屬性,默認狀況下,該文件是安裝Java™運行時環境(JRE)的目錄的lib / security目錄中的java.security文件。 也能夠經過調用Security類的適當方法(在java.security包中)動態設置安全屬性。
本文中提到的工具和命令都在~jre / bin目錄中,其中~jre表明安裝JRE的目錄。 第5節中提到的cacerts文件位於~jre / lib / security中。

4. Cryptography(加密)

Java加密架構是kava平臺訪問開發加密功能的框架。它包含多種多樣的加密服務,包括:

  • Message digest algorithms
  • Digital signature algorithms
  • Symmetric bulk encryption
  • Symmetric stream encryption
  • Asymmetric encryption
  • Password-based encryption (PBE)
  • Elliptic Curve Cryptography (ECC)
  • Key agreement algorithms
  • Key generators
  • Message Authentication Codes (MACs)
  • (Pseudo-)random number generators

因爲歷史緣由,加密API放在了兩個不一樣的包裏面。java.security 包包含不受出口控制限制的(像Signature以及MessageDigest)。javax.crypto 包包含着受出口控制限制的類(Cipher以及KeyAgreement)。
加密接口是基於provider的,容許多個可互操做的加密實現。一些provider可能實在軟件中執行加密操做,另外的可能會基於硬件的token來執行操做。提供出口控制的Provider服務必須是數字簽名的。
Java內置的Provider提供了許多通用的密碼算法,好比:RSA, DSA, ECDSA等簽名算法、DES, AES, ARCFOUR等加密算法、MD5, SHA-1, SHA-256等信息摘要算法、還有Diffie-Hellman和ECDH這樣的密鑰協商算法。

點擊該連接,獲取博客解鎖驗證碼

相關文章
相關標籤/搜索