Ohhnews

分类导航

$ cd ..
foojay原文

后量子密码迁移将给Java代码库带来多少成本?

#后量子密码#java#迁移成本#静态分析#开源工具

后量子密码的过渡已经不再是一个研究课题,而变成了一系列的截止日期。NIST 在 2024 年 8 月最终确定了 ML-KEM (FIPS 203)、ML-DSA (FIPS 204) 和 SLH-DSA (FIPS 205)。NIST IR 8547 规定 RSA、ECDSA、(EC)DH 及其他算法在 2030 年后弃用,2035 年后禁止使用,其他国家的政府指南中也出现了类似的时间表。

所以目的地已经明确。对大多数 Java 团队来说,困难的问题不是迁移到什么,而是迁移的成本是多少,针对他们特定的代码库,以及昂贵的部分隐藏在哪里。这个问题一直很难回答,而且我能找到的大多数后量子迁移工具都针对 C、C++ 和 Rust,尽管大量企业级密码学运行在 JVM 上。

我构建了一个开源工具来为 Java 回答这个问题,然后我在整个生态系统中运行了它。本文介绍它发现了什么,以及它看不到什么。

从清单到工作量估算

现有的加密扫描器会告诉你代码库使用了哪些算法。这是一个必要的清单,但它不能告诉你迁移需要什么。两个代码库可能各自进行了一百次 RSA 调用,但迁移工作量可能相差一周,因为成本不在调用点。而在它们周围的代码中:为 256 字节 RSA 签名调整大小的缓冲区、方法签名类型为 RSAPublicKey 而不是 PublicKey、假定经典大小的密钥存储和线路格式。

pqc-migration-readiness (Apache-2.0) 是一个静态审计器,可读取 Java 源代码,无需构建和类路径,它做三件事:

  1. 检测量子脆弱的 JCA 使用:对 RSA、DSA、EC 和 Diffie-Hellman 的 Cipher、KeyPairGenerator、KeyFactory、KeyAgreement 和 Signature 调用。
  2. 评分难度,同时考虑原始调用点和结构性脆弱指标:具体密钥类型耦合、固定大小缓冲区、固定 TLS 版本和持久化密钥材料。评分权重在任何工作量数据收集之前就已固定,这是本研究的关键。
  3. 规划:它为扫描的代码库生成有序的迁移计划,每个步骤都有工程师时间范围,并生成 JSON 和 SARIF,以便发现结果出现在 GitHub 代码扫描中。

它在中型项目上运行只需几秒钟:

curl -L -o auditor.jar \
  https://repo1.maven.org/maven2/io/github/arpan0995/pqc-readiness-auditor/1.4.0/pqc-readiness-auditor-1.4.0-all.jar
java -jar auditor.jar /path/to/java/project --out audit-out

它生成的 Markdown 报告的第一屏(这里是 Eclipse Californium 3.14.0)就是迁移计划:

[LOADING...]

这些构件也在 Maven Central 上,位于 io.github.arpan0995 下,因此你可以将库添加到构建中,或运行捆绑的 Maven 插件,而无需下载 jar。

在 27 个项目中的发现

我在 27 个广泛使用的开源 Java 项目的最新版本上运行了审计器(版本 1.4.0,在 JDK 21 上):安全和身份框架、Web 服务器、HTTP 客户端、消息系统和协议库。以下是按单个工程师预估工作量排名前 12 的项目;完整排名在仓库中,包括那些结果为干净的项目。

项目领域发现数最高等级预估工作量
Apache MINA SSHDSSH337严重约 5-12 个月
jjwtJWT / JOSE193严重约 3-9 个月
WildFly Elytron安全框架178严重约 3-9 个月
Keycloak身份 / SSO185高约 3-8 个月
Apache CXFWeb 服务159严重约 3-7 个月
Spring Security认证框架251严重约 8-21 周
webauthn4jWebAuthn / FIDO2125严重约 7-19 周
Quarkus应用框架80中约 7-19 周
Netty网络 / TLS53严重约 5-13 周
Eclipse CaliforniumCoAP / DTLS, 物联网38高约 4-10 周
pac4j安全引擎63高约 4-9 周
Apache TomcatServlet 容器14中约 4-9 周

工作量列是审计器为单个工程师给出的范围,其单位随规模变化,因此请关注排序而非单位。两个模式很突出。

首先,几乎在所有地方,主要成本都是具体密钥类型耦合,而不是算法调用本身。针对 RSAPublicKey 或 ECPrivateKey 编写的方法签名、字段和强制转换中的代码,必须扩展为 PublicKey 和 PrivateKey,或一个不透明句柄,然后后量子密钥才能流经它。在成熟的库中,API 变动(而不是 getInstance 替换)才是工作量的主体。

其次,数字高通常不是指责。jjwt 显示 193 个发现,因为它是一个 JOSE 库:它本来就应该了解每种密钥类型,因此计数衡量的是新算法必须贯穿的表面,而不是草率的代码。另一方面,Apache Shiro 和 Apache PDFBox 返回干净,因为它们将非对称加密留给 JDK、Bouncy Castle 及其集成。当我发布结果时,一位 Shiro 提交者证实了这一点。

估算在何处坦诚自身局限

像这样的工具只有告诉你它没有测量什么时才有用。阅读表格时,三个限制很重要。

工作量数字是启发式的,不是经过验证的预测。 它们通过一个声明的规划时间模型随难度分数缩放。通过将分数与测量的迁移工作量关联,将它们转化为经过验证的预测,是一个开放的研究问题,这也是整个项目公开的原因。

通过配置或包装 API 选择的算法是不可见的。 扫描读取的是源代码,而不是运行时装配。从属性文件选择算法的项目,或位于框架抽象之后的项目,看起来会比实际更轻。当我发布 Quarkus 扫描时,一位 Quarkus 维护者指出,真正的工作还存在于源代码扫描永远看不到的 Vert.x、Netty 和 Elytron 调用点中。这是正确的批评,也是为什么这个数字是一个下限。

通过注册表或枚举路由的算法名称会被遗漏。 jjwt 是鲜明的例子:审计器报告其调用点为零,因为它的签名流经算法注册表,而不是字面的 getInstance("SHA256withRSA") 调用,尽管它自始至终使用 RSA 和 ECDSA。193 个发现都是结构性耦合;调用点被隐藏了。教扫描器跟踪注册表是一个已跟踪的问题。

这些都不使排名无用。它使其成为一个具有已知形状的下限,这比一个自信的单一数字要诚实得多。

在你自己的代码上运行它

尝试它的最快方式是使用 GitHub Codespace:打开仓库,开发容器会构建审计器并检出一个示例项目。然后对捆绑的研究或你自己的代码树运行扫描:

./scan.sh /path/to/your/project

对于 CI,上传 SARIF 报告,发现结果就会在拉取请求中显示为代码扫描警报。

帮助验证它

最有用的回应是公开提出异议。如果你在你知道的代码库上运行它,而排名与现实不符,那正是项目需要的信号,并且有一个讨论线程用于扫描结果。如果你已经将 Java 系统迁移到混合或后量子算法,该工作的提交历史是真实的工作量数据,这正是将启发式转化为可测量事物的东西。

截止日期是固定的,目的地是已知的。每个 Java 团队仍然需要对未来迁移工作量的可信的基于代码库的估算,由数据支持而不是直觉。这就是这个项目试图填补的空白,而且随着更多人关注,它会更快地填补。


如果你觉得 PQC Migration Readiness 有趣,在仓库上加星可以帮助其他从事 Java PQC 迁移的人找到它 ⭐ https://github.com/Arpan0995/pqc-migration-readiness
分享此页面

发现错误,或有补充?在 GitHub 上编辑此页面

[LOADING...]
作者:

Arpan Sharma

Arpan Sharma 从事 JVM 的后量子密码学工作,并构建了 pqc-migration-readiness,这是一个开源审计器,用于估算后量子迁移对 Java 代码库的成本。Arpan 还为开源密码学库做出贡献,...

加入讨论