私は上記のソフトウェアスタックを使用しており、データベースに保存する前にパスワードを暗号化する必要があります。私はまたパスワードを解読する必要があります。なぜなら、誰かがパスワードを変更するとき、彼は古いパスワードと新しいonwを2度与える必要があり、古いパスワードをチェックする必要があるからです。 私は多くを検索しましたが、これを行う正しい方法が何であるかまだまだわかりません。 私はこのリンクを見つけましたEncryptingこれを行うための他のヒントはありますか? MongoDBがパスワードを保護するための何かを提供しているかどうかもわかりません。Spring Security、Spring Boot、MongoDBを使用したパスワードのエンコーディングとデコード
答えて
まずパスワードハッシュについてSteven Carlson´s answerをお読みください。
良いことは、Spring Securityがこれを行うことです。 Spring Security 3.2では、新しいorg.springframework.security.crypto.password.PasswordEncoder
インターフェイスといくつかの実装、BCryptPasswordEncoder
、StandardPasswordEncoder
(およびNoOpPasswordEncoder
)が導入されました。
重要:
public String encode(CharSequence rawPassword)
:昔は
public boolean matches(CharSequence rawPassword, String encodedPassword)
org.springframework.security.
authentication.encoding
.PasswordEncoder
を非推奨と(したがって実装)インターフェイスが必要な2つのメソッドがありorg.springframework.security.
crypto.password
.PasswordEncoder
を混同しないでください
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
をお勧めします。 BCryptPasswordEncoder
(StandardPasswordEncoder
とは対照的に)は、パスワードごとに異なる塩を使用します(ただし、StandardPasswordEncoder
のようにグローバルではありません)。生のパスワード(public String encode(CharSequence rawPassword)
)をエンコードすると、返されるエンコードされたパスワードはエンコードされたパスワードだけでなく、使用されているハッシュアルゴリズム、使用されている塩、エンコードされたパスワードに関するメタ情報も含まれます。
パスワードを「暗号化」しないでください。私はこれが直観に反して聞こえることを知っています。しかし、システムがパスワードを解読する必要がある理由がない。これを行うには、データベースをハッカーに公開する必要があります。コード/サーバーに復号化パスワードを格納すると、ハッカーはその情報を盗むことができるからです。
正しい処理はhash
です。ハッシュは一方向(元のテキストに戻すことはできません)プロセスです。現在の標準は、SHA256を使用してパスワードをハッシュすることです。基本的なフローチャートは次のとおりです。
- ユーザーが入力したパスワードを受け取ります。パスワードの例 "mypass"は
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
になります - このハッシュをデータベースに保存します(
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
)。
ユーザーがログインすると、彼はちょうど提出したパスワードを取得し、ハッシュします。同じパスワードを入力すると、データベースの同じ値にハッシュアウトされます。
ユーザーがパスワードを変更する場合は、「古いパスワードを入力」をハッシュして古いパスワードがまだ一致していることを確認します。「新しいパスワードを入力」をハッシュして保存します。
私の例で言及しなかったことの1つはsalt
です。これは、データをrainbow table
の悪用から守るために、システムで使用する必要があるものです。しかしそれは別の議論のためです。
希望はこのことができます:)
- 1. Spring Securityのカスタム認証とパスワードのエンコーディング
- 2. Spring SecurityとMongoDBの併用
- 3. PostgreSQLを使用したDockerizing Spring Boot App
- 4. Spring Securityチュートリアルを使用したエラービルドプロジェクト
- 5. Spring Security - BcryptPasswordEncoder
- 6. spring-session-jdbc用の既存のSpring Boot dataSourceの使用
- 7. Springを使用したマップとしてのAMQPメッセージのデコード
- 8. Spring-Bootアプリケーションを使用したapplication- {profile} .propertiesの親プロパティ
- 9. Spring Boot Mavenプラグインを使用している場合、Spring Bootアプリケーションのリソースがjarファイルに存在しない
- 10. Grails Spring Security Testing
- 11. Spring Security Ajax Login
- 12. Spring Boot REST API - リクエストタイムアウト?
- 13. mocking authentication spring security
- 14. Grails 3 Spring Security Plugin
- 15. spring-security-oauth2.0でGoogle APIを使用
- 16. Active Directoryを使用するSpring Security 3.1
- 17. Spring Securityのプログラムによる使用
- 18. Spring Security Java Config
- 19. Spring-BootプロジェクトでJavaMelodyを使用してSpring Beanを監視する
- 20. 現在のユーザーのパスワードをspring-securityから取得します
- 21. Spring Security 3.0 OpenID4Javaを使用したGoogle AppsのオープンIDのログイン
- 22. Spring Security + PrimeFacesページングエラー
- 23. Grails Spring Security SecUser
- 24. Spring Security Ajaxログイン
- 25. X509 WebSphereでのspring-ws、XWSインターセプタを使用したWS-Security
- 26. html5複数のファイルをspring mvc 4とspring bootでアップロードする
- 27. AngularJS + Spring Security + Weblogic 12
- 28. spring-boot以外のConfigurationProperties
- 29. Spring Boot webappのOrika ClassCastException
- 30. Spring BootでAllNestedConditionsを使うには
私はその製品に慣れていないので、春の情報を追加していただきありがとうございます:) –
あなたが言及したようにどのようにメタ情報を取り出すことができますか? – charle819
'BCryptPasswordEncoder'の場合、メタ情報は単にsaltにすぎません:' BCrypt.hashpw(String password、String salt) 'を見てください。 'salt'という名前のパラメータは、暗号化された古いパスワードです。そして、そのメソッドのコードは、パスワードからsaltを読み込みます – Ralph