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