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

Was*_*fa1 3 java encryption jce encryption-asymmetric

为了使用Java实现加密,我使用JCE,这很好又有趣。有人告诉我,选择加密货币提供商比使用默认提供商更好。

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

 Key sharedKey = (KeyGenerator.getInstance("AES/CBC/PKCS5PADDING", PROVIDER1).generateKey();
Run Code Online (Sandbox Code Playgroud)

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

Cipher rsaEncryptor = Cipher.getInstance("RSA/ECB/PKCS1Padding",PROVIDER2); 
Run Code Online (Sandbox Code Playgroud)

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

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

任何人?

Maa*_*wes 5

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

以下段落直接来自 Oracle 文档

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

getInstance("...", "SunJCE");  // not recommended
    vs.
getInstance("...");            // recommended
Run Code Online (Sandbox Code Playgroud)

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