【问题标题】:Java Crypto Api - how to choose a cipher providerJava Crypto Api - 如何选择密码提供者
【发布时间】:2014-01-02 02:06:10
【问题描述】:

为了使用Java实现加密,我使用的是JCE,很好玩。 有人告诉我,最好选择加密提供者而不是使用默认提供者。

我需要为对称密钥生成选择两个提供商。此代码使用(在 CBC 模式下使用 AES):

 Key sharedKey = (KeyGenerator.getInstance("AES/CBC/PKCS5PADDING", PROVIDER1).generateKey();

对于此代码使用的非对称文本加密(在 ECB 模式下使用 RSA):

Cipher rsaEncryptor = Cipher.getInstance("RSA/ECB/PKCS1Padding",PROVIDER2); 

我的问题是如何选择PROVIDER1和PROVIDER2?

例如,我看到“SunJCE”是一个有据可查的提供商,但我认为这不是选择它的“足够好”的理由。

有人吗?

【问题讨论】:

  • 请注意KeyGenerator 是生成 AES 密钥所必需的,无论这些密钥用于什么用途。所以不需要指定"CBC/PKCS5Padding",只需"AES"就足够了......

标签: java encryption encryption-asymmetric jce


【解决方案1】:

一般来说,您应该坚持使用默认提供程序,除非有令人信服的理由不这样做。对您的提供程序进行硬编码有一个严重的缺点,即您的代码不允许您在不重写代码的情况下更改您的提供程序。我认为直接选择提供商的唯一原因是确保满足某些安全约束,而其他提供商不会出现这些约束。

以下段落为directly from the Oracle documentation

提醒:由于历史原因和所提供的服务类型,JDK 中的加密实现是通过几个不同的提供者(“Sun”、“SunJSSE”、“SunJCE”、“SunRsaSign”)分发的。通用应用程序不应向特定提供者请求加密服务。那就是:

getInstance("...", "SunJCE");  // not recommended
    vs.
getInstance("...");            // recommended

您仍然可以通过在运行时的jre/lib/security 路径中的java.security 文件中为它们赋予更高的优先级(较低的优先级指示符,1 是最高优先级)来设法允许使用其他提供程序。如果您想使用getInstance("Algorithm", "Provider") 指定提供程序,最好使提供程序字符串可配置(例如,使用属性和使用myConfig.getProperty("Provider"))。

【讨论】:

  • 非常感谢您的详细回答,您能否详细说明不同提供商之间需要考虑的差异?在性能、安全性、内存使用方面有什么不同吗?
  • 这一切都取决于。我经常使用 PKCS#11 提供程序以及 FIPS 或通用标准认证的硬件令牌(例如智能卡)。如果应用得当,那显然会更安全。对于任何提供程序来说,内存使用量通常都是最小的(与现在可用的大量 GB 相比)。对于软件提供商,性能比较可能应该在特定配置上进行。安全性很难衡量,但我不会依赖不执行 RSA 致盲的库。如果不确定,请保留 Oracle 默认值(如果可用)。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2016-01-10
  • 2017-07-16
相关资源
最近更新 更多