簡體   English   中英

如何在Java中序列化和反序列化RSA KeyPair

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM