为什么 JcaPEMKeyConverter 有一个 setProvider 方法?

why does JcaPEMKeyConverter have a setProvider method?

我明白为什么 java.security.Security 有一个 addProvider 方法 - 因为 Java 有多个供应商可以提供像 javax.crypto.Cipher.getInstance() 可以使用的东西(sun.security.provider.Sunorg.bouncycastle.jce.provider.BouncyCastleProvider,等等)。

但是为什么 org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter 有一个 addProvider 方法?考虑到正在使用的命名空间,我很难想象除了 BouncyCastle 之外的任何“提供者”都会提供替代品......

我不知道 'namespacing' 您认为正在使用什么。 JcaPEMKeyConverter 使用 JCA 来实现它需要的加密操作,它可以使用 any 提供所需操作的 JCA 提供程序; JCA 的几乎整个 要点 是提供者使用相同的 API(或技术上 SPI,服务提供者 接口)以便您可以有选择地使用不同的提供者进行相同的操作。

bcpkix bcpg 和 bcmail 库中的某些(也许是大多数)操作可以使用 JCA API(使用任何合适的 JCA 提供程序)或 Bouncycastle 的拥有私有 API(仅使用 Bouncy 代码),例如org.bouncycastle.pkcs.PKCS12MacCalculator[Builder] 是具有可互换实现 org.bouncycastle.pkcs.bc.BcPKCS12MacCalculator[Builder]org.bouncycastle.pkcs.jcajace.JcePKCS12MacCalcuator[Builder] 的接口。 (Bouncy 在区分 JCA 和 JCE 名称方面并不像人们希望的那样谨慎。)但是,JcaPEMKeyConverter 仅以 JCA 形式出现。

拥有 Bouncy add-on 库的人确实经常拥有并且也能够使用 Bouncy 提供程序,但并非总是如此。例如,美国联邦政府系统需要使用某些在 FIPS140 下验证的密码函数(主要是原语)(目前为修订版 -2,很快 -3),虽然 Bouncy 确实有 FIPS140 实现,但在商业上使用它需要付费,而如果您使用的是IBM Java 在某些 IBM 系统上它有提供程序(不同于常见的 Sun/Oracle/OpenJDK 提供程序),这些提供程序经过 FIPS140 验证,无需额外付费。

正确的是,API 的设计并非基于用户必须使用 BouncyCastle 来提供加密服务的假设 - 一个现成的例子就是人们使用 FIPS 提供程序,例如 BCFIPS .

虽然对前面的答案做了一个小的更正,但 BCFIPS Java 提供商没有许可费或类似费用,作为该项目的成员之一,看到有人让我感到非常不安说明。我很想知道这是从哪里听到的。

我们确实有一个针对 FIPS 和 non-FIPS 用户的支持计划,它确实提供了对 in-progress FIPS 版本的早期访问作为它的一部分,并且确实需要成本(这就是我们为一切提供资金的方式) .然而,实际发布的 FIPS jar,一旦在 bouncycastle.org 上发布,就会根据 BC 许可证获得许可,这基本上是 MIT X11 许可证,就像我们所有其他已发布的作品一样。我希望这能消除困惑。