2011-10-26 17 views
6

私はまだクエリを実行できるように、暗号化されたデータを格納する方法が必要です。それも可能ですか?'クエリ可能な'暗号化データをMySQLに保存する方法は?

少なくとも、同じ入力に対して常に同じ文字列を返す暗号化アルゴリズムが必要なので、その文字列を暗号化し、DBで暗号化された結果を探して、「John」という名前のすべてのユーザーを見つけることができます。 PHPでは、mcryptは常に異なる文字列を返します(セキュリティを向上させるために、これは意図的なものです)。

アイデア?

+1

暗号化されたデータをmysqlに保存するには、キーワード検索を実行するために、暗号化されたデータを暗号化解除する必要があります(これはmysqlではphpではないと仮定します)。インデックスでさえもあなたを助けることができないので、これは非常に遅いでしょう。 –

+0

なぜ暗号化されたデータを保存する必要があるのか​​という質問がありますか? –

+0

ウェブアプリケーションで承認されたユーザー(DBではなく)のみが閲覧できるようにする必要があるためです。多くの人がこのDBで作業し、読み取りアクセス権を持っています。 – HappyDeveloper

答えて

8

「John」という名前の保存方法によって異なります。それが唯一のものは、特定のフィールドでなら「ジョン」は、より大きな文字列(「ジョン・ドウ」や「ジョン王、宇宙の支配者」)の一部である場合、あなたはその後、

SELECT ... 
FROM sometable 
WHERE cryptedfirstname = AES_ENCRYPT('John', $key) 

ような何かを行うことができます完全なフィールドを解読して一致させる必要があります。

SELECT ... 
FROM sometime 
WHERE INSTR(AES_DECRYPT(cryptedFULLame, $key), 'John') > 0 

私は解読キーをクエリに埋め込んでいます。生産システムの考え方が悪いですが、これは単なる例です。

... 
WHERE INSTR(cryptedFULLname, AES_ENCRYPT('John', $key)) 

によりどのようにAESや他のほとんどのuserful /まともな暗号システムの作業:

あなたのような何かをすることはできません。

+0

ありがとう、非常に便利です。何人かの馬鹿はあなたに-1、明らかに彼は問題を理解していませんでした。 +1 – HappyDeveloper

+0

いいえ、大したことはありません。ダウンフォースはここで厚くて速く飛んでいく。そして、率直に言って、この時点で-1はそれほど大きな違いはありません... –

+1

下院は私からのものではありませんでしたが、良いセキュリティが予測不可能な暗号モードを必要としていることを理解している人からのものでしたIV。ここの例にはそれがありません。 – erickson

2

これはわかっているようですが、特定のプレーンテキストに対して常に同じ暗号テキストを生成する暗号化アルゴリズムが壊れていることを強調する必要があります。あらゆる種類の攻撃につながります。

たとえば、データベースとアプリケーションにアクセスできる攻撃者は、フィールドに「John」という値を選択し、アプリケーションにデータベースに格納させることができます。次に彼は彼の記録のための暗号文を見て、その暗号文を含む他の記録を特定することができます。彼はこれの鍵を得る必要はありません。

セッション識別子やUUIDなどの大きな「予測不可能な」一意の番号を暗号化する場合は例外です。この場合、プレーンテキストは再現せず、有効なプレーンテキストは攻撃者によって予測できないため、暗号文の区別が不要です。

ECBモードで使用されるすべての対称暗号は、常に同じIVを使用する場合は初期化ベクトルをとるモードを使用するので、平文から一貫した暗号文を生成します。これを行うのは一般的には良い考えではありません。

+0

おかげで、ありがとう。まあ、会社の誰かがこれに対処しなければならないでしょう、私はシステムを設計しませんでした。 +1 – HappyDeveloper

関連する問題