之前介绍XML的时候讲过Java加密库和算法,今天我们具体聊聊Java安全方面的知识。
Java Security 是 Java 平台提供的安全机制和 API,用于保护 Java 应用程序和用户的数据免受各种安全威胁,如身份验证、授权、数据机密性和完整性、代码完整性、网络安全等。
Java Security 体系结构主要由以下组件组成:
-
安全提供者(Security Provider):Java 中的安全提供者是一种实现了特定安全服务的软件模块,如消息摘要、数字签名、加密和密钥管理等。Java 安全提供者必须遵循 Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 规范,这些规范定义了 Java 安全框架中的加密算法、密钥管理、数字签名和消息认证等方面的实现细节。
-
安全管理器(Security Manager):Java 中的安全管理器用于控制 Java 应用程序对系统资源的访问,如文件、网络、系统属性等。安全管理器可以实施安全策略,防止应用程序访问受限资源,以保护系统安全和应用程序数据的机密性。
-
安全策略(Security Policy):Java 安全策略定义了 Java 应用程序的安全权限,指定了哪些操作需要特定的安全权限才能执行,如文件访问、网络连接、类加载等。安全策略是一个 Java 安全管理器所需的配置文件,它可以使用 Java 安全策略工具(policytool)创建和编辑。
-
安全 API:Java 安全 API 提供了用于实现和处理加密和数字签名、密钥管理、安全令牌和网络安全等的接口和类。
Security Provider
安全提供者(Security Provider)是 Java 安全架构中的一个重要概念,它是用于实现各种密码学算法、安全服务和功能的具体实现。在 Java 中,安全提供者是通过 java.security.Provider
类来表示的。每个安全提供者都可以包含一组算法实现、密钥生成器、消息摘要、随机数生成器等等,用于在应用程序中实现各种安全功能。
安全提供者的主要目的是将算法和安全服务的具体实现与 Java 程序的其余部分分离,从而允许开发人员根据需要选择适合其需求的提供者。这种模块化的设计使得 Java 应用程序可以轻松地在不同的安全提供者之间切换,而不需要修改大部分应用程序代码。
例如,假设你想在 Java 中实现对称加密。你可以选择使用 Java 默认的安全提供者,也可以选择使用其他第三方提供的安全提供者。通过将特定的安全提供者配置到你的应用程序中,你可以使用这些提供者的加密算法,如 AES、DES 等,来保护数据的机密性。
在使用安全提供者时,你可以使用以下步骤:
-
通过
Security.addProvider(provider)
方法将一个特定的安全提供者添加到 Java 运行时。 -
使用
Security.getProvider(providerName)
方法获取已添加的提供者的实例。 -
通过提供者的实例使用各种算法和服务。
Java中有许多常见的安全提供者,它们实现了各种密码学算法、安全服务和功能。以下是一些
常见的Java安全提供者
-
SunJSSE:这是Oracle JDK中默认的SSL/TLS提供者,用于实现加密的网络通信。
-
SunJCE:这是Oracle JDK中默认的Java加密扩展提供者,提供了诸如AES、DES、RSA等常用加密算法的实现。
-
SunRsaSign:同样是Oracle JDK中的提供者,提供了RSA和DSA等数字签名算法的实现。
-
SunPKCS11:该提供者允许Java应用程序通过PKCS #11标准与硬件安全模块(HSM)进行交互。
-
BC(Bouncy Castle):Bouncy Castle是一个开源的Java加密库,提供了丰富的密码学算法和安全服务,包括一些非标准和高级的加密算法。
-
IBMJCE:IBM提供的Java加密扩展提供者,包含了丰富的密码学算法和加密功能。
-
IBMJCEFIPS:这是IBM提供的FIPS 140-2认证的密码库,用于提供符合美国联邦信息处理标准(FIPS)的加密算法和功能。
-
Apple:用于Apple JDK的安全提供者,提供了与苹果操作系统相关的安全功能。
-
OpenJDK:OpenJDK是一个开源的Java平台实现,它也提供了一些默认的安全提供者,类似于Oracle JDK。
-
PKCS11:该提供者实现了与硬件安全模块(HSM)通过PKCS #11标准进行交互。
-
IAIK:IAIK(Institute for Applied Information Processing and Communications)提供了高级密码学功能和安全服务。
Security Manager
安全管理器(Security Manager)是 Java 安全模型的一部分,用于控制运行在 Java 虚拟机(JVM)中的应用程序对系统资源的访问权限。它提供了一种机制,允许应用程序在受控的沙箱环境中运行,以防止恶意代码或不受信任的代码访问系统资源或执行危险操作。
安全管理器通过实施安全策略来管理应用程序的行为。安全策略是一组权限规则,定义了哪些操作和资源是允许的,哪些是被禁止的。如果应用程序尝试执行被限制的操作,安全管理器将抛出 SecurityException
异常,从而阻止该操作的执行。
以下是一些安全管理器的主要功能和用途:
-
授权和许可: 安全管理器可以根据权限策略授予或拒绝应用程序对敏感资源(如文件、网络、系统属性等)的访问权限。
-
沙箱环境: 安全管理器允许在受控的沙箱环境中运行应用程序,限制其对系统资源的访问。这对于执行不受信任的代码、测试代码或运行用户提交的代码非常有用。
-
动态策略配置: 安全管理器的策略可以在运行时动态配置,允许管理员根据应用程序的需求进行调整。
-
防止恶意代码: 安全管理器可以防止恶意代码执行危险操作,如文件删除、网络攻击等。
在启用安全管理器时,Java 应用程序会在运行时检查其操作是否符合定义的安全策略。要启用安全管理器,需要在应用程序中添加以下代码:
System.setSecurityManager(new SecurityManager());
然后,可以根据需要自定义和配置安全策略文件,指定哪些权限是允许的,哪些是禁止的。安全策略文件通常使用 Java 安全策略语言(Policy File Syntax)编写。
Security Policy
安全策略(Security Policy)是一个用于控制Java应用程序对资源和操作的访问权限的规则集合。它定义了哪些权限可以被授予特定的代码库、主体(Principals)和资源。Java的安全策略是通过java.policy
文件(或其他指定的文件)来配置的。
Java 安全策略语言(Policy File Syntax)
Java 安全策略语言(Policy File Syntax)是用于定义 Java 安全管理器的权限策略的一种语言。这种语言用于创建安全策略文件,其中包含了规定了哪些权限可以被授予给运行在 Java 虚拟机中的应用程序。这些文件告诉安全管理器如何授权或拒绝应用程序对特定资源和操作的访问。
Java 安全策略语言使用类似于配置文件的格式,其中包含了权限和代码源的规则。以下是一些常见的语法和元素:
-
Permission 类别:权限声明的类别,例如
java.io.FilePermission
、java.net.SocketPermission
等。 -
Codebase:指定代码的来源位置。可以使用 URL 或文件路径来标识代码库。
-
Principals:指定了授权给特定主体(Subject)的权限。主体可以是代码库、用户、组等。
-
Permission 权限:指定了授予主体的具体权限,如读写文件、访问网络等。
示例安全策略文件的一部分可能如下所示:
grant codeBase "file:/path/to/your/application.jar" {
permission java.io.FilePermission "/path/to/allowed/file", "read";
permission java.net.SocketPermission "example.com", "connect";
};
// Global permissions for all code
grant {
permission java.security.AllPermission;
};
在此示例中:
-
codeBase
指定了代码库的来源位置。 -
permission
表示授予特定权限。第一个参数指定了受影响的资源或操作,第二个参数指定了权限类型,如 "read" 或 "connect"。 -
第一个
grant
块指定了对特定代码库(在这里是/path/to/your/application.jar
)的权限配置。它允许该代码库读取/path/to/allowed/file
文件和连接到example.com
。 -
第二个
grant
块没有指定codeBase
,因此它应用于所有代码库。它授予了java.security.AllPermission
,允许所有权限。
安全策略文件通常以 .policy
为扩展名,您可以根据需要将其放置在系统的某个位置。默认情况下,Java 会在当前工作目录中寻找名为 java.policy
的策略文件。
您可以通过设置系统属性来显式指定安全策略文件的位置。例如,在启动应用程序时使用以下命令行参数来指定策略文件位置:
-Djava.security.policy=/path/to/your/java.policy
Security API
当涉及Java安全API的体系架构时,可以考虑以下组件和层次,它们一起构成了Java安全体系的基本结构:
-
基础安全层(Basic Security Layer):
-
Java Security Architecture(JSA):定义了Java中的安全模型、权限控制、类加载和代码执行机制。它是Java安全体系的基础。
-
-
安全管理层(Security Management Layer):
-
Security Manager(安全管理器):控制代码对系统资源的访问权限。它通过安全策略文件定义哪些操作是允许的,哪些是被禁止的。
-
Java Authentication and Authorization Service (JAAS):用于实现用户认证和授权的框架。它支持不同的认证模块和登录模块,使开发人员能够定义自定义的身份验证和授权机制。
-
-
加密和密钥管理层(Cryptography and Key Management Layer):
-
Java Cryptography Architecture (JCA):提供了加密、解密、密钥生成、消息摘要等加密功能的API。
-
Java Cryptography Extension (JCE):在JCA基础上提供了更多的加密算法和协议,以满足更广泛的加密需求。
-
Java KeyStore (JKS):用于存储加密密钥和数字证书的API。
-
-
数字签名和验证层(Digital Signature and Validation Layer):
-
Signature类:用于生成和验证数字签名,确保数据的来源和完整性。
-
java.security.cert包:处理X.509数字证书和证书链的功能,用于验证证书的合法性。
-
-
安全通信层(Secure Communication Layer):
-
Java Secure Socket Extension (JSSE):提供了在网络通信中实现安全传输层的API。用于创建基于SSL/TLS的加密套接字连接。
-
-
随机数生成层(Random Number Generation Layer):
-
SecureRandom类:提供了安全的随机数生成器,用于生成高质量的随机数。
-
-
访问控制层(Access Control Layer):
-
java.security.acl包:包含访问控制列表(ACL)的类,用于在应用程序中定义和管理资源的访问权限。
-
-
文件和目录权限控制层(File and Directory Permissions Layer):
-
Java的I/O和NIO API允许您在文件系统上设置和管理文件和目录的权限,以确保数据的安全性。
-
-
公钥基础设施(Public Key Infrastructure,PKI):
-
用于管理公钥和证书的框架,支持数字签名和认证。
-