Java Security 介紹


1.介紹

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

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

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

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.

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 provider

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

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這樣的密鑰協商算法。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM