【问题标题】:Which Sun provider to use to generate an RSA key pair for encrypting (ciphering) data使用哪个 Sun 提供商来生成用于加密(加密)数据的 RSA 密钥对
【发布时间】:2014-06-30 15:58:27
【问题描述】:

我正在尝试找出应该使用哪个 Sun 加密提供程序来生成将用于在 Java 中加密数据的 RSA 密钥对。我知道还有其他提供商,例如 Bouncy Castle,但我想使用其中一个 Sun 提供商。 (算法:RSA,密钥大小2048)

例如,在我的机器上,我目前有以下可用的提供程序:

  • 太阳 1.7
  • SunRsaSign 1.7
  • SunEC 1.7
  • SunJSSE 1.7
  • SunJCE 1.7
  • SunJGSS 1.7
  • SunSASL 1.7
  • XMLDSig 1.0
  • SunPCSC 1.7

我之前使用提供者 SunRsaSign 来生成用于签名数据的 RSA 密钥对。但我不确定使用 SunRsaSign 生成的密钥对加密数据是否安全或是否有意义。

我注意到提供者 SunJSSE 包含:sun.security.rsa.RSAKeyPairGenerator

我的主要问题是:应该使用哪个 Sun 提供商来生成将用于加密 (非签名)的 RSA 密钥对?

此外,SunRsaSign 生成的密钥对是否应该仅用于签署数据?因为这个提供者的名称中包含“Sign”这个词,我认为它是专门用于签名的,但现在我不太确定。

最后,使用 SunJSSE 生成的密钥对进行一般加密是否安全且有意义?如果是这样,SunJSSE 生成的 RSA 和 SunJSSE 生成的 RSA 密钥对有什么区别?

【问题讨论】:

  • 为什么还要指定提供者?通常,您不应该关心各个提供商所做的细节。对特定提供程序进行硬编码会降低您的代码可移植性。
  • 嗨,谢谢。我完全理解你的观点,在大多数情况下我会同意你的观点。我想指定提供者的原因是因为我正在编写一个库来帮助(但出于安全原因也在某些方面限制)客户端应用程序访问加密服务。我不想允许使用提供者列表中具有最高优先级的提供者(JCA 的工作方式),我只想提供一组经过我批准的安全提供者。我不想简单地让具有最高优先级的提供者被使用,因为它可能不安全。

标签: java encryption rsa jce jca


【解决方案1】:

当然你可以浏览所有注册的提供者:

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 中。由于签名不用于提供机密性,因此它们被视为不太敏感的加密操作。

【讨论】:

  • 谢谢。但是,我的部分困惑来自这样一个事实,即我不知道使用 SunRsaSign 提供程序生成将用于加密的密钥对是否有意义?由于该提供程序名称包含“Sign”,我假设它旨在生成用于签名的密钥对。
【解决方案2】:

文档表明 SunJCE 不提供可以在 SunRsaSign 上建立的 RSA 密钥。这样,两者都需要使用,一个来获取密钥,另一个来获取密码。

来自:https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunJCEProvider

SunRsaSign 提供者-------------------------------------------------------- ----------------

密钥对生成器:

RSA 1024 密钥大小必须介于 512 和 65536 位之间,后者过大

SunJCE 提供者-------------------------------------------------------- --------------------

密钥对生成器

Diffie-Hellman (DH) 1024 Keysize 必须是 64 的倍数,范围从 512 到 2048(含)。

【讨论】:

  • 我刚刚遇到了同样的问题,需要指定提供者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多