2013-06-21 6 views
13

今日私は、3.1.3から3.1.4への作業中のアプリケーションのスプリングセキュリティバージョンをアップグレードし、org.springframework.security.authentication.encoding.ShaPasswordEncoderクラスの非推奨警告に気づきました。Springセキュリティ3.1.4とShaPasswordEncoder非推奨

私は新しいorg.springframework.security.crypto.password.StandardPasswordEncoder実装に切り替えました。

新しいユーザーを登録してアプリケーションにログインすることはできましたが、恐らく私は以前のShaPasswordEncoderとカスタム塩で生成されたパスワードでログインできません。

すでに多くのユーザーが登録されているデータベースがあるので、古いエンコードされたパスワードを無効にしないで実装を切り替えるにはどうすればよいですか? それは可能ですか?

も参照してください:優れた質問だといくつかの答えを読んだのを楽しみにしていますHow to use new PasswordEncoder from Spring Security

答えて

17

より安全なパスワードエンコード方式に切り替える場合は、BCryptを使用することをおすすめします。私はあなたのユーザーを移行するために、このようなものを使用します。

// Implement the old PasswordEncoder interface 
public class MigrateUsersPasswordEncoder implements PasswordEncoder { 
    @Autowired 
    ShaPasswordEncoder legacyEncoder; 
    @Autowired 
    JdbcTemplate template; 

    BCryptPasswordEncoder bcryptEncoder = new BCryptPasswordEncoder(); 

    @Override 
    public String encodePassword(String rawPass, Object salt) { 
     return bcryptEncoder.encode(rawPass); 
    } 

    @Override 
    public boolean isPasswordValid(String encPass, String rawPass, Object salt) { 
     if (legacyEncoder.isPasswordValid(encPass, rawPass, salt)) { 
      template.update("update users set password = ? where password = ?", bcryptEncoder.encode(rawPass), encPass); 
      return true; 
     } 
     return bcryptEncoder.matches(rawPass, encPass); 
    } 
} 

あなたは、ユーザーの割合は、パスワードフィールドのフォーマットによって移行されているかどうか確認することができます。 BCrypt文字列には、$という記号で始まる固有の構文があります。

他の回答の1つは、このコードが誤って複数のパスワードを同時に更新する可能性があることを指摘しています。疑問は、カスタム塩が使用されていると述べたので、塩が無作為に選択されれば衝突の可能性はごくわずかですが、必ずしもそうではないかもしれません。 2つのパスワードが更新された場合は、どのような問題がありますか?次に、アカウントがbcryptハッシュから同じパスワードを持つことを検出することが可能になります。とにかく、更新のためにSHAハッシュが同じであることが必要なので、それはどちらの場合もそうです。塩分の選択が悪い、または無塩ハッシュの使用さえも問題があると思われる場合は、SQLを修正してこれを検出し、別々のBCryptハッシュ値で複数の更新を実行するのは簡単です。

+0

ありがとうコードです。これは多かれ少なかれSpiffが提案したものです。ここでの私の目標は、2つの実装を同時に行うことなくSpring Securityの将来のリリースにアップグレードできることです。また、このソリューションはすべてのユーザーがサインインする場合にのみ機能します。古いものと互換性のある実装が導入されることを願っていますShaPasswordEncoder。 –

+0

ユーザーがサインインしない場合は、適切な審査期間の後にアカウントを維持する価値があるかどうかを判断する価値があります。それらが非アクティブである場合、それらを一時的に無効にし、ユーザーにパスワードをリセットするように頼むメールを送ることができます。古いパスワードエンコーダの使用は、比較的安全ではなく、エラーが発生しやすく、他のシステムと互換性がないため、使用しないでください。クラスは新しいアプリケーションでの使用を阻止するために推奨されていませんが、より安全なオプションを使用したくない場合は、クラスを使用することを止めるものはありません。 –

1

AFAIK一括更新では不可能です。ハッシュから元の文字列を取得することはできません。投稿されたパスワードがどちらかの戦略に一致し、必要に応じてそれを新しい戦略に変換する場合は、ログイン試行中にチェックする必要がありますが、すべてのユーザーがログインしてすべてのパスワードが入力されるまで、変換される。あまり便利ではなく、直感的に新しい開発者が登場します。

2

私は受け入れられた回答にコメントを追加しようとしましたが、残念ながら、まだ十分なクレジットがありません。 :(

私は受け入れられた答えのコードスニペットは、データベースのパスワードを更新すると潜在的に危険であると信じています.ShaPasswordEncoderが暗号化の際に同じ結果を生成するならば、古いパスワードを見つけることができる私はこれがShaPasswordEncoderのヌルソルトで間違いなく真実であることを確認しましたが、パスワードがすべてのユーザーの間で一意であることは保証できません。そのSQLコードによって、パスワードが発生したすべてのユーザーが変更されることになります。

最も安全な戦略は、ユーザーのパスワードを更新しないで、ShaPasswor dEncoder。

  • 提供されているサンプルコードを使用してください。
  • データベースを更新するコードを削除します。
  • ShaPasswordEncoderが削除されたときに新しいパスワードを作成しなかった場合の最終的なケースを処理するために、「パスワードを忘れました」や「新しいパスワードを生成する」などの機能を追加します。削除したSpring Securityにアップグレードするときと同じように、または自分で削除することを選択します。
  • 次のメジャーリリースバージョンのソフトウェアでは、ユーザーがパスワードを再保存する必要があるか、前述のパスワードリセット機能を使用する必要があることを、ドキュメントを更新するか、明確にしてください。
  • 移行するメジャーバージョンのリリースサイクルの猶予期間をユーザーに与えます(おそらくこれを実行せず、リセットパスワードに遭遇するだけです)。
+0

これは良い点です。しかし、私はそれが現実の状況に比べて本当に危険だとは思っていませんし、更新を延期すべきです。回避策も簡単です。私はいくつかの余分な考えを追加するために私の答えを更新しました。 –

関連する問題