我正在使用RMI编写一个加密系统的原型。
我遇到了一个问题,因为当我启动两个客户端时,它们从OneTimePad类中的一个对象中获得响应。
因此,客户端A接收到了为客户端B保留的密钥,由于特定的算法,这种情况不应该发生。
服务器只向客户端发送E和N变量(就像RSA一样),因此我无法将OneTimePad对象序列化并通过网络发送它(因为它将包含所有密钥)。
我该如何为每个客户端创建一个OneTimePad类的对象?
我在2001年的书中称之为远程会话模式。注册表中的远程对象是一种仅导出login()
方法的登录服务器。如果成功,login()
方法每次调用都返回一个新的远程对象,即基本上是每个客户端的远程会话对象。此会话对象可以导出logout()
方法,该方法取消导出自身,并且它还可以实现Unreferenced
,使得unreferenced()
方法也取消导出自身(或者您可以依靠DGC,它也会执行相同的操作:使用Unreferenced
可以让您有机会记录它)。此远程会话对象导出所有已登录客户端应具有访问权限的远程方法,并且由于它是每个客户端的,因此它可以保存客户端状态,因此它是一个会话。
public interface RemoteLogin extends Remote
{
RemoteSession login() throws RemoteException;
}
public interface RemoteSession extends Remote
{
void logout() throws RemoteException;
void myMethod(...) throws RemoteException; // whatever you need
}
public class RemoteLoginImpl extends UnicastRemoteObject implements RemoteLogin
{
// ...
public RemoteSession login()
{
// ...
return new RemoteSessionImpl(); // whatever arguments you need
}
}
public class RemoteSessionImpl extends UnicastRemoteObject implements RemoteSession, Unreferenced
{
// ...
}