Java Crypto Api-如何选择密码提供程序
为了使用Java实现加密,我使用了JCE,这很好也很有趣。 有人告诉我,选择加密提供者比使用默认提供者更好 我需要为对称密钥生成选择两个提供程序。此代码使用(在CBC模式下使用AES): 对于此代码使用的非对称文本加密(在ECB模式下使用RSA): 我的问题是如何选择PROVIDER1和PROVIDER2 例如,我看到“SunJCE”是一个有良好文档记录的提供者,但我不认为它是选择它的“足够好”的理由Java Crypto Api-如何选择密码提供程序,java,encryption,encryption-asymmetric,jce,Java,Encryption,Encryption Asymmetric,Jce,为了使用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