IBM sdk 的 SunRSASign 提供程序
SunRSASign Provider for IBM sdk
我正尝试在 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 对大小减少到 < 4000 字节?
我们可以在 IBM sdk 中获得类似于 Oracle jdk 的密钥大小长度吗? IBM 中是否有任何其他默认提供程序使用 RSA2048 提供更小的密钥大小。
James 已经在评论中给出了大部分答案:使用 PKCS#12 密钥库作为私钥。这比不受保护地存储它更安全。
您可以使用 getEncoded
获取 public / 私钥的编码。此编码已经包含一个长度,但您可能希望在它之前使用 4 字节长度编码 - 编码整数 - none-the-less。所以你的序列化需要两个步骤。
对于 Java 的 SunRSASign
它 returns public 密钥的 SubjectKeyIdentifier
和私钥的内部 PKCS#8 结构。尽管 getEncoded
没有标准化(在我看来这是一个很大的错误,但没关系)大多数其他供应商无论如何都会效仿 Sun / Oracle 的做法。
无论供应商采取何种方式getEncoded
:
- 两种结构都定义明确且标准化,并且
- 它们比提供商特定的对象序列化更容易解析;
- 最后,它们也将比您当前处理的结构小得多。
您可以使用 getInstance("RSA")
创建的 KeyFactory
来取回密钥。密钥规范应使用 X509EncodedKeySpec
作为 SubjectPublicKey 并使用 PKCS8EncodedKeySpec
作为 PKCS#8 编码私钥。
我正尝试在 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 对大小减少到 < 4000 字节?
我们可以在 IBM sdk 中获得类似于 Oracle jdk 的密钥大小长度吗? IBM 中是否有任何其他默认提供程序使用 RSA2048 提供更小的密钥大小。
James 已经在评论中给出了大部分答案:使用 PKCS#12 密钥库作为私钥。这比不受保护地存储它更安全。
您可以使用 getEncoded
获取 public / 私钥的编码。此编码已经包含一个长度,但您可能希望在它之前使用 4 字节长度编码 - 编码整数 - none-the-less。所以你的序列化需要两个步骤。
对于 Java 的 SunRSASign
它 returns public 密钥的 SubjectKeyIdentifier
和私钥的内部 PKCS#8 结构。尽管 getEncoded
没有标准化(在我看来这是一个很大的错误,但没关系)大多数其他供应商无论如何都会效仿 Sun / Oracle 的做法。
无论供应商采取何种方式getEncoded
:
- 两种结构都定义明确且标准化,并且
- 它们比提供商特定的对象序列化更容易解析;
- 最后,它们也将比您当前处理的结构小得多。
您可以使用 getInstance("RSA")
创建的 KeyFactory
来取回密钥。密钥规范应使用 X509EncodedKeySpec
作为 SubjectPublicKey 并使用 PKCS8EncodedKeySpec
作为 PKCS#8 编码私钥。