JDK安全剖析之安全处理入门

0.前言

Java 安全包括大量 API、工具以及常用安全算法、机制和协议的实现。Java 安全 API 涵盖了广泛的领域,包括加密、公钥基础设施、安全通信、身份验证和访问控制。Java 安全技术为开发人员提供了编写应用程序的全面安全框架,还为用户或管理员提供了一组工具来安全地管理应用程序。

1.简介

JDK 的设计非常注重安全性。从本质上讲,Java 语言本身是类型安全的,并提供自动垃圾收集功能,从而增强了应用程序代码的稳健性。安全的类加载和验证机制可确保仅执行合法的 Java 代码。Java 安全架构包括大量应用程序编程接口 (API)、工具以及常用安全算法、机制和协议的实现。

Java 安全 API 涉及领域广泛。加密和公钥基础设施 (PKI) 接口为开发安全应用程序提供了基础。执行身份验证和访问控制的接口使应用程序能够防止未经授权访问受保护的资源。

这些 API 允许多种可互操作的算法实现和其他安全服务。服务以以下方式实现:providers这些安全服务通过标准接口插入到 JDK 中,使应用程序可以轻松获取安全服务,而无需了解其实现。这使开发人员可以专注于如何将安全性集成到应用程序中,而不是如何实际实现复杂的安全机制。

JDK 包含许多实现一组核心安全服务的提供程序。它还允许安装其他自定义提供程序。这使开发人员能够使用新的安全机制扩展平台。

JDK 分为多个模块。包含安全 API 的模块包括:

模块描述
java.base定义Java SE的基础 API ;所含的包包括 java.security,javax.crypto,javax.net.ssl, 和javax.security.auth
java.security.jgss定义 IETF 通用安全服务 API (GSS-API) 的 Java 绑定。此模块还包含 GSS-API 机制,包括 Kerberos v5 和 SPNEGO
java.security.sasl定义 Java 对 IETF 简单身份验证和安全层 (SASL) 的支持。此模块还包含 SASL 机制,包括 DIGEST-MD5、CRAM-MD5 和 NTLM
java.smartcardio定义 Java 智能卡 I/O API
java.xml.crypto定义 XML 加密的 API
jdk.jartool定义用于签名 jar 文件的 API
jdk.security.auth提供以下实现javax.security.auth.*接口及各类认证模块
jdk.security.jgss定义 GSS-API 的 Java 扩展和 SASL GSS-API 机制的实现

1.Java 语言安全和字节码验证

Java 语言旨在确保类型安全且易于使用。它提供自动内存管理、垃圾收集和数组范围检查。这减轻了开发人员的总体编程负担,减少了细微的编程错误,并提高了代码的安全性和稳定性。

编译器将 Java 程序转换为与机器无关的字节码表示。调用字节码验证器来确保在 Java 运行时中仅执行合法的字节码。它检查字节码是否符合 Java 语言规范,并且不违反 Java 语言规则或命名空间限制。验证器还会检查是否存在内存管理违规、堆栈下溢或溢出以及非法数据类型转换。验证字节码后,Java 运行时会准备执行它们。

此外,Java 语言还定义了不同的访问修饰符,可以将其分配给 Java 类、方法和字段,从而使开发人员能够根据需要限制对其类实现的访问。该语言定义了四种不同的访问级别:

  • private:最严格的修饰符;在定义私有成员(例如,方法)的特定类之外不允许访问。
  • protected:允许访问任何子类或同一包内的其他类。
  • Package-private:如果未指定,则这是默认访问级别;允许访问同一包内的类。
  • public:不再保证元素在任何地方均可访问;可访问性取决于包含该元素的包是否由其定义模块导出,以及该模块是否可由包含试图访问它的代码的模块读取。

2.基础安全架构

JDK 定义了一组涵盖主要安全领域的 API,包括加密、公钥基础设施、身份验证、安全通信和访问控制。这些 API 允许开发人员轻松地将安全性集成到其应用程序代码中。

API 的设计遵循以下原则:

  • 实现独立(Implementation Independence)
    应用程序无需自行实现安全性。相反,它们可以从 JDK 请求安全服务。安全服务在提供程序中实现(请参阅安全提供程序部分),这些提供程序通过标准接口插入 JDK。应用程序可以依赖多个独立的提供程序来实现安全功能。

  • 实现互操作性(Implementation interoperability)
    提供程序可跨应用程序互操作。具体而言,如果应用程序不依赖提供程序的默认值,则不会绑定到特定提供程序。

  • 算法可拓展(Algorithm extensibility)
    JDK 包含许多内置提供程序,它们实现了目前广泛使用的一组基本安全服务。但是,某些应用程序可能依赖于尚未实现的新兴标准或专有服务。JDK 支持安装实现此类服务的自定义提供程序。

3.安全提供商

该类java.security.Provider封装了 Java 平台中的安全提供程序的概念。它指定提供程序的名称并列出其实现的安全服务。可以同时配置多个提供程序,并按优先顺序列出。当请求安全服务时,将选择实现该服务的最高优先级提供程序。

应用程序依靠相关getInstance方法向底层提供商请求安全服务。

例如,消息摘要创建代表提供商提供的一种服务。要请求特定消息摘要算法的实现,请调用方法java.security.MessageDigest.getInstance以下语句请求 SHA-256 消息摘要实现而不指定提供者名称:

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

下图说明了此语句如何获取 SHA-256 消息摘要实现。按优先顺序搜索提供商,并ProviderC返回提供该特定算法的第一个提供商的实现。
在这里插入图片描述说明
您可以选择通过指定提供商的名称来请求特定提供商的实现。

Oracle 的 Java 平台实现包含许多内置默认提供程序,这些提供程序实现了一组可供应用程序使用的基本安全服务。请注意,Java 平台的其他供应商实现可能包含不同的提供程序集,这些提供程序集封装了特定于供应商的安全服务集。术语“内置默认提供程序”是指 Oracle 实现中可用的提供程序。

4.文件位置

下表列出了一些与安全相关的文件和工具的位置。

文件名或工具名称位置描述
java.security/conf/securityJava 安全性的某些方面(例如配置提供程序)可通过设置安全属性进行自定义。您可以在文件中静态设置安全属性java.security。还可以通过调用Security类(在 java.security包中)的适当方法来动态设置安全属性。
java.policy/conf/security这是默认的系统策略文件;请参阅安全策略。
加密策略目录/conf/security/policy该目录包含多组管辖权策略文件;请参阅加密强度配置。
cacerts/lib/security该cacerts 文件代表包含证书颁发机构 (CA) 和其他受信任证书的系统范围密钥库。有关配置和管理此文件的信息,请参阅Java 平台标准版工具参考中的keytool。
keytool, jarsigner仅限 Windows : kinit,,klistktab/bin有关安全相关工具的更多信息,请参阅Java 平台标准版工具参考中的安全工具和命令。

5.Java 加密

Java 加密架构是用于访问和开发 Java 平台加密功能的框架。

它包括各种加密服务的 API,其中包括:

  • 消息摘要算法
  • 数字签名算法
  • 对称批量和流加密
  • 非对称加密
  • 基于密码的加密(PBE)
  • 椭圆曲线密码术 (ECC)
  • 密钥协商算法
  • 密钥生成器
  • 消息认证码 (MAC)
  • 安全随机数生成器

由于历史(出口管制)原因,加密 API 被组织成两个不同的包:

  • java.security包和java.security.*包含以下类不会受到出口管制(如Signature和MessageDigest)

  • 该javax.crypto软件包中包含受出口管制的类​​别(如Cipher和KeyAgreement)

加密接口基于提供程序,允许多种可互操作的加密实现。一些提供程序可能在软件中执行加密操作;其他提供程序可能在硬件令牌上执行操作(例如,在智能卡设备或硬件加密加速器上)。实施出口管制服务的提供程序必须由 Oracle JCE 证书颁发机构颁发的证书进行数字签名。

Java 平台包含许多最常用加密算法的内置提供程序,包括 RSA、DSA 和 ECDSA 签名算法、AES 加密算法、SHA-2 消息摘要算法以及 Diffie-Hellman (DH) 和椭圆曲线 Diffie-Hellman (ECDH) 密钥协议算法。大多数内置提供程序都以 Java 代码实现加密算法。

Java 平台还包括一个内置提供程序,可充当本机 PKCS#11 (v2.x) 令牌的桥梁。此提供程序名为SunPKCS11,允许 Java 应用程序无缝访问位于符合 PKCS#11 标准的令牌上的加密服务。

在 Windows 上,Java 平台包含一个内置提供程序,可充当本机 Microsoft CryptoAPI 的桥梁。此提供程序名为SunMSCAPI,允许 Java 应用程序通过 CryptoAPI 无缝访问 Windows 上的加密服务。

6.公钥基础设施

公钥基础设施 (PKI) 是指基于公钥加密技术实现信息安全交换的框架。它允许将身份(个人、组织等)绑定到数字证书,并提供验证证书真实性的方法。PKI 包括密钥、证书、公钥加密和生成证书并进行数字签名的可信认证机构 (CA)。

Java 平台包括对 X.509 数字证书和证书吊销列表 (CRL) 的 API 和提供程序支持,以及符合 PKIX 的证书路径构建和验证。与 PKI 相关的类位于和java.security包中java.security.cert。

7.密钥和证书存储

Java 平台通过密钥和证书存储提供加密密钥和证书的长期持久存储。具体来说, 类java.security.KeyStore表示密钥存储,即加密密钥和/或受信任证书(例如,在认证路径验证期间使用)的安全存储库,而 类java.security.cert.CertStore表示证书存储,即不相关且通常不受信任的证书的公共且可能庞大的存储库。CertStore还可以存储 CRL。

KeyStore和CertStore实现通过类型来区分。Java 平台包括标准 PKCS11 和 PKCS12 密钥存储类型(其实现符合 RSA Security 的相应 PKCS 规范)。它还包含一种专有的基于文件的密钥存储类型,称为 JKS(代表 Java 密钥存储),以及一种称为 DKS(域密钥存储)的类型,它是密钥存储的集合,以单个逻辑密钥存储的形式呈现。

Java 平台包含一个特殊的内置密钥存储区,cacerts其中包含许多知名、受信任 CA 的证书。keytool 实用程序能够列出 中包含的证书cacerts。请参阅Java 平台标准版工具参考中的keytool。

Java 密码术部分中提到的 SunPKCS11 提供程序包含 PKCS11KeyStore实现。这意味着 Java 应用程序可以通过 API 访问和使用安全硬件(如智能卡)中的密钥和证书KeyStore。请注意,智能卡密钥可能不允许离开设备。在这种情况下, APIjava.security.Key返回的对象KeyStore可能只是对密钥的引用(即,它不包含实际的密钥材料)。这样的对象Key只能用于在实际密钥所在的设备上执行加密操作。

Java 平台还包括 LDAP 证书存储类型(用于访问存储在 LDAP 目录中的证书),以及内存集合证书存储类型(用于访问对象中管理的证书java.util.Collection)。

8.公钥基础设施工具

有两个内置工具可用于处理密钥、证书和密钥存储:

  • keytool创建和管理密钥库。使用它来执行以下任务:

    • 创建公钥/私钥对
    • 显示、导入和导出以文件形式存储的 X.509 v1、v2 和 v3 证书
    • 创建 X.509 证书
    • 颁发证书 (PKCS#10) 请求并发送给 CA
    • 根据证书请求创建证书
    • 导入证书答复(从 CA 发送的证书请求获得)
    • 将公钥证书指定为可信证书
    • 接受密码并将其作为密钥安全存储
  • jarsigner签署 JAR 文件并验证已签署 JAR 文件的签名。Java ARchive (JAR) 文件格式允许将多个文件捆绑为一个文件。通常,JAR 文件包含与小程序和应用程序相关的类文件和辅助资源。

要对代码进行数字签名,请执行以下操作:

  • 用于keytool生成或导入适当的密钥和证书到您的密钥库中(如果它们还不存在)。

  • 使用该jar工具将代码打包成JAR文件。

  • 使用jarsigner工具(或jdk.security.jarsignerAPI) 来对 JAR 文件进行签名。该jarsigner工具访问密钥存储区以查找对 JAR 文件进行签名或验证已签名 JAR 文件的签名所需的任何密钥和证书。

注:jarsigner可以选择性地生成包含时间戳的签名。验证 JAR 文件签名的系统可以检查时间戳并接受在签名证书有效期间签名的 JAR 文件,而不必要求证书是最新的。(证书通常每年到期一次,因此要求 JAR 文件创建者每年重新签署已部署的 JAR 文件是不合理的。)
请参阅Java 平台标准版工具参考中的keytool和jarsigner。

9.验证

身份验证是确定用户身份的过程。在 Java 运行时环境中,它是识别正在执行的 Java 程序的用户的过程。在某些情况下,此过程可能依赖于 Java加密部分中描述的服务。

Java 平台提供了 API,使应用程序能够通过可插入登录模块执行用户身份验证。应用程序调用该类LoginContext(在javax.security.auth.login包中),该类又引用配置。该配置指定要使用哪个登录模块(接口的实现javax.security.auth.spi.LoginModule)来执行实际身份验证。

由于应用程序仅与标准LoginContextAPI 通信,因此它们可以独立于底层插件模块。可以为应用程序插入新的或更新的模块,而无需修改应用程序本身。下图说明了应用程序与底层登录模块之间的独立性:

在这里插入图片描述
说明
需要注意的是,尽管登录模块是可配置到 Java 平台中的可插入组件,但它们并非通过安全提供程序插入。因此,它们不遵循安全提供程序部分中描述的提供程序搜索模型。相反,如图1-3所示,登录模块由其自己独特的配置进行管理。

Java 平台提供了以下内置登录模块,均在com.sun.security.auth.module包中:

  • Krb5LoginModule使用 Kerberos 协议进行身份验证
  • JndiLoginModule使用 LDAP 或 NIS 数据库进行用户名/密码验证
  • KeyStoreLoginModule用于登录任何类型的密钥存储,包括 PKCS#11 令牌密钥存储

身份验证还可以在两个对等体之间建立安全通信通道的过程中实现。Java 平台提供了许多标准通信协议的实现,这些协议将在“安全通信”一节中讨论。

10.安全通信

通过网络传输的数据可能会被非预期接收者访问。当数据包含私人信息(如密码和信用卡号)时,必须采取措施使未经授权的人员无法理解数据。确保将数据发送给适当的人员,并确保数据在传输过程中没有被有意或无意地修改,这一点也很重要。

密码学是安全通信所需的基础;请参阅Java 密码学部分。Java 平台还为许多标准安全通信协议提供 API 支持和提供程序实现。

11.TLS 和 DTLS 协议

传输层安全性 (TLS) 及其前身安全套接字层 (SSL) 是加密协议,可在两个通信对等方之间提供安全通道。TLS 使用多种加密过程,为通过不受信任或潜在敌对网络进行的通信提供身份验证、机密性和完整性属性。TLS 在可靠的面向流的传输通道(通常是传输控制协议 (TCP))上运行。TLS 独立于应用程序协议。更高级别的协议(例如超文本传输​​协议 (HTTP))可以透明地分层在 TLS 之上。

数据报传输层安全性 (DTLS) 协议基于面向流的 TLS 协议,旨在为数据报传输提供类似的安全属性,例如用户数据报协议 (UDP),它不提供可靠或按序的数据传输。

JDK 提供 API 以及 SSL、TLS 和 DTLS 协议的实现,其中包括数据加密、消息完整性以及服务器和客户端身份验证功能。应用程序可以使用 (D)TLS 通过任何应用程序协议(例如 TCP/IP 之上的 HTTP)在两个对等体之间提供安全的数据传递。

此类javax.net.ssl.SSLSocket表示在普通流套接字 ( ) 之上封装 TLS 支持的网络套接字java.net.Socket。某些应用程序可能希望使用备用数据传输抽象(例如 New-I/O);该类javax.net.ssl.SSLEngine可用于生成和使用 TLS/DTLS 数据包。

JDK 还包括支持可插入(基于提供者)密钥管理器和信任管理器概念的 API。A key manager由类封装javax.net.ssl.KeyManager,并管理用于执行身份验证的密钥。trust manager由TrustManager类封装(在同一个包中),并根据它管理的密钥库中的证书来决定信任谁。

JDK 包含一个实现 SSL/TLS/DTLS 协议的内置提供程序:

  • SSL 3.0
  • TLS 1.0
  • TLS 1.1
  • TLS 1.2
  • TLS 1.3
  • 数据传输层安全1.0
  • 数据传输层安全1.2

12.简单身份验证和安全层 (SASL)

简单身份验证和安全层 (SASL) 是一种 Internet 标准,它指定了身份验证协议以及在客户端和服务器应用程序之间建立安全层的可选方法。SASL 定义了如何交换身份验证数据,但本身并不指定该数据的内容。它是一个框架,可以容纳指定身份验证数据内容和语义的特定身份验证机制。Internet 社区为各种安全级别和部署方案定义了许多标准 SASL 机制。

Java SASL API,位于java.security.sasl模块,为使用 SASL 机制的应用程序定义类和接口。它被定义为与机制无关;使用该 API 的应用程序无需强制使用任何特定的 SASL 机制。应用程序可以根据所需的安全功能选择要使用的机制。该 API 支持客户端和服务器应用程序。该类javax.security.sasl.Sasl用于创建SaslClient和SaslServer对象。

SASL 机制实现在提供程序包中提供。每个提供程序可能支持一个或多个 SASL 机制,并通过标准提供程序架构进行注册和调用。

Java 平台包含一个内置提供程序,它实现了以下 SASL 机制:

  • CRAM-MD5、DIGEST-MD5、EXTERNAL、GSSAPI、NTLM 和 PLAIN 客户端机制
  • CRAM-MD5、DIGEST-MD5、GSSAPI 和 NTLM 服务器机制

13.通用安全服务 API 和 Kerberos

Java 平台包含一个 API,该 API 具有通用安全服务应用程序编程接口 (GSS-API) 的 Java 语言绑定,该接口位于模块中java.security.jgss。GSS-API 为应用程序程序员提供了对各种底层安全机制之上的安全服务的统一访问。Java GSS-API 当前需要使用 Kerberos v5 机制,而 Java 平台包含此机制的内置实现。目前,无法插入其他机制。

注:身份验证Krb5LoginModule部分中提到的可以与 GSS Kerberos 机制结合使用。
Java 平台还包括简单且受保护的 GSS-API 协商机制 (SPNEGO) GSS-API 机制的内置实现。

在两个应用程序可以使用 GSS-API 安全地交换消息之前,它们必须建立联合安全上下文。上下文封装了共享的状态信息,例如,可能包括加密密钥。两个应用程序都创建并使用一个org.ietf.jgss.GSSContext对象来建立和维护构成安全上下文的共享信息。建立安全上下文后,即可使用它来准备要交换的安全消息。

Java GSS API 位于org.ietf.jgss包中。Java 平台还定义了基本 Kerberos 类,例如KerberosPrincipal、KerberosTicket、KerberosKey和KeyTab,它们位于javax.security.auth.kerberos包中。

14.访问控制

Java 平台中的访问控制架构保护对敏感资源(例如本地文件)或敏感应用程序代码(例如类中的方法)的访问。所有访问控制决策均由安全管理器(由类表示)进行调解java.lang.SecurityManager。必须将 ASecurityManager安装到 Java 运行时中才能激活访问控制检查。

默认情况下,通过java命令执行的本地应用程序不会在SecurityManager安装的情况下运行。为了使用 运行本地应用程序SecurityManager,应用程序本身必须通过setSecurityManager方法(在java.lang.System类中)以编程方式设置一个,或者java必须-Djava.security.manager在命令行上使用参数调用。

15.权限

权限代表对系统资源的访问。为了允许小程序(或使用安全管理器运行的应用程序)访问资源,必须向尝试访问的代码明确授予相应的权限。

当 Java 代码由类加载器加载到 Java 运行时时,类加载器会自动将以下信息与该代码关联:

  • 代码从哪里加载
  • 谁签署了代码(如果有的话)
  • 授予代码的默认权限

无论代码是通过不受信任的网络下载(例如,小程序)还是从文件系统加载(例如,本地应用程序),此信息都与代码相关联。加载代码的位置由 URL 表示,代码签名者由签名者的证书链表示,默认权限由java.security.Permission对象表示。

自动授予下载代码的默认权限包括与代码来源主机建立网络连接的能力。自动授予从本地文件系统加载的代码的默认权限包括从代码来源目录及其子目录读取文件的能力。

请注意,在类加载时无法获得执行代码的用户身份。如有必要,应用程序代码负责对最终用户进行身份验证(请参阅身份验证doAs部分)。一旦用户通过身份验证,应用程序就可以通过javax.security.auth.Subject调用类中的方法动态地将该用户与执行代码关联起来。

16.安全策略

类加载器会为代码授予一组有限的默认权限。管理员可以通过安全策略灵活地管理其他代码权限。

Java SE将安全策略的概念封装在类中。在任何给定时间,java.security.Policy只有一个 对象安装到 Java 运行时中。对象的基本职责是确定是否允许代码访问受保护的资源(以从何处加载、谁对其进行了签名以及谁在执行它为特征)。对象如何 做出此决定取决于实现。例如,它可以查阅包含授权数据的数据库,也可以联系其他服务。 PolicyPolicyPolicy

Java SE包含一个默认 Policy实现,它从安全属性文件中配置的一个或多个 ASCII (UTF-8) 文件中读取其授权数据。这些策略文件包含授予代码的确切权限集:具体而言,授予从特定位置加载、由特定实体签名并以特定用户身份执行的代码的确切权限集。每个文件中的策略条目必须符合记录的专有语法,并且可以通过简单的文本编辑器编写。

17.访问控制执行

Java 运行时会跟踪程序执行过程中的 Java 调用序列。当请求访问受保护的资源时,默认情况下会评估整个调用堆栈以确定是否允许请求的访问。

如前所述,资源受到 的保护SecurityManager。JDK 和应用程序中的安全敏感代码通过以下代码保护对资源的访问:

SecurityManager sm = System.getSecurityManager();
if (sm != null) {sm.checkPermission(perm);
}

这Permission对象perm对应于所请求的访问权限。例如,如果尝试读取文件/tmp/abc,则权限可以构造如下:

Permission perm = new java.io.FilePermission("/tmp/abc", "read");

默认的实现SecurityManager将其决定委托给java.security.AccessController实现。AccessController遍历调用堆栈,将Policy堆栈中的每个代码元素以及请求的权限(例如,FilePermission上例中的)传递给已安装的安全性。Policy根据管理员配置的权限,确定是否授予请求的访问权限。如果没有授予访问权限,则AccessController抛出java.lang.SecurityException.

下图说明了访问控制实施。在此特定示例中,调用堆栈上最初有两个元素,ClassA和 ClassB。ClassA调用中的方法 ,然后通过创建实例 ClassB尝试访问文件。构造函数创建、,如前所示,然后传递给类的 方法。在此特定情况下,只需要检查和的权限,因为模块中的所有类(包括 、和 )都会自动获得所有权限。 /tmp/abcjava.io.FileInputStreamFileInputStreamFilePermissionpermpermSecurityManagercheckPermissionClassAClassBjava.baseFileInputStreamSecurityManagerAccessController

在此示例中,ClassA和ClassB具有不同的代码特征——它们来自不同的位置并具有不同的签名者。每个可能已被授予一组不同的权限。只有表示两个类都已被授予所需的 ,AccessController才会授予对所请求文件的访问权限。 PolicyFilePermission

在这里插入图片描述

说明:用于 XML 处理的 Java API (JAXP)
Java API for XML Processing (JAXP) 用于使用 Java 应用程序处理 XML 数据。它支持 XML 简单 API (SAX)、文档对象模型 (DOM) 和 XML 流 API (StAX) 解析器、XML 模式验证和可扩展样式表语言转换 (XSLT)。此外,JAXP 还提供安全处理功能,可帮助保护您的应用程序和系统免受与 XML 相关的攻击。请参阅Java API for XML Processing (JAXP) 安全指南。

注:Java SE 安全编码指南包含可帮助防御 XML 相关攻击的额外建议。

18.XML 签名

Java XML 数字签名 API 是用于生成和验证 XML 签名的标准 Java API。

XML 签名可应用于任何类型的数据,XML 或二进制(请参阅XML 签名语法和处理)。生成的签名以 XML 表示。XML 签名可用于保护您的数据并提供数据完整性、消息认证和签名者认证。

该 API 旨在支持 W3C XML 签名语法和处理建议中的所有必需或推荐功能。该 API 可扩展且可插入,并且基于 Java 加密服务提供程序架构。

Java XML 数字签名 API,位于java.xml.crypto模块,由六个包组成:

  • javax.xml.crypto
  • javax.xml.crypto.dsig
  • javax.xml.crypto.dsig.keyinfo
  • javax.xml.crypto.dsig.spec
  • javax.xml.crypto.dom
  • javax.xml.crypto.dsig.dom

19.已标记为删除的弃用安全 API

以下 API 已被弃用,并将在未来版本中删除。

您可以使用此工具检查 API 依赖关系jdeprscan。请参阅Java Platform, Standard Edition Tools Reference中的jdeprscan。

以下类别已被弃用并标记为删除:

  • com.sun.security.auth.PolicyFile
  • com.sun.security.auth.SolarisNumericGroupPrincipal
  • com.sun.security.auth.SolarisNumericUserPrincipal
  • com.sun.security.auth.SolarisPrincipal
  • com.sun.security.auth.X500Principal
  • com.sun.security.auth.module.SolarisLoginModule
  • com.sun.security.auth.module.SolarisSystem

以下方法已被弃用并标记为删除:

  • java.lang.SecurityManager.getInCheck
  • java.lang.SecurityManager.checkMemberAccess
  • java.lang.SecurityManager.classDepth
  • java.lang.SecurityManager.currentClassLoader
  • java.lang.SecurityManager.currentLoadedClass
  • java.lang.SecurityManager.inClass
  • java.lang.SecurityManager.inClassLoader
  • java.lang.SecurityManager.checkAwtEventQueueAccess
  • java.lang.SecurityManager.checkTopLevelWindow
  • java.lang.SecurityManager.checkSystemClipboardAccess
    以下字段已弃用并标记为删除:
  • java.lang.SecurityManager.incheck

20.安全工具摘要

下表描述了 Java 安全和 Kerberos 相关工具。

请参阅Java 平台标准版工具参考中的安全工具和命令。

工具用法
jar创建 Java 档案 (JAR) 文件
jarsigner对 JAR 文件进行签名和验证
keytool创建和管理密钥库

Windows 版 JDK 还附带了三种与 Kerberos 相关的工具。Solaris 和 Linux 操作环境自动包含同名工具,它们提供了同等功能。

工具用法
kinit获取并缓存 Kerberos 票证授予票证
klist列出本地 Kerberos 凭证缓存和密钥表中的条目
ktab管理本地 Kerberos 密钥表中存储的名称和服务密钥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/298822.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相对论中关于光速不变理解的补充

近几个月在物理直播间聊爱因斯坦相对论,发现好多人在理解爱因斯坦相对论关于基本假设,普遍认为光速是不变的,质能方程 中光速的光速不变的,在这里我对这个假设需要做一个补充,他是基于质能方程将光速C 在真是光速变化曲…

平衡二叉树,红黑树,B树和B+树的区别及其应用场景

平衡二叉树 基础数据结构左右平衡高度差大于1会自旋每个节点记录一个数据 平衡二叉树(AVL) AVL树全称G.M. Adelson-Velsky和E.M. Landis,这是两个人的人名。 平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree…

计算机视觉新巅峰,微软牛津联合提出MVSplat登顶3D重建

开篇:探索稀疏多视图图像的3D场景重建与新视角合成的挑战 3D场景重建和新视角合成是计算机视觉领域的一项基础挑战,尤其是当输入图像非常稀疏(例如,只有两张)时。尽管利用神经场景表示,例如场景表示网络&a…

Spring Boot 接入 Redis

Spring Boot 接入 Redis 简介 Redis 是一种访问速度非常快的内存数据结构存储,用作数据库、缓存、消息代理和流引擎。提供 strings、hashes、lists、sets 等数据结构。可以解决会话缓存、消息队列、分布式锁、定期将数据集存储到硬盘等功能。 通过 Redis 设计实现…

云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)

前言 读完本文,你将对云原生下的核心概念微服务、容器云、DevOps、Immutable Infrastructure、Declarative-API、Serverless、Service Mesh 等有一个相对详细的了解,帮助你快速掌握云原生的核心和要点。 因题主资源有限, 这里会选用部分云服务商的组件进…

Aurora8b10b(2)上板验证

文章目录 前言一、AXI_Stream数据产生模块二、上板效果总结 前言 上一篇内容我们已经详细介绍了基于aurora8b10b IP核的设计,本文将基于此进一步完善并且进行上板验证。 设计思路及代码思路参考FPGA奇哥系列网课 一、AXI_Stream数据产生模块 AXIS协议是非常简单的…

小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?

小林coding网站通道:入口 本篇文章摘抄应付面试的重点内容,详细内容还请移步:小林coding网站通道 文章目录 如何理解UDP 是面向报文的协议如何理解字节流如何解决粘包固定长度的消息 特殊字符作为边界自定义消息结构 如何理解UDP 是面向报文的…

第20次修改了可删除可持久保存的前端html备忘录:重新布局

第20次修改了可删除可持久保存的前端html备忘录&#xff1a;重新布局 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Elasticsearch:我们如何演化处理二进制文档格式

作者&#xff1a;来自 Elastic Sean Story 从二进制文件中提取内容是一个常见的用例。一些 PDF 文件可能非常庞大 — 考虑到几 GB 甚至更多。Elastic 在处理此类文档方面已经取得了长足的进步&#xff0c;今天&#xff0c;我们很高兴地介绍我们的新工具 —— 数据提取服务&…

[从零开始学习Redis | 第九篇] 深入了解Redis数据类型

前言&#xff1a; 在现代软件开发中&#xff0c;数据存储和处理是至关重要的一环。为了高效地管理数据&#xff0c;并实现快速的读写操作&#xff0c;各种数据库技术应运而生。其中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存、会话存储、消息队列…

重读Java设计模式: 桥接模式详解

引言 在软件开发中&#xff0c;经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时&#xff0c;使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题&#xff0c;我们可以使用桥接模式。桥接模式是一种结构型设计模式&#…

ARM架构学习笔记2-汇编

RISC是精简指令集计算机&#xff08;RISC:Reduced Instruction Set Computing&#xff09; ARM汇编概述 一开始&#xff0c;ARM公司发布两类指令集&#xff1a; ① ARM指令集&#xff0c;这是32位的&#xff0c;每条指令占据32位&#xff0c;高效&#xff0c;但是太占空间 2…

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…

燃气管网安全运行监测系统功能介绍

燃气管网&#xff0c;作为城市基础设施的重要组成部分&#xff0c;其安全运行直接关系到居民的生命财产安全和城市的稳定发展。然而&#xff0c;随着城市规模的不断扩大和燃气使用量的增加&#xff0c;燃气管网的安全运行面临着越来越大的挑战。为了应对这些挑战&#xff0c;燃…

虚幻UE5智慧城市全流程开发教学

一、背景 这几年&#xff0c;智慧城市/智慧交通/智慧水利等飞速发展&#xff0c;骑士特意为大家做了一个这块的学习路线。 二、这是学习大纲 1.给虚幻UE5初学者准备的智慧城市/数字孪生蓝图开发教程 https://www.bilibili.com/video/BV1894y1u78G 2.UE5数字孪生蓝图开发教学…

蓝桥集训之斐波那契数列

蓝桥集训之斐波那契数列 核心思想&#xff1a;矩阵乘法 将原本O(n)的递推算法优化为O(log2n) 构造1x2矩阵f和2x2矩阵a 发现f(n1) f(n) * a 则f(n1) f(1) * an可以用快速幂优化 #include <iostream>#include <cstring>#include <algorithm>using na…

算法刷题应用知识补充--基础算法、数据结构篇

这里写目录标题 位运算&#xff08;均是拷贝运算&#xff0c;不会影响原数据&#xff0c;这点要注意&#xff09;&、|、^位运算特性细节知识补充对于n-1的理解异或来实现数字交换找到只出现一次的数据&#xff0c;其余数据出现偶数次 >> 、<<二进制中相邻的位的…

第12届蓝桥杯省赛 ---- C/C++ C组

文章目录 1. ASC2. 空间3. 卡片4. 相乘5. 路径6.时间显示7.最少砝码8. 杨辉三角形9. 左孩子右兄弟 第12届蓝桥杯省赛&#xff0c;C/C C组真题&#xff0c;第10题不是很清楚&#xff0c;题解不敢乱放&#x1f601;&#x1f601;&#x1f601; 1. ASC 额。。。。 #include <i…

【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】

2024.4.1 Monday 目录 4.DQL查询数据&#xff08;重点&#xff01;&#xff09;4.1.Data Query Language查询数据语言4.2.SELECT4.2.1.语法4.2.2.实践4.2.2.1.查询字段 SELECT 字段/* FROM 表查询全部的某某查询指定字段 4.2.2.2.给查询结果或者查询的这个表起别名&#xff08…

Spark-Scala语言实战(13)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢…