基本的に私は(BLOBフィールドの)AESで暗号化されたユーザーデータを保持するテーブルを持っています。 、だから... ...テーブル全体を行うことができる任意の試合前に、復号化が必要になります、特に以来暗号化されたデータベースフィールドのユーザールックアップ
... WHERE AES_DECRYPT(`user`.`email`, '{$sSomeKeyHere}') = '{$sSubmittedEmail}'
を -
これは、これらのフィールドのどれもが、そのテーブルの上に任意のクエリが遅くなるインデックスを作成することはできないことを意味し私が望むのは、暗号化されていないハッシュ値を含むフィールドで、クイックルックアップとして使用するためにインデックスを付けることができます。最良のルックアップは、メールアドレスを解読することなく効果的にメールアドレスを検索できるように、メールアドレス(小文字、逆順、ハッシュまたはその他の複製可能なプロセス)の派生語です。安全です。
だから、私はオーバーじっくり考えてるのオプション:
1:ちょうど小文字およびSHA-256(または512)はデータベース
2に挿入する前に、メールアドレスをハッシュ:もう少し複雑;小文字に加えて電子メールアドレスをハッシュする前にスクランブリングする他の複製可能な機能
3:user.last_login_date
(暗号化されていない)から塩ストリングを作成し、それを使用して電子メールアドレスで塩漬けされたハッシュを作成し、ユーザーがログインするたびにルックアップフィールドを更新する)。しかし、これには少し複雑なSELECT
ステートメントが必要です。これは、MySQLエンジンに組み込まれているハッシュ関数に制限されています。最後のログイン日時を使ってハッシュを再作成して検索する必要があります。
ですから、オプション1を使用するだけで問題はありませんか?
オプション2は優れていますか?
オプション3は完全にオーバーキルだと思いますか?
また、完全に明白な何かを見逃してしまったことがありますが、実際にはもっと良い解決策がありますか?
私はオプション1と行くつもりだ - 全体のポイントは、電子メールアドレス(ユーザー入力から)とAFAICTに基づいて安全なインデックス可能なフィールドを作成するためですMySQLでこれを実現する唯一の方法は、VARCHAR(または類似のもの)でハッシュを使用することです。これは実際に複雑な検索ではなく、バリデーションのためにデータを検索するための 'SELECT'の' WHERE'に入れるための素早い識別子です。電子メールアドレスでインデックス検索を実行するので、簡単なクエリが得られ、テーブル全体ではなく単一の行だけを復号化する必要があります:) – CD001