Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Crypto Api-如何选择密码提供程序_Java_Encryption_Encryption Asymmetric_Jce - Fatal编程技术网

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

Java Crypto Api-如何选择密码提供程序,java,encryption,encryption-asymmetric,jce,Java,Encryption,Encryption Asymmetric,Jce,为了使用Java实现加密,我使用了JCE,这很好也很有趣。 有人告诉我,选择加密提供者比使用默认提供者更好 我需要为对称密钥生成选择两个提供程序。此代码使用(在CBC模式下使用AES): 对于此代码使用的非对称文本加密(在ECB模式下使用RSA): 我的问题是如何选择PROVIDER1和PROVIDER2 例如,我看到“SunJCE”是一个有良好文档记录的提供者,但我不认为它是选择它的“足够好”的理由 有人吗?一般来说,您应该坚持使用默认提供程序,除非有令人信服的理由不这样做。硬编码您的提供者有

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

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

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

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

例如,我看到“SunJCE”是一个有良好文档记录的提供者,但我不认为它是选择它的“足够好”的理由


有人吗?

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

以下段落是:

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

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


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

请注意,
KeyGenerator
是生成AES密钥所必需的,无论这些密钥用于什么用途。因此,指定<代码>“CBC/PKCS5PADION”<代码>不是必需的,只是<代码>“AES”<代码>就足够了……非常感谢您的详细解答,请您详细阐述一下不同供应商之间的区别是什么?在性能、安全性和内存使用方面有什么不同吗?这取决于具体情况。我经常使用PKCS#11提供商以及FIPS或通用标准认证硬件令牌(如智能卡)。如果应用正确,显然更安全。对于任何提供商来说,内存使用通常都是最小的(与目前可用的大量GB相比)。对于软件提供商,性能比较可能应该在特定配置上进行。安全性很难衡量,但我不会依赖不执行RSA盲操作的库。如果不确定,请使用Oracle默认值(如果可用)。
Cipher rsaEncryptor = Cipher.getInstance("RSA/ECB/PKCS1Padding",PROVIDER2); 
getInstance("...", "SunJCE");  // not recommended
    vs.
getInstance("...");            // recommended