java - 通过 Java RMI 发送加密对象

标签 java serialization cryptography rmi object-serialization

我正在使用 Java RMI 将对象从客户端 -> 发送到服务器。 原始对象工作正常(例如字符串等) 来自加密库的 Java 对象抛出异常。 我需要这些 Java 对象来确定 DiffieHellman key 交换中的 key 这里的异常(exception):

Exception in thread "main" java.rmi.MarshalException: error marshalling arguments; nested exception is: 
    java.io.NotSerializableException: javax.crypto.spec.DHParameterSpec
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at com.sun.proxy.$Proxy0.DiffieExchange(Unknown Source)
    at rmihello.Client.main(Client.java:51)
Caused by: java.io.NotSerializableException: javax.crypto.spec.DHParameterSpec
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
    ... 5 more

代码

//The Client
public class Client {
    public static void main(String[] args) throws Exception {
        HelloService lookup = (HelloService) Naming.lookup("rmi://localhost:5099/hello");
        //Some crypto stuff
        String username = console.next();
        BigInteger p1024 = BigInteger.probablePrime(1024, new SecureRandom());
        BigInteger g = BigInteger.valueOf(2);
        DHParameterSpec dhParams = new DHParameterSpec(p1024,g);
        //A Module I have that generates KeyPairs
        KeyPair kp = DiffieHellmanModule.genDHKeyPair(dhParams); 
        PublicKey clientPubKey = kp.getPublic();
        //@@@@@@@--FAILS--@@@@@@@
        PublicKey serverPubKey = lookup.DiffieExchange(clientPubKey,dhParams,username);
    }
}

//The interface for RMI
public interface HelloService extends Remote{
    public PublicKey DiffieExchange(PublicKey clientPublicKey, 
              DHParameterSpec dhParams,String username) throws RemoteException;
}
//The server servant implementing the interface for RMI
public class HelloServant extends UnicastRemoteObject implements HelloService{

    protected HelloServant() throws RemoteException {
        super();
    }

    @Override
    public PublicKey DiffieExchange(PublicKey clientPublicKey,
            DHParameterSpec dhParams, String username) throws RemoteException {
        KeyPair key = DiffieHellmanModule.genDHKeyPair(dhParams);
        PublicKey serverPubKey = key.getPublic();
        return serverPubKey;
    }
}
//The Application server
public class ApplicationServer {
    public static void main(String[] args) throws RemoteException, AlreadyBoundException {
        Registry registry = LocateRegistry.createRegistry(5099);
        registry.rebind("hello", new HelloServant());
    }
}

最佳答案

如果它们不是可序列化的,,您就无法在远程方法中使用它们。

但是,您可以将它们作为字节获取,发送字节,并在接收器处从字节重新构成它们。查看感兴趣的加密对象的 API。 Java 中的加密对象大多具有 getEncoded() 方法,以及可以从字节数组构建它们的工厂或构造函数。

关于java - 通过 Java RMI 发送加密对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26833524/

相关文章:

java - 如何从线程获取字符串或从线程返回字符串?

java - 如何使用反射从 Hibernate 对象中获取数据?

json - 如何使用 Serde 从 JSON 命名值而不是数组中(反)序列化元组结构?

json - 如何使用 Jackson 将 bool 值序列化为 JSON 作为字符串

Java通过命令行读取文件,<(小于)符号

java - 将 Uni 事件带回调用者线程

c# - XMLSerializer : Deserializing as derived type

asp.net - 经典asp和ASP.NET之间的密码加密/解密

java - Java 的 SecureRandom 如何知道系统上可用的 NativePRNG 的哪个实现?

php - 为什么 Php pbkdf2 输出与 golang 不同?