2016-01-06 26 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) –