问题描述
我明白了java.security.Security
有一个addProvider
方法的原因-因为Java有多个提供程序,它们可以提供javax.crypto.Cipher.getInstance()
可以使用的东西(sun.security.provider.Sun
,org.bouncycastle.jce.provider.BouncyCastleProvider
,等)。
但是为什么org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter
有一个addProvider
方法?鉴于使用了命名空间,我很难想象除了BouncyCastle之外的任何“提供者”都会提供替换品...
解决方法
我不知道您认为正在使用什么“命名空间”。 JcaPEMKeyConverter
使用JCA实现所需的加密操作,并且可以使用提供所需操作的 any JCA提供程序; JCA几乎整个 point 都是提供程序使用相同的API(或从技术上讲,SPI, Service Provider 接口),以便您可以有选择地对同一操作使用不同的提供程序)。
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附加程序库的人经常会拥有并且能够使用Bouncy提供程序,但并非总是如此。例如,美国联邦政府系统必须使用某些已通过FIPS140验证的加密功能(主要是原语)(当前在修订版-2,不久后为-3),而Bouncy确实具有FIPS140的实现,但在商业上使用它需要付费,而如果您使用例如在某些IBM系统上的IBM Java,它具有提供程序(不同于常见的Sun / Oracle / OpenJDK的提供程序),这些提供程序经过FIPS140验证,无需额外付费。
,正确的是,API并不是基于用户必须使用BouncyCastle来提供密码服务的假设而设计的-并且,使用FIPS提供程序(例如BCFIPS)的人们就是一个很好的例子。
尽管对上面的答案进行了小幅修改,但BCFIPS Java提供程序没有许可证费用或类似费用,作为项目的成员之一,我不禁为看到有人指出这一点感到不安。我很想知道从哪里听到的消息。
我们确实有一个针对FIPS和非FIPS用户的支持程序,它确实提供了对正在进行中的FIPS版本的早期访问,并且确实要付费(这就是我们为所有项目提供资金的方式)。但是,实际发布的FIPS罐子一旦在bouncycastle.org上发布,便像其他所有已发布的作品一样,是根据BC许可(基本上是MIT X11许可)获得许可的。我希望这可以消除混乱。