2016-02-06 19 views
5

私は上記のソフトウェアスタックを使用しており、データベースに保存する前にパスワードを暗号化する必要があります。私はまたパスワードを解読する必要があります。なぜなら、誰かがパスワードを変更するとき、彼は古いパスワードと新しいonwを2度与える必要があり、古いパスワードをチェックする必要があるからです。 私は多くを検索しましたが、これを行う正しい方法が何であるかまだまだわかりません。 私はこのリンクを見つけましたEncryptingこれを行うための他のヒントはありますか? MongoDBがパスワードを保護するための何かを提供しているかどうかもわかりません。Spring Security、Spring Boot、MongoDBを使用したパスワードのエンコーディングとデコード

答えて

18

まずパスワードハッシュについてSteven Carlson´s answerをお読みください。

良いことは、Spring Securityがこれを行うことです。 Spring Security 3.2では、新しいorg.springframework.security.crypto.password.PasswordEncoderインターフェイスといくつかの実装、BCryptPasswordEncoderStandardPasswordEncoder(およびNoOpPasswordEncoder)が導入されました。

重要:

  • public String encode(CharSequence rawPassword)
  • :昔は org.springframework.security. authentication.encoding .PasswordEncoder

    を非推奨と(したがって実装)インターフェイスが必要な2つのメソッドがありorg.springframework.security.crypto.password.PasswordEncoderを混同しないでください

  • public boolean matches(CharSequence rawPassword, String encodedPassword)

org.springframework.security.crypto.bcrypt.BCryptPasswordEncoderをお勧めします。 BCryptPasswordEncoderStandardPasswordEncoderとは対照的に)は、パスワードごとに異なる塩を使用します(ただし、StandardPasswordEncoderのようにグローバルではありません)。生のパスワード(public String encode(CharSequence rawPassword))をエンコードすると、返されるエンコードされたパスワードはエンコードされたパスワードだけでなく、使用されているハッシュアルゴリズム、使用されている塩、エンコードされたパスワードに関するメタ情報も含まれます。

+0

私はその製品に慣れていないので、春の情報を追加していただきありがとうございます:) –

+0

あなたが言及したようにどのようにメタ情報を取り出すことができますか? – charle819

+0

'BCryptPasswordEncoder'の場合、メタ情報は単にsaltにすぎません:' BCrypt.hashpw(String password、String salt) 'を見てください。 'salt'という名前のパラメータは、暗号化された古いパスワードです。そして、そのメソッドのコードは、パスワードからsaltを読み込みます – Ralph

16

パスワードを「暗号化」しないでください。私はこれが直観に反して聞こえることを知っています。しかし、システムがパスワードを解読する必要がある理由がない。これを行うには、データベースをハッカーに公開する必要があります。コード/サーバーに復号化パスワードを格納すると、ハッカーはその情報を盗むことができるからです。

正しい処理はhashです。ハッシュは一方向(元のテキストに戻すことはできません)プロセスです。現在の標準は、SHA256を使用してパスワードをハッシュすることです。基本的なフローチャートは次のとおりです。

  1. ユーザーが入力したパスワードを受け取ります。パスワードの例 "mypass"はea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222になります
  2. このハッシュをデータベースに保存します(ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222)。

ユーザーがログインすると、彼はちょうど提出したパスワードを取得し、ハッシュします。同じパスワードを入力すると、データベースの同じ値にハッシュアウトされます。

ユーザーがパスワードを変更する場合は、「古いパスワードを入力」をハッシュして古いパスワードがまだ一致していることを確認します。「新しいパスワードを入力」をハッシュして保存します。

私の例で言及しなかったことの1つはsaltです。これは、データをrainbow tableの悪用から守るために、システムで使用する必要があるものです。しかしそれは別の議論のためです。

希望はこのことができます:)

関連する問題