2012-01-26 13 views
2

基本的に私は(BLOBフィールドの)AESで暗号化されたユーザーデータを保持するテーブルを持っています。 、だから... ...テーブル全体を行うことができる任意の試合前に、復号化が必要になります、特に以来暗号化されたデータベースフィールドのユーザールックアップ

... WHERE AES_DECRYPT(`user`.`email`, '{$sSomeKeyHere}') = '{$sSubmittedEmail}' 

を -

これは、これらのフィールドのどれもが、そのテーブルの上に任意のクエリが遅くなるインデックスを作成することはできないことを意味し私が望むのは、暗号化されていないハッシュ値を含むフィールドで、クイックルックアップとして使用するためにインデックスを付けることができます。最良のルックアップは、メールアドレスを解読することなく効果的にメールアドレスを検索できるように、メールアドレス(小文字、逆順、ハッシュまたはその他の複製可能なプロセス)の派生語です。安全です。

だから、私はオーバーじっくり考えてるのオプション:

1:ちょうど小文字およびSHA-256(または512)はデータベース

2に挿入する前に、メールアドレスをハッシュ:もう少し複雑;小文字に加えて電子メールアドレスをハッシュする前にスクランブリングする他の複製可能な機能

3:user.last_login_date(暗号化されていない)から塩ストリングを作成し、それを使用して電子メールアドレスで塩漬けされたハッシュを作成し、ユーザーがログインするたびにルックアップフィールドを更新する)。しかし、これには少し複雑なSELECTステートメントが必要です。これは、MySQLエンジンに組み込まれているハッシュ関数に制限されています。最後のログイン日時を使ってハッシュを再作成して検索する必要があります。


ですから、オプション1を使用するだけで問題はありませんか?

オプション2は優れていますか?

オプション3は完全にオーバーキルだと思いますか?

また、完全に明白な何かを見逃してしまったことがありますが、実際にはもっと良い解決策がありますか?

答えて

0

オプション1

あなたのデータを検索し、比較のために、唯一の暗号化された検索語に対してインデックスを作成することができます。

+0

私はオプション1と行くつもりだ - 全体のポイントは、電子メールアドレス(ユーザー入力から)とAFAICTに基づいて安全なインデックス可能なフィールドを作成するためですMySQLでこれを実現する唯一の方法は、VARCHAR(または類似のもの)でハッシュを使用することです。これは実際に複雑な検索ではなく、バリデーションのためにデータを検索するための 'SELECT'の' WHERE'に入れるための素早い識別子です。電子メールアドレスでインデックス検索を実行するので、簡単なクエリが得られ、テーブル全体ではなく単一の行だけを復号化する必要があります:) – CD001

2

なぜあなたは逆のものを使用しませんか?

... WHERE `user`.`email` = AES_ENCRYPT('{$sSubmittedEmail}'`, '{$sSomeKeyHere}') 

と暗号化された文字列はbase64または似たような機能を経由してVARCHARタイプに格納することができます。

+0

* blinks * ...そうオプション4::)私は何かが明らかに欠場した!私はエレガンスが好きですが、MyISAMを使ってMyISAMを使用すると、BLOBフィールド以外にAES暗号化文字列を挿入することはできませんでした。訂正 - ちょうどチェックされ、それはTEXTフィールドでも動作しますが、インデックスされません。(FULLTEXTは別です) – CD001

+0

MySQL 5.6以上を使用している場合は、 'TO_BASE64'を使って暗号化してくださいバイナリを文字列に変換します。そうでない場合は、アプリケーションレベルで暗号化と復号化を行うか、Base64 UDFを追加します。 http://stackoverflow.com/questions/358500/base64-encode-in-mysql – lqez

+0

残念ながらMySQL 5です。1(Slackwareはそのビルドではかなり保守的です)。アプリケーションレベルでのbase64エンコーディングは、理解しているように、VARCHARフィールドのターミネータである文字列に '0x0'を組み込むことができますBLOBまたはTEXT?私はあなたのポストの後にそれを調べて、私がそれを機能させることができるかどうかを見ていました。基本的には、アプリケーション内でAES_ENCRYPTを再作成し、base64でエンコードされた文字列をVARCHARに取得しています... tbh:\ – CD001

関連する問題