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 既存のパスワードストアを統合する
既存のパスワードストアを統合するためのステップを理解するためにはこの手順をお読みください。
ハッシュされたパスワード情報ストアを作成します
パスワードがすでに復元できないハッシュされた形式で保存されている場合は、これはユーザーごとにしか行えません (例えば、アップグレード手順の一環として行います)。noOpメソッドまたはストアが読み取り専用であることを示す例外を投げるメソッドとしてsetUserVerifier(String, VerifierInfo)を実装できます。SRPVerifierStore インターフェースを作成します
作成したストアからVerifierInfoを取得する方法を理解するカスタムのSRPVerifierStoreインターフェース実装を作成する必要があります。verifyUserChallenge(String, Object)を使用して、SafeWord または Radius のような既存のハードウェアトークンに基づいたスキームを SRP アルゴリズムに統合できます。このインターフェースメソッドは、クライアントSRPLoginModule設定がhasAuxChallengeオプションを指定する場合にのみ呼び出されます。JNDI MBean を作成します
JNDI に使用可能となるSRPVerifierStoreインターフェースを公開し、必要な設定可能なパラメータを公開する MBean を作成する必要があります。デフォルトのorg.jboss.security.srp.SRPVerifierStoreServiceによりこれを実装できますが、SRPVerifierStore(「セキュアリモートパスワード (SRP) の例」 を参照) の Java プロパティファイル実装を使用して MBean を実装することもできます。