我尝试在 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
:
- 这两种结构都有明确的定义和标准化
- 它们比提供者特定的对象序列化更容易解析;
- 最后,它们也将比您当前处理的结构小得多。
您可以使用通过 getInstance("RSA")
创建的 KeyFactory
来检索 key 。应使用 X509EncodedKeySpec
(对于SubjectPublicKey)和PKCS8EncodedKeySpec
(对于 PKCS#8 编码的私钥)来传递关键规范。
关于java - IBM sdk 的 SunRSASign 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128233/