1

AES_ENCRYPT を使用して、テキスト フィールドが BLOB として格納される MySQL テーブルがあります。行に対していくつかのキーワードを照合する必要があります。返されるには、すべてのキーワードが行に存在する必要があります。これは、暗号化されていないフィールドで MATCH/AGAINST を使用するとうまく機能しますが、私のセットアップではうまくいきません。

私の「人」テーブル:

+============+===========+
| name_first | name_last |
+============+===========+
| John       | Smith     |
+------------+-----------+
| Jane       | Smith     |
+============+===========+

たとえば、「John」と「Smith」を検索する場合、これらの両方のキーワードを実際に含む行のみを返す必要があります。名が「Jane」で姓が「Smith」の行は一致しません。

機能しているように見える唯一の選択は、LIKE を使用する場合です。

SELECT 
AES_DECRYPT(name_first,"MyKey"),
AES_DECRYPT(name_last,"MyKey") 
FROM people 
WHERE (LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%john%" 
OR LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%john%" 
OR LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%smith%" 
OR LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%smith%")

ただし、私の SELECT は John と Jane の両方のレコードを返します。

何か案は?

4

2 に答える 2

0

かなりの時間をかけて調査した結果、問題の唯一の解決策は、一時的な MySQL (PHP スクリプトの実行中にのみ存在する) を作成し、暗号化されたテーブルから暗号化されていないデータをフィードしてから、MATCH/AGAINST を実行することであることがわかりました。 . テーブルが非常に大きいため、検索は非常に遅くなりますが、何ができるでしょうか?

于 2013-05-02T21:59:28.063 に答える
0

次のようなことを試しましたか:

SELECT 
  AES_DECRYPT(name_first,"MyKey"),
  AES_DECRYPT(name_last,"MyKey") 
FROM people 
  WHERE (LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%john%" 
     AND LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%smith%")
于 2013-04-12T11:48:58.987 に答える