我试图找出哪些Sun加密提供程序应该用于生成将在Java中使用加密数据的RSA密钥对。我知道还有其他提供商,如Bouncy Castle,但我想使用其中一个Sun Providers。 (算法:RSA,密钥大小2048)
例如,在我的机器上,我目前有以下提供商:
我以前使用提供程序SunRsaSign生成用于签名数据的RSA密钥对。但我不确定它是否安全,或者使用SunRsaSign生成的密钥对加密数据是否有意义。
我注意到提供商SunJSSE包含:sun.security.rsa.RSAKeyPairGenerator
我的主要问题是:哪些Sun提供商应该用于生成将用于加密 (不签名)的RSA密钥对?
另外,SunRsaSign生成的密钥对是否只用于签名数据?因为这个提供者的名字包含单词“Sign”,所以我认为它专门用于签名,但现在我不太确定。
最后,是否安全并且使用SunJSSE生成的密钥对进行常规加密是否有意义?如果是这样,SunJSSE生成的RSA与SunJSSE生成的RSA密钥对之间有什么区别?
答案 0 :(得分:2)
当然,您可以查看所有已注册的提供商:
Provider[] providers = Security.getProviders();
for (Provider provider : providers) {
Set<Service> services = provider.getServices();
for (Service service : services) {
service.getAlgorithm();
// find algorithm and retrieve service information
}
}
但在这种情况下解决方案会更简单:
KeyPairGenerator kpgen = KeyPairGenerator.getInstance("RSA");
Provider kpgenProv = kpgen.getProvider();
System.out.printf("Provider : %s%nInfo: %s%n", kpgenProv.getName(), kpgenProv.toString());
结果:
Provider : SunRsaSign
Info: SunRsaSign version 1.7
这可能是运行时唯一会生成RSA密钥对的提供程序。请注意,加密是javax.security
的一部分,这意味着它最初是一个可选的包/提供者(因为加密的导入/导出控制)。
RSA密钥创建不是加密,因此它包含在提供RSA签名生成的SunRsaSign
中。由于签名不用于提供机密性,因此它们被视为不太敏感的加密操作。
答案 1 :(得分:0)
文档表明SunJCE不提供RSA密钥,可以在SunRsaSign上创建。这样,使用两者都是必要的,一个得到密钥和另一个得到密码。
来自:https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunJCEProvider
SunRsaSign Provider -------------------------------------------- ----------------
的KeyPairGenerator:
RSA 1024 Keysize必须介于512和65536位之间,后者不必要大
SunJCE提供商-------------------------------------------- --------------------
的KeyPairGenerator
Diffie-Hellman(DH)1024 Keysize必须是64的倍数,范围从512到2048(含)。