sql >> データベース >  >> NoSQL >> MongoDB

mongodbのパスワードフィールドを暗号化する

    コメントの会話によると、あなたが意味するのはハッシュです 暗号化ではなくパスワード パスワード。あなたは通常、レインボーテーブルの攻撃を防ぐために塩でこれを行います。パスワードをソルトハッシュとして保存することは、データベースにパスワードを保存する場合のベストプラクティスの標準です。

    バージョン3.2の時点で、MongoDBは一部のSQLデータベースが提供するようなパスワードハッシュをネイティブでサポートしていないため、Javaで実装する必要があります。

    新しいアカウントを生成するか、既存のアカウントのパスワードを変更するには:

    1. を使用して、暗号的に安全なランダムソルト値を生成します java.security.SecureRandom 。このクラスは、標準の乱数ジェネレーター<と同じように機能します。 code> java.util.Random (これはサブクラスです)が、セキュリティ関連のコンテキストに必要な、はるかに高いレベルの予測不可能性とパフォーマンスを交換します。
    2. ソルトとパスワードを連結して文字列を作成します
    3. 暗号的に安全なハッシュ関数を使用して、その文字列のハッシュを生成します。すぐに使用できるJavaによって提供されるハッシュ関数は多数ありますが、意図的に計算が難しいものを使用して、データベースアクセスで攻撃者がローカルスーパーコンピュータークラスターにハッシュをブルートフォースしようとする速度を低下させたいと考えています。良い候補は、 javax.crypto.SecretKeyFactory クラス。
    4. フィールドusernameを使用してドキュメントをMongoDBに保存します 、 password_hash およびpassword_salt (もちろん、実際のアプリケーションデータも含まれます)。元のパスワードは保存しないでください。

    アカウントを取得するには:

    1. username_inputを読む およびpassword_input 申し立てられたユーザーがログインフォームに入力しました。
    2. ユーザー名があるドキュメントを取得します username_inputと一致します ユーザーが提供しました。
    3. password_saltを取得します そのドキュメントのフィールド
    4. password_saltを連結して文字列を作成します およびpassword_input 以前と同じように。
    5. 同じ暗号的に安全なハッシュ関数を使用して、その文字列のハッシュを生成します。
    6. ハッシュをpassword_hashと比較します ドキュメントのフィールド。一致する場合、ユーザーは正しいパスワードを入力しました。

    または、ドキュメントのpassword_hashフィールドとpassword_saltフィールドのみを取得し、ユーザーが認証される前に残りのフィールドをロードしないこともできますが、実際には、保存するよりも多くのロードが発生すると思います。アカウントをブルートフォースしようとする攻撃者がいない限り、成功したログインは通常、失敗したログインよりも大幅に多くなります。その場合、fail2ban で攻撃者をブロックします。 または別のログイン制限メカニズム。



    1. Redisセットの使用

    2. 正規表現と一致するmongodb$pullが機能しない

    3. Spring Data Mongodb:ドキュメントの更新

    4. dropDupstrueが機能しないmongodb