コメントの会話によると、あなたが意味するのはハッシュです 暗号化ではなくパスワード パスワード。あなたは通常、レインボーテーブルの攻撃を防ぐために塩でこれを行います。パスワードをソルトハッシュとして保存することは、データベースにパスワードを保存する場合のベストプラクティスの標準です。
バージョン3.2の時点で、MongoDBは一部のSQLデータベースが提供するようなパスワードハッシュをネイティブでサポートしていないため、Javaで実装する必要があります。
新しいアカウントを生成するか、既存のアカウントのパスワードを変更するには:
- を使用して、暗号的に安全なランダムソルト値を生成します
java.security.SecureRandom。このクラスは、標準の乱数ジェネレーター<と同じように機能します。 code> java.util.Random (これはサブクラスです)が、セキュリティ関連のコンテキストに必要な、はるかに高いレベルの予測不可能性とパフォーマンスを交換します。 - ソルトとパスワードを連結して文字列を作成します
- 暗号的に安全なハッシュ関数を使用して、その文字列のハッシュを生成します。すぐに使用できるJavaによって提供されるハッシュ関数は多数ありますが、意図的に計算が難しいものを使用して、データベースアクセスで攻撃者がローカルスーパーコンピュータークラスターにハッシュをブルートフォースしようとする速度を低下させたいと考えています。良い候補は、
javax.crypto.SecretKeyFactoryクラス。 - フィールド
usernameを使用してドキュメントをMongoDBに保存します 、password_hashおよびpassword_salt(もちろん、実際のアプリケーションデータも含まれます)。元のパスワードは保存しないでください。
アカウントを取得するには:
-
username_inputを読む およびpassword_input申し立てられたユーザーがログインフォームに入力しました。 ユーザー名があるドキュメントを取得しますusername_inputと一致します ユーザーが提供しました。-
password_saltを取得します そのドキュメントのフィールド -
password_saltを連結して文字列を作成します およびpassword_input以前と同じように。 - 同じ暗号的に安全なハッシュ関数を使用して、その文字列のハッシュを生成します。
- ハッシュを
password_hashと比較します ドキュメントのフィールド。一致する場合、ユーザーは正しいパスワードを入力しました。
または、ドキュメントのpassword_hashフィールドとpassword_saltフィールドのみを取得し、ユーザーが認証される前に残りのフィールドをロードしないこともできますが、実際には、保存するよりも多くのロードが発生すると思います。アカウントをブルートフォースしようとする攻撃者がいない限り、成功したログインは通常、失敗したログインよりも大幅に多くなります。その場合、fail2ban で攻撃者をブロックします。 または別のログイン制限メカニズム。