bouncycastle bcprov、bcpkix 和 bctips 之间有什么区别?

Mos*_*afa 7 java spring cryptography bouncycastle java-11

我熟悉java中的基本密码学,但对bouncycastle零经验,最近我遇到一个需求,需要从FTP读取加密和签名的文件。

发件人指示我使用bctips电子书来阅读这些加密和签名的文件。我浏览了充气城堡网站的下载页面,但我对很多我无法理解的术语感到困惑,而且我不知道应该使用哪个jar文件。

bcprov我想知道andbcpkix和有什么区别bcfips

如果有人指出我正确的道路,我会很感激。

Maa*_*wes 21

首先,bcprov包含Java安全提供者以及“轻量级API”。很多时候,这个库被简单地称为“Bouncy Castle”,缩写为首字母缩略词“BC”,作为 Java 中的提供者名称。这些提供程序提供 SPI(服务提供程序实现)或实现类,允许为您的应用程序提供统一 API的CipherSignature和类MessageDigest(等)使用特定算法。Mac

Bouncy Castle 库有自己特定的架构和 API。正是这种公共 API 通常被尊称为“轻量级 API”。Bouncy Castle 库将大部分功能提供为使用 Bouncy Castle 提供程序实现注册的服务。这样,可以从通用类(例如Cipher.

该库还包含许多实用程序类,其中一些只是实现提供程序所必需的。所有的实现类都可供用户使用,这意味着轻量级 API 有点迷宫。这也意味着更新有可能会破坏使用轻量级 API 的软件。例如,ASN.1 编码器/解码器的一些更新不向后兼容。

使用 Bouncy Castle 库的主要原因是提供的扩展功能。例如,Bouncy Castle 提供程序提供了许多标准 Java 运行时中不存在的密码。但是,您应该记住,Java 运行时提供的算法可以进行优化以使用 CPU 加速,并且可能会得到更好的测试因此,在选择它之前,您一定要检查该算法是否不存在于Java提供的算法中。

一个相对较新的发展是在使用 LTS 版本时支持 CPU 硬件加速 - 目前仅在 Linux 上。


bcfips是经过认证的 FIPS 提供商。FIPS 使用 NIST 定义的一组特定算法,bcfips因此包含bcprov. FIPS 在密钥材料销毁等方面也有严格的规定。FIPS 认证相当昂贵耗时,BC 希望您在使用其 FIPS 提供商时获得支持合同。

如果您的软件需要使用 FIPS 认证的算法实现,您可能需要此库。请注意,它们仍将在软件中实现,因此不会使用 AES 加速等。


现在bcpkix是完全不同的野兽了。它提供对“PKIX/CMS/EAC/PKCS/OCSP/TSP/OPENSSL”协议和容器格式的支持。

存在以下模块:

  • PKIX(在cert包中)表示“基于 X.509 的公钥基础设施,包含对证书、证书请求、CRL 等的支持;用于 TLS 的证书类型与用于 HTTPS 的证书类型相同,即您的浏览器使用,主包内有一些单独的相关包:
    • cmc:通过 CMS 进行证书管理
    • dvcs:数据验证和认证服务器协议
    • est:通过安全传输注册
  • CMS 表示加密消息语法,一种以结构化方式封装(即加密)和签署消息的格式。CMS 也称为 PKSC#7(.p7文件扩展名),这是定义它的标准。CMS 是一种灵活的描述性格式,即它指示使用哪些算法并有助于密钥管理。它使用 X.509 证书并基于相同的技术。
    • MIME:与 CMS 相关,SMIME 是在电子邮件协议中使用 CMS。
  • EAC 是一种用于欧洲电子护照的技术。它代表扩展访问控制,可用于访问例如指纹或(如果是德国护照)其他个人信息,当然前提是您拥有正确的证书和密钥集。
  • PKCS 代表公钥加密标准,历史上由“RSA 实验室”创建,但这些类似乎主要支持 PKCS#8(私钥存储)、PKSC#10(认证请求)和 PKCS#12(密钥/信任存储)。.p8这增加了对创建和解析具有、.p10/.csr.12/文件扩展名的文件的支持.pfx
  • OCSP 是在线证书状态协议,用于检查 X.509 证书的状态,例如在使用 TLS 时。
  • TSP 表示时间戳协议,是一种将消息与来自受信任来源的日期/时间一起签名的方法(它也可以表示受信任的服务提供商,但这里不是)。
  • OpenSSL 当然是一个库和应用程序。它有一些特定/专有的方法,涉及从密码派生密钥以及应用这些方法来加密/解密 PKCS#8 私钥。

PKIX 库中的operator似乎是一种使用通用接口直接在“轻量级 API”或 JCA 提供的 API 上进行操作的方法(基本上是执行依赖项注入的一种方法)。

如果您需要实现任何更高级别的协议/容器格式,您可以使用此库。其中许多格式都相对较旧,因此您可能正在寻找例如 NaCL 而不是 CMS。也就是说,CMS 当然可以得到保护,并且实现这些协议对于与现有系统(向后)兼容非常有用。


如果我没记错的话,可以在不安装 Bouncy Castle () 提供程序的情况下使用 PKIX 库"BC",除非您使用 Java 运行时中现有提供程序未提供的特定算法。

不幸的是 Bouncy Castle 的文档非常稀疏,大多数包甚至没有解释它们的用途或如何使用它们。也没有大量的 JUnit 测试或演示应用程序。