【问题标题】:How to implement search on encrypted database fields如何实现对加密数据库字段的搜索
【发布时间】:2019-04-15 03:25:16
【问题描述】:

我正在为我的 Web 应用程序使用 PHP 和 MySql。我有一个要求,我需要加密用户特定信息,比如姓名和电子邮件 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%";

任何建议表示赞赏

【问题讨论】:

  • 我记得这个问题是在过去 2 或 3 个月内提出的。我会尝试再次找到它。
  • @RaymondNijland 感谢您宝贵的时间。请注意,我需要使用 LIKE 运算符 (%name%) 实现搜索
  • @HeraldCharley 不建议对要执行搜索的数据进行加密。我错过了上下文。为什么要加密名称?
  • @new_user 我有一个表,用于存储用户特定信息,例如姓名、电子邮件、出生日期。出于安全目的,我的客户不想将该信息存储为纯文本并希望加密该数据。但是我的 Web 应用程序具有搜索功能(自动建议),它使用名称作为查询参数来搜索数据库。任何可能的解决方案??????
  • 在这种情况下,我建议您加密该用户信息表中除名称之外的所有内容。如果那是不可能的。一个可能的解决方案是查询所有数据并在应用层写入 stringContains 逻辑。

标签: php mysql search encryption


【解决方案1】:

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

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

    // 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);
    

    如果有其他选择,请提出建议。

【讨论】:

  • 如果您有数百万甚至数十亿条记录怎么办?
  • @RaymondNijland 就我而言,我有 200 万条记录
【解决方案2】:

您可能有多种选择,有些容易,有些则不然

  • 搜索/关键字段通常未加密存储以解决此问题(您显然不希望这样)
  • 正如已经建议的那样 - 扫描整个表,解密每条记录都可以,但可能不可行
    • 您可以使用静态IV 实现确定性加密,对搜索词进行加密并搜索已经加密的值。知道静态 IV 会降低(有时甚至会破坏)安全级别
    • 您可能会查看专为加密数据操作而设计的 homomorphic encrytion,但不知道您在做什么,这可能是实施自己的加密的非常陡峭且容易出错的路径(即使是经验丰富的专业人士也不推荐)。我还不敢进这扇门。
    • 您可以存储索引值(可能与加密值一起)的加密哈希(例如 sha256)。然后你可以只搜索一个散列的搜索词而无法恢复原始值

【讨论】:

    【解决方案3】:

    在 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%';

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2021-01-14
      • 2014-07-11
      • 1970-01-01
      • 2023-01-26
      • 2010-11-08
      • 2012-09-18
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多