我想在我的Java应用程序中实现一些非常基本的安全性,但是我一开始就陷入困境。
我想做的是: 1 - 生成RSA密钥对 2 - 以序列化形式将这些密钥存储在我的数据库中,这样我就可以在下次运行应用程序时重新创建它们 3 - 对它们进行反序列化,以便我可以将它们恢复为对象形式,并可以使用它们来加密/解密。
问题是,我无法找到关于如何在任何地方执行此操作的直接解释。 我尝试了标准的Java序列化/反序列化方法,但它们不起作用。我的代码如下:
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”。 / p>
有关如何正确执行此操作的任何提示?
编辑:这是异常(它在“return((KeyPair)obj)”抛出;“在第一种方法中”:
java.lang.ClassCastException: [B cannot be cast to java.security.KeyPair
at DARCOServer.security.SecurityManager.String2KeyPair(SecurityManager.java:34)
at DARCOServer.security.SecurityManager.GenerateServerKeys(SecurityManager.java:122)
at DARCOServer.MainClass.main(MainClass.java:13)
答案 0 :(得分:4)
这对我有用:
@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();
}
答案 1 :(得分:0)
回答自己,以防有人遇到同样的问题:
不知道它是什么,但是使用BouncyCastle SPI代替默认的JDK似乎可以解决我的问题,现在它正常工作。