JDK 26之安全增强

加密

混合公钥加密(HPKE,Hybrid Publick Key Encryption)

HPKE 是一种现代加密方案,用于使用接收者的公钥加密任意大小的明文。HPKE 在 RFC 9180 中定义。它结合了 3 种不同的算法:一个密钥封装机制(KEM)、一个密钥派生函数(KDF)和一个认证加密与关联数据(AEAD)算法,以生成密文。

PKCS#12 KeyStore 对 RFC 9879 的支持:使用基于密码的消息认证码 1 (PBMAC1)

JDK PKCS12 KeyStore 实现现在支持更现代的 PBMAC1 算法用于完整性保护。要使用 PBMAC1 算法,请在 java.security 配置文件中将 keystore.pkcs12.macAlgorithm 属性设置为 PBMAC1 算法,例如,"PBEWithHmacSHA256"。现有的 PKCS12 密钥库文件将继续使用其创建时使用的完整性算法,但新的密钥库文件将使用 PBMAC1 算法。

JEP 524:加密对象的 PEM 编码(第二版预览)

用于编码和解码加密对象到/从 PEM 格式的 secondpreview API 在 JEP 524 中交付并定义。PEM 是一种广泛使用的格式,用于传输和存储 DER 编码的加密数据,如证书、CRL、私钥等。这是几年前 JCE 调查中最常请求的功能之一。

有两个主要的 API,一个 PEMEncoder 类用于将加密对象编码为 PEM,一个 PEMDecoder 类用于将 PEM 数据解码为加密对象。还有一个名为 DEREncodable 的标记接口,现有的 X509Certificate 和 X509CRL 类已进行后向兼容以实现该接口,从而更容易将这些对象编码/解码到/从 PEM。

PEMEncoder 还可以配置为加密,这使得一步即可加密和编码私钥。类似地, PEMDecoder 可以配置为解密,以允许一步即可解码和解密私钥。对于更高级的使用,现有的 EncryptedPrivateKeyInfo 类通过添加几个新方法进行了增强,使其更容易加密和解密私钥。

新增安全属性 DisableAlgorithms 用于 JCE 层

新增了一个名为 jdk.crypto.disabledAlgorithms 的安全属性,可用于在 JCE/JCA API 级别禁用加密算法。该属性接受标准算法名称规范中指定的算法名称列表。此安全属性可以被同名的系统属性覆盖。

添加了 PBES2Algorithms 作为新的实现要求

以下来自 RFC 8018:PKCS #5:基于密码的密码学规范版本 2.1 的 PBES2 算法已被作为新要求添加:

AlgorithmParameters:

PBEWithHmacSHA256AndAES_128

PBEWithHmacSHA256AndAES_256

Cipher:

PBEWithHmacSHA256AndAES_128

PBEWithHmacSHA256AndAES_256

Mac:

PBEWithHmacSHA256

SecretKeyFactory:

PBEWithHmacSHA256AndAES_128

PBEWithHmacSHA256AndAES_256

PBKDF2WithHmacSHA256

PKI

新的根 CA 证书

四个 Sectigo 根 CA 证书,两个用于 TLS,两个用于代码签名:

Sectigo 公共服务器认证根 E46 具有如下限定名称:

CN=Sectigo Public Server Authentication Root E46, O=Sectigo Limited, C=GB

Sectigo 公共服务器认证根 R46 具有如下限定名称:

CN=Sectigo Public Server Authentication Root R46, O=Sectigo Limited, C=GB

Sectigo 公共代码签名根 E46,具有以下限定名称:

CN=Sectigo Public Code Signing Root E46, O=Sectigo Limited, C=GB

Sectigo 公共代码签名根 R46,具有以下限定名称:

CN=Sectigo Public Code Signing Root R46, O=Sectigo Limited, C=GB

已移除根 CA 证书

四个 AffirmTrust 根证书已从 cacerts 密钥库中移除。这些根 CA 由 Entrust(其所有者)停用,将不再受支持。这四个根证书是:

使用以下限定名称的 AffirmTrust 商业版本:

CN=AffirmTrust Commercial, O=AffirmTrust, C=US

使用以下限定名称的 AffirmTrust 网络:

CN=AffirmTrust Networking, O=AffirmTrust, C=US

确认 Trust Premium 具有以下限定名称:

CN=AffirmTrust Premium, O=AffirmTrust, C=US

确认 Trust Premium ECC 具有以下限定名称:

CN=AffirmTrust Premium ECC, O=AffirmTrust, C=US

TLS

SunX509 KeyManagerFactory 中的检查改进 KeyManagerFactory

用于为 TLS 连接提供证书和密钥材料的默认 SunX509 KeyManagerFactory 已经得到改进。它现在对证书实施了额外的检查,以确保所选的证书符合当前的算法约束设置。这使得它的检查与 PKIX KeyManagerFactory 保持一致。

XML 签名

禁用了 XPath 过滤转换

使用 XPath 过滤转换的 XML 签名已被默认禁用。虽然 XPath 转换功能强大,但引入复杂性的风险更高,在 XML 签名最佳实践文档中不推荐使用。如有必要,并自行承担风险,可以通过从 jdk.xml.dsig.secureValidationPolicy 安全属性中移除它来重新启用该转换。

新属性用于指定 SecureRandom

新增了一个名为 jdk.xmldsig.SecureRandom 的 XML 签名属性,它允许你指定一个特定的 SecureRandom 实例来代替 JDK 实现所使用的默认 SecureRandom。

工具

支持 ML-DSA 的签名 JAR

在 JDK 21 中,我们添加了对 ML-DSA 的支持,这是一种由 NIST 在 FIPS 204 中指定并在 JEP 497 中为 Java 平台定义的抗量子数字签名算法。

java -XshowSettings:security:tls 现在显示 TLS 命名组和签名方案

java -XshowSettings:security:tls 诊断命令现在除了显示启用的协议和密码套件外,还会显示 TLS 握手所启用的 TLS 命名组(或密钥交换算法)和签名方案。

bash 复制代码
$ java -XshowSettings:security:tls
    Security TLS configuration (SunJSSE provider):
        Enabled Protocols:
            TLSv1.3
            TLSv1.2
   
        Enabled Cipher Suites:
            TLS_AES_256_GCM_SHA384
            TLS_AES_128_GCM_SHA256
            TLS_CHACHA20_POLY1305_SHA256
            TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
            TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
            TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
            TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
            TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
            TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
            TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
            TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
            TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
            TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
            TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
            TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
            TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
            TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
            TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
            TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
            TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
            TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
            TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
            TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
            TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
            TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
            TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
            TLS_DHE_RSA_WITH_AES_256_CBC_SHA
            TLS_DHE_DSS_WITH_AES_256_CBC_SHA
            TLS_DHE_RSA_WITH_AES_128_CBC_SHA
            TLS_DHE_DSS_WITH_AES_128_CBC_SHA
            TLS_EMPTY_RENEGOTIATION_INFO_SCSV

        Enabled Named Groups:
            X25519MLKEM768
            x25519
            secp256r1
            secp384r1
            secp521r1
            x448
            ffdhe2048
            ffdhe3072
            ffdhe4096
            ffdhe6144
            ffdhe8192

        Enabled Signature Schemes:
            ecdsa_secp256r1_sha256
            ecdsa_secp384r1_sha384
            ecdsa_secp521r1_sha512
            ed25519
            ed448
            rsa_pss_rsae_sha256
            rsa_pss_rsae_sha384
            rsa_pss_rsae_sha512
            rsa_pss_pss_sha256
            rsa_pss_pss_sha384
            rsa_pss_pss_sha512
            rsa_pkcs1_sha256
            rsa_pkcs1_sha384
            rsa_pkcs1_sha512
            dsa_sha256
            ecdsa_sha224
            rsa_sha224
            dsa_sha224
            ecdsa_sha1
            rsa_pkcs1_sha1
            dsa_sha1

使用 JKS 或 JCEKS 密钥库时改进的 keytool 警告

当使用 JKS 或 JCEKS 密钥库时, keytool 打印的警告已被改进,以提醒用户这些密钥库最终将被移除,并建议将密钥库迁移到 PKCS12。

相关推荐
yaoxin521123几秒前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
小短腿的代码世界4 分钟前
Qt日志系统深度解析:从qDebug到企业级日志框架
开发语言·qt
REDcker1 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
极客先躯2 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188962 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java
我命由我123452 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
aXin_ya2 小时前
微服务第八天 Sentinel 四种分布式事务模式
java·数据库·微服务
BenSmith2 小时前
从零上手嵌入式 RTOS:以 Raspberry Pi Pico 2 WH 为例的烧录、定制构建与多系统对比指南
安全
Halo_tjn2 小时前
Java Set集合相关知识点
java·开发语言·算法
Linsk2 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle