【问题标题】:Using providers in Java AES encryption在 Java AES 加密中使用提供者
【发布时间】:2018-06-21 08:19:00
【问题描述】:

这可能是一个菜鸟问题,但我对提供商的工作方式感到困惑。我试过阅读这个https://docs.oracle.com/javase/7/docs/technotes/guides/security/overview/jsoverview.html,但这对我来说不太有意义。假设我们有:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC")

和

Cipher cipher= Cipher.getInstance("AES/CBC/PKCS5Padding")

根据链接,听起来提供者表示正在使用的实现,但 AES/CBC/PKCS5Padding 基本上与提供者无关吗?在示例中,充气城堡(我猜“BC”对应的)是否恰好具有比默认实现更有效的算法?感谢您的宝贵时间。

【问题讨论】:

    标签: java encryption cryptography bouncycastle


    【解决方案1】:

    不是 AES/CBC/PKCS5Padding 基本相同,独立于 供应商?

    是的。

    在示例中,充气城堡(我猜“BC”对应 to) 碰巧有一个比默认算法更有效的算法 实施?

    可能不会。特别是在 AES 的情况下,最近的 Oracle 提供商可能会比 Bouncycastle 快得多,因为他们使用了可用的本地 AES 硬件。

    那么为什么要指定提供者呢?

    好的,我知道你没有问这个,但那似乎是你要去的地方。在大多数情况下,您应该不指定提供者。一般规则是避免指定提供者,除非您有充分的理由这样做。不指定提供者会增加可移植性。

    不幸的是,我遇到过一些您可能需要指定提供程序的情况。 JCE 中提供的抽象并未涵盖实践中出现的所有情况。如果您遇到其中一个问题,最好单独提出一个问题。

    【讨论】:

    • @justan0therlurker 只是扩展了他的答案 - 某些提供程序可能具有默认情况下在 JRE 中不可用的算法或参数(例如,仅在最近几年才添加了 AES-CGM 或 RSA-OAEP,功能为 Keccak等)
    • @gusto2 感谢您的意见。后续问题:指定“BC”提供程序和使用 JCE API 与使用 BC API 有什么区别(例如:codereview.stackexchange.com/questions/166997/…)?
    • @justan0therlurker 在功能上是相同的(SPI 应该返回相同的实现),但我仍然建议您使用默认的 Crypto API 而不是将自己钉在特定的实现或版本上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2018-09-07
    • 2013-08-24
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多