如何在Java中序列化和反序列化RSA密钥对
我想在我的Java应用程序中实现一些非常基本的安全性,但是我在一开始就被卡住了 我想做的是: 1-生成RSA密钥对 2-将这些密钥以序列化形式存储在我的数据库中,以便我可以在下一次运行应用程序时重新创建它们 3-对它们进行反序列化,这样我就可以将它们恢复为对象形式,并可以使用它们对内容进行加密/解密 问题是,我找不到一个关于如何在任何地方这样做的简单解释。 我尝试了标准的Java序列化/反序列化方法,但它们不起作用。我的代码如下:如何在Java中序列化和反序列化RSA密钥对,java,security,serialization,rsa,deserialization,Java,Security,Serialization,Rsa,Deserialization,我想在我的Java应用程序中实现一些非常基本的安全性,但是我在一开始就被卡住了 我想做的是: 1-生成RSA密钥对 2-将这些密钥以序列化形式存储在我的数据库中,以便我可以在下一次运行应用程序时重新创建它们 3-对它们进行反序列化,这样我就可以将它们恢复为对象形式,并可以使用它们对内容进行加密/解密 问题是,我找不到一个关于如何在任何地方这样做的简单解释。 我尝试了标准的Java序列化/反序列化方法,但它们不起作用。我的代码如下: public static KeyPair Bin2Ke
public static KeyPair Bin2KeyPair(byte[] data){
try{
ByteArrayInputStream b = new ByteArrayInputStream(data);
ObjectInputStream o = new ObjectInputStream(b);
Object obj =o.readObject();
return((KeyPair)obj);
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] KeyPair2Bin(KeyPair kp){
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o;
try {
o = new ObjectOutputStream(b);
o.writeObject(kp);
return b.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我遇到的问题是,第二个方法工作正常(将密钥序列化为字节数组),但第一个方法失败,抛出ClassCastException,告诉我无法将对象强制转换为“KeyPair”
关于如何正确地做到这一点,有什么建议吗
编辑:这里是异常(在第一个方法中,它在“return((KeyPair)obj);”处抛出):
回答我自己,以防有人有同样的问题: 我不知道它是什么,但使用BouncyCastle SPI而不是默认的JDK SPI似乎解决了我的问题,它现在工作正常了。这对我很有用:
@Test
public void serializeTest() throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = kpg.generateKeyPair();
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(keyPair);
byte[] res = b.toByteArray();
o.close();
b.close();
ByteArrayInputStream bi = new ByteArrayInputStream(res);
ObjectInputStream oi = new ObjectInputStream(bi);
Object obj = oi.readObject();
assertTrue(obj instanceof KeyPair);
oi.close();
bi.close();
}
您使用的是什么版本的java?Sun的1.7版对我适用。如果您遇到异常,请发布异常的完整堆栈跟踪。Mac OSX上的JDK6对我也适用。@Master\T您声明异常来自第一个方法Bin2KeyPair。但是,堆栈跟踪声明它来自String2KeyPair方法。为什么会出现差异?String2KeyPair表示您已保存/还原字符串。它是字符串还是字节数组?你忘了关闭@pd40实际上,你需要关闭所有的*流对象。出于某种原因,在Android(API级别为16的设备,Jelly Bean 4.1)上,我在尝试这段代码时得到了一个“java.io.NotSerializableException:org.apache.harmony.xnet.provider.jsse.OpenSSLKey”。我在emulator上进行了测试,您的答案在Android 6.0上有效,但在4.1上无效。(适用于Android上试图在Java中序列化和反序列化RSA密钥对的任何人)
@Test
public void serializeTest() throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = kpg.generateKeyPair();
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(keyPair);
byte[] res = b.toByteArray();
o.close();
b.close();
ByteArrayInputStream bi = new ByteArrayInputStream(res);
ObjectInputStream oi = new ObjectInputStream(bi);
Object obj = oi.readObject();
assertTrue(obj instanceof KeyPair);
oi.close();
bi.close();
}