php - 使用 PHP 在数据库中搜索加密数据

标签 php mysql

我有一个搜索功能,我正在升级以支持 AES 加密,但我终究不知道自己做错了什么。

我正在通过搜索框传递相同的查询,就像我在数据库端加密数据之前所做的那样,并且我没有返回任何 SQL 错误。它每次都只显示零结果。

加密前的数据库示例:

*****************************************************
* Firstname * Surname * Telephone * Email           *
*****************************************************
* Bob       * Smith   * 0193847   * bob@me.com      *
* Jane      * McBean  * 0584383   * jane@mail.com   *
*****************************************************

加密数据库示例:

*****************************************************
* Firstname * Surname * Telephone * Email           *
*****************************************************
* 2d1c5749  * 82559acc* fa3bc41c5 * 759d082559      *
* 13c5802a  * 070e76f8* 70e76f8fe * feaa0ac1635c    *
*****************************************************

以前的工作(非加密)版本:

if(isset($_POST["search"]) && strlen($_POST["search"]) > 3) {
$Search = filter_var($_POST["search"], FILTER_SANITIZE_STRING);
$Search = strip_tags($Search);
$Search_String = filter_var($_POST["search"], FILTER_SANITIZE_STRING);
$Search = "%$Search%";

    $Search_String = filter_var($Search_String, FILTER_SANITIZE_STRING);
            if(strlen(empty($Search_String))){ $error[] = 'The search string is empty';}

if(!isset($error)) {
$Search_list = $dbconn->prepare("SELECT sql_calc_found_rows
                                  event_candidate.id AS candidate_id,
                                  event_candidate.firstname,
                                  event_candidate.surname,
                                  event_candidate.telephone,
                                  event_candidate.email,
                                  FROM event_candidate
                                  WHERE CONCAT_WS(' ', event_candidate.firstname, event_candidate.surname, event_candidate.telephone, event_candidate.email) LIKE ?
                                  "); 
    $Search_list->execute(array($Search));

不返回任何内容的新代码:

    $Search = filter_var($_POST["search"], FILTER_SANITIZE_STRING);
    $Search = strip_tags($Search);
    $Search_String = filter_var($_POST["search"], FILTER_SANITIZE_STRING);
    $Search = "%".$Search."%";

$Search_list = $dbconn->prepare("SELECT sql_calc_found_rows
                              event_candidate_demo.id AS candidate_id,
                              event_candidate_demo.firstname,
                              event_candidate_demo.surname,
                              event_candidate_demo.telephone,
                              event_candidate_demo.email,
                              FROM event_candidate_demo
                              WHERE CONCAT_WS(' ', AES_DECRYPT(event_candidate_demo.firstname, UNHEX(:key)), AES_DECRYPT(event_candidate_demo.surname, UNHEX(:key)), AES_DECRYPT(event_candidate_demo.telephone, UNHEX(:key)), AES_DECRYPT(event_candidate_demo.email, UNHEX(:key))) LIKE ':search'
                              "); 
$Search_list->bindParam(':key', $Site_Key, PDO::PARAM_INT);
$Search_list->bindParam(':search', $Search, PDO::PARAM_STR);
$Search_list->execute();

因此,如果我搜索与 Bob 相关的任何内容,它会加载正确的记录,但我对加密数据执行相同操作,它始终返回零结果。

我不确定是 AES_DECRYPT 导致问题还是切换到 BindParam

最佳答案

加密后的数据变得类似于随机噪声。它也永远不会相同(如果你的加密不好)

您的问题有两种解决方案:

  1. 从数据库中获取每一行,解密,比较。 <-- 花很多时间
  2. 存储散列键,并比较散列值。 <-- 安全性较低,更容易猜测数据

您将不得不根据敏感性、速度需求和风险评估从两害中选其一。

假设您选择选项 2,您将有两列用于名字

event_candidate.firstname,
event_candidate.firstname_hash,

firstname 字段中,您存储加密的名称。
firstname_hash 中存储名字的哈希值

您可以使用类似hash('sha512', strtolower($unencrypted_name)) 的东西来加密散列。

然后你可以从中选择数据

$select = hash('sha512', strtolower($unencrypted_name));

$Search_list->bindParam(':search', $select, PDO::PARAM_STR);

但是,您只能进行精确匹配。整个名字需要匹配,多余的空格可能会阻碍匹配。

还有更安全的哈希方法,使用 hmacs 和其他方法。我提供的示例只是为了说明基本概念。您将必须执行自己的风险分析和数据敏感性。

关于php - 使用 PHP 在数据库中搜索加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132818/

相关文章:

php - 为什么类自动加载对于使用 "repositories.package"所需的包不起作用?

php - 使用 php 和 shorty 对表格进行排序

mysql - 对表进行排序,但将行组放在一起

php artisan 迁移: [PDOException]could not find driver

mysql - Oracle ADF - Tomcat 6.x - MySql 5.5 - java.lang.AbstractMethodError

php - Magento:如何在我的 Magento 扩展程序中包含 “debug flag”?

php - 如何在 PHP 中解码 JSON 字符串?

php - HTML表单使用PHP写入MySQL

mysql - 未知列的where子句错误

php - 在循环数据中选择选项时显示 div