【问题标题】:SunRSASign Provider for IBM sdk适用于 IBM sdk 的 SunRSASign 提供程序
【发布时间】:2019-03-15 07:41:55
【问题描述】:

我正在尝试在 Oracle 1.7 和 IBM 1.7 JDK 上运行以下代码。

KeyPairGenerator serverKpairGen = KeyPairGenerator.getInstance("RSA");
        serverKpairGen.initialize(2048,new SecureRandom());
        KeyPair serverKpair = serverKpairGen.generateKeyPair();


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(baos);

          oos.writeObject(serverKpair);
          oos.close();
          baos.close();

          byte[] serializedObject = baos.toByteArray();
          System.out.println(Base64.encode(serializedObject, false, false).length());

Oracle 默认使用 SunRsaSign 作为其 RSA 算法的默认提供者,而 IBM 使用 IBMJCE

IBMJCE 提供长度为 5100 字节的密钥对,而 Oracle 生成的密钥对长度接近 2800 字节。

我尝试将 SunJce 设置为提供程序,但它不支持 RSA 算法。

IBM SDK 1.6 或 1.7 中是否有将 SunRSASign 设置为提供者的功能?我观察到 SunRSASign 是 Oracle java 中 rt.jar 的一部分。 我们能否将 IBM java 中的 ServerKey 对大小减少到

我们能否在 IBM sdk 中获得类似于 Oracle jdk 的密钥长度? IBM 中是否有任何其他默认提供程序可以使用 RSA2048 提供更少的密钥大小。

【问题讨论】:

  • 不要使用Serializable 接口来持久化密钥对。相反,坚持使用 PKCS12 KeyStore。或者,使用它们的 .getEncoded() 方法分别保存 PublicKey 和 PrivateKey 组件。
  • 感谢@JamesKPolk。你的建议确实奏效了。

标签: java sdk cryptography websphere rsa


【解决方案1】:

James 已经在评论中给出了大部分答案:使用 PKCS#12 密钥库作为私钥。这比不加保护地存储更安全。

您可以使用getEncoded 获取公钥/私钥的编码。此编码已经包含一个长度,但您可能希望在它前面加上一个 4 字节长度的编码 - 一个编码的整数 - 无论如何。所以你的序列化需要两个步骤。

对于Java 的SunRSASign,它返回一个SubjectKeyIdentifier 作为公钥和一个内部PKCS#8 结构作为私钥。尽管getEncoded 没有标准化(我认为这是一个很大的错误,但还可以),但大多数其他供应商还是会效仿 Sun / Oracle 的做法。

提供商为getEncoded 采取的任何方式:

  1. 两种结构都定义明确且标准化,并且
  2. 它们将比提供者特定的对象序列化更容易解析;
  3. 最后,它们也将比您当前处理的结构小得多。

您可以使用使用getInstance("RSA") 创建的KeyFactory 来取回密钥。密钥规范应使用 X509EncodedKeySpec 提供 SubjectPublicKey,PKCS8EncodedKeySpec 提供 PKCS#8 编码的私钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2021-07-13
    • 2020-10-17
    相关资源
    最近更新 更多