13.2. セキュアなリモートパスワード情報の設定

既存のセキュリティ情報ストアと統合する SRPVerifierStore インターフェースの実装を提供する MBean サービスを作成する必要があります。SRPVerifierStore インターフェースは 例13.2「SRPVerifierStore インターフェース」 に表示されています。

注記

SRPVerifierStore インターフェースのデフォルト実装は、セキュリティの実稼働環境には推奨されません。すべてのパスワードハッシュ情報がシリアル化されたオブジェクトのファイルとして使用可能である必要があるためです。

例13.2 SRPVerifierStore インターフェース

package org.jboss.security.srp;

import java.io.IOException;
import java.io.Serializable;
import java.security.KeyException;

public interface SRPVerifierStore
{
    public static class VerifierInfo implements Serializable
    {

        public String username;


        public byte[] salt;
        public byte[] g;
        public byte[] N;
    }
    

    public VerifierInfo getUserVerifier(String username)
        throws KeyException, IOException;

    public void setUserVerifier(String username, VerifierInfo info)
        throws IOException;


     public void verifyUserChallenge(String username, Object auxChallenge)
         throws SecurityException;
}
SRPVerifierStore 実装の主要機能は、SRPVerifierStore.VerifierInfo オブジェクトへのアクセスを特定のユーザー名に提供することです。getUserVerifier(String) メソッドは SRP アルゴリズムが必要なパラメータを取得するためユーザーの SRP セッションの開始時に SRPService より呼び出されます。VerifierInfo オブジェクトの要素は以下のとおりです。
user name
ログインに使用するユーザー名または ID です。
verifier
アイデンティティの証拠としてユーザーが入力するパスワードの一方向ハッシュまたは PIN です。org.jboss.security.Util クラスにはそのパスワードハッシュアルゴリズムを実行する calculateVerifier メソッドがあります。出力パスワードは H(salt | H(username | ':' | password)) の形式を取り、H は RFC2945 により定義されたとおりのセキュアハッシュ関数 SHA です。ユーザー名は UTF-8 エンコードを使用して文字列から byte[] に変換されます。
salt
データーベースが危害を受けた場合に、データベースパスワードベリファイアにブルートフォース、辞書攻撃されにくくするために使用される乱数です。ユーザーの既存のクリアテキストのパスワードがハッシュされたときに、強固な暗号化形式の乱数アルゴリズムにより値が生成されます。
g
SRP アルゴリズムプリミティブジェネレータです。これはユーザーごとの設定ではなく、既知の固定パラメータとなります。org.jboss.security.srp.SRPConf ユーティリティクラスは、SRPConf.getDefaultParams().g() により取得された適切なデフォルトなど g に対して設定を複数提供します。
N
SRP アルゴリズムセーフプライムモジュールです。これはユーザーごとの設定ではなく、既知の固定パラメータとなります。org.jboss.security.srp.SRPConf ユーティリティクラスは SRPConf.getDefaultParams().N() により取得できる適切なデフォルトなどの N に対して設定を複数提供します。

手順13.1 既存のパスワードストアを統合する

既存のパスワードストアを統合するためのステップを理解するためにはこの手順をお読みください。
  1. ハッシュされたパスワード情報ストアを作成します

    パスワードがすでに復元できないハッシュされた形式で保存されている場合は、これはユーザーごとにしか行えません (例えば、アップグレード手順の一環として行います)。
    noOp メソッドまたはストアが読み取り専用であることを示す例外を投げるメソッドとして setUserVerifier(String, VerifierInfo) を実装できます。
  2. SRPVerifierStore インターフェースを作成します

    作成したストアから VerifierInfo を取得する方法を理解するカスタムの SRPVerifierStore インターフェース実装を作成する必要があります。
    verifyUserChallenge(String, Object) を使用して、SafeWord または Radius のような既存のハードウェアトークンに基づいたスキームを SRP アルゴリズムに統合できます。このインターフェースメソッドは、クライアント SRPLoginModule 設定が hasAuxChallenge オプションを指定する場合にのみ呼び出されます。
  3. JNDI MBean を作成します

    JNDI に使用可能となる SRPVerifierStore インターフェースを公開し、必要な設定可能なパラメータを公開する MBean を作成する必要があります。
    デフォルトの org.jboss.security.srp.SRPVerifierStoreService によりこれを実装できますが、SRPVerifierStore (「セキュアリモートパスワード (SRP) の例」 を参照) の Java プロパティファイル実装を使用して MBean を実装することもできます。