java - IBM sdk 的 SunRSASign 提供程序

标签 java sdk cryptography websphere rsa

我尝试在 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 字节的 key 对,Oracle 生成长度接近 2800 字节的 key 对。

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

IBM SDK 1.6 或 1.7 中是否可以将 SunRSASign 设置为提供程序?我观察到 SunRSASign 是 Oracle java 中 rt.jar 的一部分。 我们可以将 IBM java 中的 ServerKey 对大小减少到 < 4000 字节吗?

我们可以在IBM sdk中获得类似于Oracle jdk的key-size长度吗? IBM 中是否有其他默认提供程序可以通过 RSA2048 提供更小的 key 大小。

最佳答案

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

您可以使用getEncoded来获取公钥/私钥的编码。此编码已包含一个长度,但您可能希望在其前面添加一个 4 字节长度编码(一个编码整数)。所以你的序列化需要两个步骤。

对于 Java 的 SunRSASign,它返回公钥的 SubjectKeyIdentifier 和私钥的内部 PKCS#8 结构。尽管 getEncoded 尚未标准化(我认为这是一个很大的错误,但还好),大多数其他提供商无论如何都会追随 Sun/Oracle 的领导。

无论提供商采取什么方式获取getEncoded:

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

您可以使用通过 getInstance("RSA") 创建的 KeyFactory 来检索 key 。应使用 X509EncodedKeySpec(对于SubjectPublicKey)和PKCS8EncodedKeySpec(对于 PKCS#8 编码的私钥)来传递关键规范。

关于java - IBM sdk 的 SunRSASign 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128233/

相关文章:

java - Jetty SslConnector 的弃用方法

java - gradle在不相关的不同项目之间共享属性

c# - 是否有适用于 .NET 的 Open Office 或 Libre Office SDK?

ios - Facebook SDK 3.21.1 弃用方法错误

cryptography - CryptoAPI 封装的 key

java - 错误填充异常 : Decryption error

java - 理解java中的有界泛型。重点是什么?

java - WebElements 列表中的相对 Xpath

objective-c - OSX 应用程序的向后兼容性

Java 相当于 C# DESCrypto