关联数组的PHP全文搜索

时间:2016-01-06 12:00:05

标签: php mysql encryption

我正在用PHP加密和解密我的MySQL联系人表。这一切都很好,但我正在制作数据网格,以便它有一个搜索框,可以对所有列进行全文搜索。现在的问题是正在对加密数据而不是原始数据进行搜索。

所以我被迫在PHP中进行全文搜索。这需要我遍历每一行,但我仍然这样做,因为我需要解密它。

我担心的是我的代码执行全文搜索的速度,我想知道是否有更好,更快的方法来执行此操作?

$result = Some PDO query that does a PDO::FETCH_ASSOC, query has about 8 columns
$searchPhrase = strtolower($searchPhrase);
$aes = new AES(DATABASE_KEY, DATABASE_IV);
$count = count($result);

for($ii = 0; $ii <$count; $ii++ )
{
    $result[$ii]["ContactName"] = $aes->Decrypt($result[$ii]["ContactName"]);
    $result[$ii]["ContactDescription"] = $aes->Decrypt($result[$ii]["ContactDescription"]);
    /*More encrypted columns*/


    if (!empty($searchPhrase)) //Only do search when search phrase not empty
    {        
        $filterRow = array_slice($result[$ii], 3); // Do not take first 3 columns       
        $data = strtolower(implode("", $filterRow)); //Flaten row as one string, all lowercase
        if (strpos($data, $searchPhrase) === FALSE) //Now doing elimentation from array if not match
            unset($result[$ii]);
    }

}

3 个答案:

答案 0 :(得分:1)

唯一的secure and efficient way to search encrypted data in PHP + MySQL是完全匹配,使用一种称为盲索引的技术。

  1. E(M, K1) || H(E(M, K1), K2)(例如使用defuse/php-encryption加密的邮件)存储在一列中
  2. H(M, K3)存储在第二列
  3. 在伪代码中

    $cipher = Crypto::encrypt($message, $encryptionKey); // takes care of K1 and K2 for you
    $blind_idx = hash_hmac('sha384', $message, $unrelatedKey); // K3
    

答案 1 :(得分:0)

对于它的价值,使用AES等对称加密来加密数据库列并不会极大地增加您的信息安全性。那是因为DATABASE_KEY必须可用于您的程序。因此,一个穿透你系统的网络犯罪分子很容易找到并窃取你的密钥,然后轻易窃取你的数据。

如果列的值已加密,则数据库系统无法生成有用的全文索引。因此,您问题中的子字符串搜索策略接近最优。

但是,严肃地说,把时间和金钱花在一个好的防火墙上。保护您的数据库和Web服务器免受入侵者的侵害,而不是试图阻止入侵者在接管您的系统后窃取数据列。

答案 2 :(得分:0)

查看mysql函数AES_DECRYPT。从本质上讲,您可以以纯格式从数据库中检索所有数据或对其运行查询,或者只是告诉mysql逐行进行解密数据,然后再将值与之进行比较。看看以下内容:

MYSQL SELECT WHERE LIKE WITH AES_ENCRYPT

Multiple Where clause with decryption