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.mzph.cn/news/796416.shtml

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

相关文章

以Kotti项目为例使用pytest测试项目

在维护和构建大型项目时,单独一个一个手工测试代码已经不适用了,这时候就要用专门的测试框架进行测试。让我们以Kotti项目为例,用pytest这个测试框架进行实践测试吧。 使用python3.10 Ubuntu 系统 准备工作 下载和安装kotti库 pip install…

Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题

文章目录 前言一、需要实现的效果如下二、flutter实现代码如下:总结 前言 最近写flutter项目,遇到NestedScrollView与TabBar双列表滚动位置同步问题,下面是解决方案,希望帮助到大家。 一、需要实现的效果如下 1、UI图&#xff1…

代码随想录算法训练营三刷day46 | 动态规划之139.单词拆分

三刷day46 139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i] 139.单词拆分 题目链接 解题思路:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包…

蓝桥杯-DS18B20温度传感器

一.管脚&芯片&寄存器 1.芯片 2.了解封装以及引脚的用法 3.相关寄存器 报警功能 二,如何使能DS18B20芯片 1.初始化芯片&比赛提供的驱动代码 比赛提供的底层驱动代码 /* # 单总线代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考…

【前沿模型解析】潜在扩散模 1 | LDM第一阶段-感知图像压缩总览

文章目录 0 开始~1 感知压缩的目的2 自回归编码器-解码器生成模型一览2.1 AE 自编码器2.2 VAE 变分自编码器2.3 VQ-VAE2.4 VQ-GAN 3 代码部分讲解总览 0 开始~ 从今天起呢,我们会剖析LDM(潜在扩散模型) 从去年开始,大量的生成模…

【mac操作】brew指令集

brew指令集记录 1. brew search 【软件名称】2. rm -rf $(brew --cache)3. brew install 【软件名】4. brew uninstall 【软件名】5. 未完待续,,,, 官网路径: Homebrew官网 最上面就来一个homebrew安装指令吧&#xf…

三、Jenkins相关操作

Jenkins操作 一、插件管理1.修改公共插件源2.下载中文汉化插件2.1 安装插件2.2 重启2.3 设置为中文 3.远程部署插件 二、用户权限管理1.安装权限插件2.开启权限3.创建角色3.1 Global roles3.2 Item roles 4.创建用户5.给用户分配角色 三、凭证管理四、Git管理1.账号密码方式1.1…

深入浅出 -- 系统架构之Keepalived搭建双机热备

Keepalived重启脚本双机热备搭建 ①首先创建一个对应的目录并下载keepalived安装包(提取码:s6aq)到Linux中并解压: [rootlocalhost]# mkdir /soft/keepalived && cd /soft/keepalived [rootlocalhost]# wget https://www.keepalived.…

【Flutter】Getx设计模式及Provider、Repository、Controller、View等

本文基于Getx 4,x 本本 1、引入 再次接触到Flutter项目,社区俨然很完善和活跃。pubs.dev 寻找状态管理的时候看到很熟悉的Getx时间,俨然发现Getx的版本已到是4.x版本,看到Getx的功能已经非常强大了,庞大的API俨然成为一种开发框架…

c# wpf LiveCharts 简单试验

1.概要 1.1 说明 1.2 环境准备 NuGet 添加插件安装 2.代码 <Window x:Class"WpfApp3.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"…

基于单片机电子密码锁系统设计

**单片机设计介绍&#xff0c;基于单片机电子密码锁系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电子密码锁系统设计概要主要包括以下几个方面&#xff1a; 一、系统概述 基于单片机电子密码锁系统是一个…

c++11的重要特性2

可变参数模板在3中。 目录 ​编辑 1、统一的列表初始化&#xff1a; std::initializer_list&#xff1a; std::initializer_list是什么类型&#xff1a; std::initializer_list使用场景&#xff1a; 让模拟实现的vector也支持{}初始化和赋值 2、声明 auto decltype nul…

深入浅出 -- 系统架构之分布式多形态的存储型集群

一、多形态的存储型集群 在上阶段&#xff0c;我们简单聊了下集群的基本知识&#xff0c;以及快速过了一下逻辑处理型集群的内容&#xff0c;下面重点来看看存储型集群&#xff0c;毕竟这块才是重头戏&#xff0c;集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…

SQL注入---POST注入

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一. POST提交概述 在Webshell文章中介绍过post提交和get提交的区别&#xff0c;这里不再赘述 post提交和get提交的区别&#xff1a; get方式提交URL中的参数信息&#xff0c;post方式则是将信…

post请求爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

知识融合与消歧:完善知识图谱的关键步骤

知识融合与消歧&#xff1a;完善知识图谱的关键步骤 一、引言&#xff1a;知识融合与消歧的重要性 在今天的数据驱动时代&#xff0c;知识图谱已成为组织和理解海量信息的关键技术。它们使得复杂的数据关系可视化&#xff0c;为人工智能提供了丰富的知识基础。然而&#xff0c…

静态路由协议实验综合实验

需求&#xff1a; 1、除R5的换回地址已固定外&#xff0c;整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口&#xff0c;用于模拟连接PC的网段&#xff1b;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具&#xff0c;可以与任何集成开发环境&#xff08;IDE&#xff09;一起使用&#xff0c;并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

python文件打包找不到文件路径

引用&#xff1a;【将Python代码打包成exe可执行文件】 https://www.bilibili.com/video/BV1P24y1o7FY/?p4&share_sourcecopy_web&vd_sourced5811f31a0635dfc69a182c7bf1adb8b 在代码中&#xff0c;我们想读取文件a&#xff0c;一般使用如下方法。 import osdir os…

【Ubuntu20.04.6】VMWare Station 17安装Ubuntu20.04.6虚拟机系统

步骤1&#xff1a;下载Ubuntu20.04.6镜像ISO文件 Ubuntu20.04.6镜像ISO文件下载&#xff1a; https://mirrors.ustc.edu.cn/ubuntu-releases/20.04/ 步骤2&#xff1a;下载安装VMWare Station 17 下载和安装教程&#xff1a; https://blog.csdn.net/u012621175/article/deta…