3

java.security.SignedObject正しくシリアライズされていないようです。

単一のプロセスで次のことを行うと、正常に動作します。

Signature signingEngine = Signature.getInstance("DSA", "SUN");
PublicKey pubKey; // Already initialized appropriately
PrivateKey privKey; // "     "           "
SignedObject so = new SignedObject(myObject, privKey, signingEngine);
so.verify(pubKey, signingEngine); // returns true    

しかし、2 つのプロセスがあり、署名されたオブジェクトをネットワーク経由で渡そうとすると、問題が発生します。

送信者

Signature signingEngine = Signature.getInstance("DSA", "SUN");
PrivateKey privKey; // Already initialized appropriately
SignedObject so = new SignedObject(myObject, privKey, signingEngine);
Socket socket = new Socket("localhost", 4000);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(so);
out.close();

レシーバー

Signature signingEngine = Signature.getInstance("DSA", "SUN");
PublicKey pubKey; // Already initialized appropriately
ServerSocket socket = new ServerSocket(4000);
ObjectInputStream in = new ObjectInputStream(socket.accept().getInputStream());
SignedObject so = (SignedObject) in.readObject();
in.close();
so.verify(pubKey, signingEngine); // returns false    

myObjectを実装し、などのプリミティブSerializableに変更しても、同じ問題が発生することに注意してください。興味深いことに、署名されたオブジェクトをソケット経由で同じプロセスで実行されている別のスレッドに送信すると、成功します。myObjectbyte[]verify

Signatureインスタンスで何かあるのかと思ったのですがverify、異なるインスタンスで署名・検証を行っても1回の処理で成功しますSignature

1つのプロセスと送信者/受信者の両方のケースで、まったく同じ方法でファイルからそれらをロードしているため、キーに問題があるとは思えません。

4

0 に答える 0