0

サーバーとクライアントの両方のGUIを使用して、RMIでセキュリティで保護されたバンキングサービスを開発しています。

サーバーは、すべての操作(新しいユーザー、削除されたユーザー、撤回、ロッジメントなど)をログに記録できる必要があります。クライアントはこれらの操作を実行します。すべてが保護されているため、クライアントは最初にGUIで名前とパスワードを使用してアカウントを作成する必要があります。その後、GUIはユーザーを新しい顧客として銀行UserList(arrayList)に追加し、ユーザーはいくつかの操作を実行できます。最初は簡単そうに見えますが、私の考えは正しくないと思います。

RMIで銀行全体を送信するのは正しいですか?最初は銀行がサーバーになると思っていたのですが、それを行う別の方法を見つけることができませんでした。現在、クライアントGUIはログインとパスワードを要求し、RMIによって銀行を受け取ります。ユーザーは、パスワードの名前とハッシュによって特徴付けられます。

private String name;
private byte[] passwordDigest;

実際、GUIはすべてのセキュリティチェックを行っており、それが適切かどうかはわかりません。login // passwordと入力すると、銀行のログインが検索され、パスワードのハッシュが比較されます。実際、私は、あなたが銀行を持っているとき、あなたはすべてを持っているので、クライアントがあまりにも多くの情報を知っているという印象を持っています。

それは正しいように見えますか、それとも実装を変更する必要がありますか?

4

2 に答える 2

2

2つのリモートオブジェクトクラスが必要です。

最初のものはNaming.lookup();を介して取得されます。シングルトンです。login()メソッドが含まれています。

このメソッドは、シングルトンではなく、レジストリに登録されていない2番目のリモートオブジェクトを返し、戻り値ごとに新しく作成されます。このオブジェクトには、すべてのバンキングメソッドとlogout()、それをアンエクスポートするメソッドが含まれています。おそらく、Unreferencedインターフェイスを実装して、デッドクライアントを検出し、それ自体をエクスポート解除できるようにします。クライアントごとに1回存在するため、クライアントの状態を保持でき、ログイン手順が成功した場合にのみ取得できるため、セキュリティの問題が解決されます。

public interface Login extends Remote
{
    Session login(String username, char[] password /* or whatever */)
        throws LoginException, RemoteException;
}

public interface Session extends Remote
{
    void logout() throws RemoteException;
    void deposit(...) throws RemoteException;
    void withdraw(...) throws RemoteException;
}

public class LoginImpl extends UnicastRemoteObject implements Login
{
    public Session login(String username, char[] password)
        throws LoginException, RemoteException
    {
        // username/password check; if it fails throw a LoginException
        return new SessionImpl(username); // or whatever
    }
}

public class SessionImpl extends UnicastRemoteObject implements Session, Unreferenced
{
    public void logout() throws RemoteException
    {
        unexportObject(this, true);
    }

    public void unreferenced()
    {
        unexportObject(this, true); // needs to be in a try/catch block of course
    }

    // etc
}

2001年の私の本では、これをリモートセッションパターンとして説明しました。

もちろん、トランスポート層のセキュリティも必要です。を参照してください。javax.rmi.ssl.

于 2012-11-29T22:21:31.887 に答える
1

リモートインターフェイスがどのように機能するかを誤解しています。クライアントには銀行がなく、銀行のリモートインスタンスへの参照のみがあります。Bankインターフェイスでクライアントによって行われたすべてのメソッド呼び出しは、実際にはBankのリモートインスタンス(サーバーで実行されている)に対するリモート呼び出しに変換されます。

おそらく、セキュリティチェックはすべてのメソッド呼び出しでBankメソッドで実行されます。

于 2012-11-29T18:51:11.777 に答える