仅在 FIPS 批准的模式下运行 Bouncycastle,但仍然能够访问未经批准的算法

问题描述 投票:0回答:1

在测试我的 FIPS 140-2 合规性配置时,我似乎仍然能够访问未经批准的 MD5 算法。这让我相信我错误地配置了 BouncyCastle FIPS JCE 提供程序。以下代码的行为不符合我的预期:

System.setProperty("org.bouncycastle.fips.approved_only", "true");
Security.insertProviderAt(new BouncyCastleFipsProvider(), 1);
System.out.println(CryptoServicesRegistrar.isInApprovedOnlyMode());
MessageDigest digest = MessageDigest.getInstance("MD5", "BCFIPS");
System.out.println(digest.getAlgorithm());
System.out.println(digest.getProvider());
Cipher.getInstance("DES", "BCFIPS");

其输出是:

true
MD5
BCFIPS version 1.000203

当该代码尝试按照我的预期获取 DES 密码时,它会抛出

NoSuchAlgorithmException
,因为它不是 FIPS 140-2 认可的算法。如果我删除“approved_only”属性,则 DES 密码实例将成功创建。不过,我认为在仅批准模式下,MD5
MessageDigest
也应该失败。虽然它有点旧(2015 年),https://www.bouncycastle.org/fips/BCFipsDescription.pdf 的第 6 页指出 MD5 不应在批准模式下可用,最近的https 的第 5 页: //csrc.nist.gov/csrc/media/publications/fips/140/2/final/documents/fips1402annexa.pdf 未将 MD5 列入其批准的安全哈希标准列表中。

此外,https://www.bouncycastle.org/fips/BCFipsDescription.pdf中的其他哈希算法在批准模式下不起作用,但在未经批准模式下可用,例如

WHIRLPOOL
。我还没有测试所有这些算法,但到目前为止,MD5 是唯一一个未经批准但可以在批准模式下工作的算法。

我的问题是:为什么我能够在批准模式下创建 MD5

MessageDigest
?我实施 BouncyCastle JCE 的方式有问题吗?

java bouncycastle fips
1个回答
0
投票

https://downloads.bouncycastle.org/fips-java/BC-FJA-SecurityPolicy-1.0.2.pdf 在“表 7 - 未经批准但允许的加密函数”下列出了 MD5,仅在 TLS 中使用。

但显然 MD5 实现随后变得普遍可用,因为它不知道它是否在 TLS 上下文中使用。

https://github.com/bcgit/bc-java/issues/1282#issuecomment-1325782487 中,David Hook(Bouncy Castle 创始人之一)说:

这是正确的,MD5 实现没有任何上下文,但是 它可用于 TLS。

就 Spring Boot 应用程序而言,您无法自动阻止 MD5, 您需要告诉您的开发人员不要这样做。如果你 想要符合 FIPS 标准,模块只能按照以下标准使用 安全政策。

我想我应该添加另一件事,这可能有帮助(也可能没有帮助) 问题不在于在 TLS 之外使用 MD5,而在于 在 TLS 之外使用 MD5 作为加密消息摘要 问题。例如,假设有人在布隆过滤器中使用 MD5, 这是允许的,在这种情况下它只是一个哈希函数。

© www.soinside.com 2019 - 2024. All rights reserved.