web-dev-qa-db-ja.com

Spring Security、Spring Boot、MongoDBを使用したパスワードのエンコードとデコード

上記のソフトウェアスタックを使用し、データベースに保存する前にパスワードを暗号化する必要があります。また、誰かがパスワードを変更する場合、古いパスワードを入力し、次に新しいパスワードを2回入力する必要があり、古いパスワードを確認する必要があるため、パスワードを解読する必要があります。私はよく検索しましたが、これを行う正しい方法はまだわかりません。私はこのリンクを見つけました 暗号化 しかし、これを行うための他のヒントはありますか?また、MongoDBがパスワードを保護するものを提供しているかどうかもわかりません。

8
quma

最初に読む スティーブン・カールソンの答え パスワードのハッシュについて。

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

重要:_org.springframework.security.__crypto.password_ _.PasswordEncoder_と古い非推奨の_org.springframework.security.__authentication.encoding_ _.PasswordEncoder_

インターフェース(したがって実装)には、必要な2つのメソッドがあります。

  • public String encode(CharSequence rawPassword)
  • public boolean matches(CharSequence rawPassword, String encodedPassword)

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

24
Ralph

パスワードを「暗号化」しないでください。これは直感に反するように聞こえます。しかし、システムがパスワードを復号化する必要がある理由はありません。コード/サーバーに復号化パスワードを保存すると、ハッカーがその情報を盗む可能性があるため、データベースをハッカーに公開します。

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

  1. ユーザーが送信したパスワードを取得します。例のパスワード「mypass」はea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222にハッシュされます
  2. このハッシュ(ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222)をデータベースに保存します。

ユーザーがログインすると、送信したばかりのパスワードを取得してハッシュ化します。彼が同じパスワードを入力すると、データベース内の同じ値にハッシュされます。

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

この例で言及しなかったことの1つは、saltです。これは、Rainbow tableエクスプロイトからデータを保護するため、システムで使用する必要があるものです。しかし、それは別の議論のためです。

お役に立てれば :)

20
Steven Carlson