2016-01-06 59 views
0

我正在用PHP加密和解密我的MySQL联系人表。这一切都很好,但是我正在制作数据网格,以便它有一个搜索框,可以在所有列上进行全文搜索。现在的问题是搜索是针对加密数据而不是原始数据进行的。所以我不得不在PHP中进行全文搜索。这需要我遍历每一行,但我仍然这样做,因为我需要解密它。在关联数组上的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]); 
    } 

} 

回答

0

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

  1. 商店E(M, K1) || H(E(M, K1), K2)(例如用defuse/php-encryption加密的消息)在第二塔

在伪代码

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

嗯,我仍然会下降,你所提供的兔子洞。看起来非常有趣,会更多地考虑它。 –

0

对于它的价值在一列

  • 商店H(M, K3),使用像AES这样的对称加密对数据库列进行加密并不会增加您的信息安全性。这是因为DATABASE_KEY必须可用于您的程序。因此,渗透您的系统的网络犯罪分子很容易找到并窃取您的密钥,然后轻松窃取您的数据。

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

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

  • +0

    我正在做PHP加密的原因是,如果数据库确实落在了错误的手中,它不会受到影响,因为它们需要先破坏我的服务器并从我的PHP脚本中获取加密密钥。但我确实明白你的意思,谢谢 –

    0

    看看mysql函数AES_DECRYPT。从本质上讲,您可以以普通格式从数据库中检索所有数据,或者针对它运行查询,或者只是告诉mysql在逐行比较数据之前解密数据。在下面一起来看看:

    MYSQL SELECT WHERE LIKE WITH AES_ENCRYPT

    Multiple Where clause with decryption

    +0

    我想保留PHP加密端,而你的链接只使用也可以线性化的MySQL函数,试图避免O(n) –