コメントの会話によると、あなたが意味するのはハッシュです 暗号化ではなくパスワード パスワード。あなたは通常、レインボーテーブルの攻撃を防ぐために塩でこれを行います。パスワードをソルトハッシュとして保存することは、データベースにパスワードを保存する場合のベストプラクティスの標準です。
バージョン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 で攻撃者をブロックします。 または別のログイン制限メカニズム。