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
に変更しても、同じ問題が発生することに注意してください。興味深いことに、署名されたオブジェクトをソケット経由で同じプロセスで実行されている別のスレッドに送信すると、成功します。myObject
byte[]
verify
Signature
インスタンスで何かあるのかと思ったのですがverify
、異なるインスタンスで署名・検証を行っても1回の処理で成功しますSignature
。
1つのプロセスと送信者/受信者の両方のケースで、まったく同じ方法でファイルからそれらをロードしているため、キーに問題があるとは思えません。