如何在加密的数据库字段上实现搜索

时间:2018-11-12 11:54:13

标签: php mysql search encryption

我在Web应用程序中使用PHP和MySql。我有一个需要加密用户特定信息(例如姓名和email_id)的要求。

$name = "Kevin John";
$encryptionMethod = "AES-256-CBC";
$secretHash = "25c6c7ff35b8879b151f2136cd13574";
$enc_name = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);

我将此加密名称存储在我的数据库中。但是真正的问题是我需要根据用户名进行搜索,例如:-

$qry = "select * from users where name like %john%";

任何建议表示赞赏

3 个答案:

答案 0 :(得分:0)

不建议对要搜索的数据进行加密。

  • 您可以选择不对要搜索的字段进行加密。
  • 或者您可以获取所有数据,解密并搜索该行是否包含您想要在应用程序层上显示的内容(我不建议这种方法)。

    // Pseudocode
    $searchTerm = 'john';
    $allNamesQuery = 'select * from users'; 
    $allNamesData = execQuery($allNamesQuery);
    $suggestions = [];
    foreach($allNamesData as $row){
        $row = decryptNameFromRow($row);
        if(contains($row['name'], $searchTerm))
           array_push($suggestions, $row);
    }
    print_r($suggestions);
    

    请建议是否有其他选择。

答案 1 :(得分:0)

您可能有几种选择,有些简单,有些没有

  • 搜索/关键字段通常未加密存储以解决此问题(您显然不需要这样做)
  • 如前所述,
  • -扫描整个表,解密每条记录都可以,但是可能不可行
    • 您可以使用静态IV实现确定性加密,对搜索到的术语进行加密并搜索已经加密的值。知道静态IV正在降低(有时会破坏)安全级别
    • 您可能会看过homomorphic encrytion专为加密数据操作而设计的,但是却不知道自己在做什么,这可能非常陡峭并且容易出错,以实现自己的加密货币(即使是经验丰富的专业人员也不建议这样做) 。我还不敢穿过这扇门。
    • 您可以存储索引值的加密散列(例如,sha256)(可能沿着加密值)。然后,您可以搜索散列的搜索字词,而无法获取原始值

答案 2 :(得分:0)

在SQL中使用AES加密和解密来实现对加密数据库字段的搜索。语法:-


  

AES_ENCRYPT('Text_to_encrypt','secret_key')

     

AES_DECRYPT('Text_to_decrypt','secret_key')


  • 首先使用sql中的AES加密将数据加密并存储在DB中

    INSERT INTO User (fname,email,mobile) VALUES (AES_ENCRYPT('Arun gopan', 'Qwfe345dgfdg'), AES_ENCRYPT('arun123@fa.com', 'Qwfe345dgfdg'),'9658475577');


  • 现在,您可以在sql中使用AES DECRYPT查询数据库以执行搜索操作。

    SELECT AES_DECRYPT(fname,'Qwfe345dgfdg'), AES_DECRYPT(email,'Qwfe345dgfdg') FROM User WHERE AES_DECRYPT(fname,'Qwfe345dgfdg') LIKE '%Arun%';