上記のソフトウェアスタックを使用し、データベースに保存する前にパスワードを暗号化する必要があります。また、誰かがパスワードを変更する場合、古いパスワードを入力し、次に新しいパスワードを2回入力する必要があり、古いパスワードを確認する必要があるため、パスワードを解読する必要があります。私はよく検索しましたが、これを行う正しい方法はまだわかりません。私はこのリンクを見つけました 暗号化 しかし、これを行うための他のヒントはありますか?また、MongoDBがパスワードを保護するものを提供しているかどうかもわかりません。
最初に読む スティーブン・カールソンの答え パスワードのハッシュについて。
良いことは、Spring Securityがあなたのためにこれを行うということです。 Spring Security 3.2では、新しい _org.springframework.security.crypto.password.PasswordEncoder
_ インターフェイスといくつかの実装が導入されました。 BCryptPasswordEncoder
、 StandardPasswordEncoder
(および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
_ を使用することをお勧めします。 BCryptPasswordEncoder
(StandardPasswordEncoder
とは対照的に)は、パスワードごとに異なるソルトを使用します(ただし、StandardPasswordEncoder
のようなグローバルではありません)。生のパスワード(public String encode(CharSequence rawPassword)
)をエンコードすると、返されるエンコードされたパスワードはエンコードされたパスワードだけではなく、使用されたハッシュアルゴリズム、使用されたソルト、そしてもちろんエンコードされたパスワードに関するメタ情報も含まれます。
パスワードを「暗号化」しないでください。これは直感に反するように聞こえます。しかし、システムがパスワードを復号化する必要がある理由はありません。コード/サーバーに復号化パスワードを保存すると、ハッカーがその情報を盗む可能性があるため、データベースをハッカーに公開します。
正しいプロセスは、hash
パスワードです。ハッシュは一方向(元のテキストに戻すことはできません)プロセスです。現在の標準は、SHA256を使用してパスワードをハッシュすることです。基本的なフローチャートは次のとおりです。
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
にハッシュされますea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
)をデータベースに保存します。ユーザーがログインすると、送信したばかりのパスワードを取得してハッシュ化します。彼が同じパスワードを入力すると、データベース内の同じ値にハッシュされます。
ユーザーがパスワードを変更する場合、「古いパスワードを入力」をハッシュして古いパスワードがまだ一致することを確認します。「新しいパスワードを入力」をハッシュして保存する場合。
この例で言及しなかったことの1つは、salt
です。これは、Rainbow table
エクスプロイトからデータを保護するため、システムで使用する必要があるものです。しかし、それは別の議論のためです。
お役に立てれば :)