クラス DelegatingPasswordEncoder

java.lang.ObjectSE
org.springframework.security.crypto.password.DelegatingPasswordEncoder
実装されたすべてのインターフェース:
PasswordEncoder

public class DelegatingPasswordEncoder extends ObjectSE implements PasswordEncoder
接頭辞付き識別子に基づいて別の PasswordEncoder に委譲するパスワードエンコーダー。

インスタンスの作成

PasswordEncoderFactories を使用してインスタンスを簡単に構築できます。または、独自のカスタムインスタンスを作成することもできます。例:
 String idForEncode = "bcrypt";
 Map<String,PasswordEncoder> encoders = new HashMap<>();
 encoders.put(idForEncode, new BCryptPasswordEncoder());
 encoders.put("noop", NoOpPasswordEncoder.getInstance());
 encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
 encoders.put("scrypt", new SCryptPasswordEncoder());
 encoders.put("sha256", new StandardPasswordEncoder());

 PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
 

パスワード保存形式

パスワードの一般的な形式は次のとおりです。
 {id}encodedPassword
 
ここで、"id" はどの PasswordEncoder を使用するかを検索するために使用される識別子であり、"encodedPassword" は選択された PasswordEncoder の元のエンコードされたパスワードです。"id" はパスワードの先頭にあり、"{" (id プレフィックス)で始まり、"}" (id サフィックス)で終わる必要があります。id プレフィックスと id サフィックスは両方とも DelegatingPasswordEncoder(String, Map, String, String) を介してカスタマイズできます。"id" が見つからない場合、"id" は null になります。例: 以下は、異なる "id" を使用してエンコードされたパスワードのリストです。元のパスワードはすべて "password" です。
 {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
 {noop}password
 {pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
 {scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=
 {sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
 
上記で作成した DelegatingPasswordEncoder の場合:
  1. 最初のパスワードは、PasswordEncoder ID が "bcrypt"、encodedPassword が "$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG" です。一致すると、BCryptPasswordEncoder に委譲されます。
  2. 2 番目のパスワードは、PasswordEncoder ID が "noop"、encodedPassword が "password" になります。一致すると、NoOpPasswordEncoder に委譲されます。
  3. 3 番目のパスワードは、PasswordEncoder ID が "pbkdf2"、encodedPassword が "5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc" になります。一致すると、Pbkdf2PasswordEncoder に委譲されます。
  4. 4 番目のパスワードは、PasswordEncoder ID が "scrypt"、encodedPassword が「$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=" となり、一致すると SCryptPasswordEncoder に委譲されます。
  5. 最終的なパスワードは、PasswordEncoder ID が "sha256"、encodedPassword が "97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0" になります。一致すると、StandardPasswordEncoder に委譲されます。

パスワードエンコーディング

コンストラクターに渡される idForEncode は、パスワードのエンコードに使用される PasswordEncoder を決定します。上記で作成した DelegatingPasswordEncoder では、"password" をエンコードした結果が BCryptPasswordEncoder に委譲され、接頭辞 "{bcrypt}" が付けられます。最終結果は次のようになります。
 {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
 

パスワード照合

照合は、"id" と、コンストラクターで提供される PasswordEncoder への "id" のマッピングに基づいて行われます。「パスワードの保存形式」の例は、これがどのように行われるかの実例を提供します。デフォルトでは、マップされていない "id" (null id を含む) を持つパスワードで matches(CharSequence, String) を呼び出した結果は、IllegalArgumentExceptionSE になります。この動作は setDefaultPasswordEncoderForMatches(PasswordEncoder) を使用してカスタマイズできます。
導入:
5.0
関連事項:
  • コンストラクターの詳細

  • メソッドの詳細

    • setDefaultPasswordEncoderForMatches

      public void setDefaultPasswordEncoderForMatches(PasswordEncoder defaultPasswordEncoderForMatches)
      ID が PasswordEncoder にマップされていない場合、matches(CharSequence, String) の委譲先として PasswordEncoder を設定します。

      提供される encodedPassword は、{"id" } 部分を含む渡される完全なパスワードになります。* 例: "{notmapped}foobar" のパスワードが使用された場合、"id" は "notmapped" になり、PasswordEncoder に渡される encodedPassword は "{notmapped}foobar" になります。

      パラメーター:
      defaultPasswordEncoderForMatches - 使用するエンコーダ。デフォルトでは、IllegalArgumentExceptionSE をスローします。
    • encode

      public StringSE encode(CharSequenceSE rawPassword)
      インターフェースからコピーされた説明: PasswordEncoder
      生のパスワードをエンコードします。一般に、適切なエンコードアルゴリズムは、8 バイト以上のランダムに生成されたソルトと組み合わせた SHA-1 以上のハッシュを適用します。
      次で指定:
      インターフェース PasswordEncoderencode 
    • matches

      public boolean matches(CharSequenceSE rawPassword, StringSE prefixEncodedPassword)
      インターフェースからコピーされた説明: PasswordEncoder
      ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。パスワードが一致する場合は true を返し、一致しない場合は false を返します。保管されたパスワード自体は決してデコードされません。
      次で指定:
      インターフェース PasswordEncodermatches 
      パラメーター:
      rawPassword - エンコードおよび照合する生のパスワード
      prefixEncodedPassword - 比較するストレージからのエンコードされたパスワード
      戻り値:
      エンコード後の生のパスワードがストレージからのエンコードされたパスワードと一致する場合は true
    • upgradeEncoding

      public boolean upgradeEncoding(StringSE prefixEncodedPassword)
      インターフェースからコピーされた説明: PasswordEncoder
      セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。デフォルトの実装は常に false を返します。
      次で指定:
      インターフェース PasswordEncoderupgradeEncoding 
      パラメーター:
      prefixEncodedPassword - チェックするエンコードされたパスワード
      戻り値:
      セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true、そうでない場合は false。