[英]How to serialize and deserialize a RSA KeyPair in Java
我想在我的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”。
有關如何正確執行此操作的任何提示?
編輯:這是異常(它被拋出“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)
這對我有用:
@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();
}
回答我自己,以防有人遇到同樣的問題:
不知道它是什么,但使用BouncyCastle SPI代替默認的JDK似乎為我解決了問題,它現在正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.