3

Javaアプリケーションに非常に基本的なセキュリティを実装したかったのですが、最初は行き詰まっています。

私がやりたいことはこれです:1-RSAキーペアを生成します2-それらのキーをシリアル化された形式でDBに保存し、アプリケーションの次の実行でそれらを再作成できるようにします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;
}

私が抱えている問題は、2番目のメソッドは正常に機能する(キーをバイト配列にシリアル化する)が、最初のメソッドは失敗し、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)
4

2 に答える 2

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(); 
}
于 2012-12-16T15:36:32.067 に答える
1

誰かが同じ問題を抱えている場合に備えて、自分自身に答えます。

それが何であったかはわかりませんが、デフォルトのJDKの代わりにBouncyCastle SPIを使用すると問題が解決するようで、現在は正しく機能しています。

于 2012-12-16T15:28:55.787 に答える