Java Crypto Api - 如何选择密码提供程序

时间:2013-12-14 08:27:12

标签: java encryption encryption-asymmetric jce

为了使用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”是一个记录良好的提供商,但我不认为选择它是一个“足够好”的理由。

1 个答案:

答案 0 :(得分:3)

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

以下段落为directly from the Oracle documentation

  

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

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

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