如何对加密的列数据进行排序?

Posted

技术标签:

【中文标题】如何对加密的列数据进行排序?【英文标题】:How to sort encrypted column data? 【发布时间】:2021-08-18 11:33:35 【问题描述】:

我已经完成了对加密和非加密列的搜索,但对于排序非加密字段排序成功,但加密字段未排序。

加密列:名字、姓氏、电子邮件

加密函数

// Encrypt Data
function encrypted_data($decrypted)
    if($decrypted != NULL)
        $method = 'aes-256-cbc';
        // Must be exact 32 chars (256 bit)
        $salt = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
        $password = substr(hash('sha256', $salt, true), 0, 32);
        // IV must be exact 16 chars (128 bit)
        $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
        $encrypted = base64_encode(openssl_encrypt($decrypted, $method, $password, OPENSSL_RAW_DATA, $iv));
        return $encrypted;
     else 
        return "";
    

搜索代码

if(isset($_POST['search']) && isset($_POST['search']['value']) && !empty($_POST['search']['value']))

    $search_keyword = trim($_POST['search']['value']);
    $encrypted = encrypted_data($search_keyword);
    
    $search_query = "AND id like '%$search_keyword%' OR pin_local_id like '%$search_keyword%' OR firstname like '%$encrypted%' OR lastname like '%$encrypted%' OR email like '%$encrypted%'";

    $sql .= $search_query;
    $count_sql .= $search_query;

订购代码

if(isset($_POST['order'][0]['dir']))

    $db_orderby = $_POST['order'][0]['dir'];

    if( isset($_POST['order'][0]['column']) && $_POST['order'][0]['column'] == 1 ) 
        $db_field_name = 'ID';
        $sql .= " order by $db_field_name $db_orderby ";
     else if( isset($_POST['order'][0]['column']) && $_POST['order'][0]['column'] == 2 ) 
        $db_field_name = 'pin_local_id';
        $sql .= " order by $db_field_name $db_orderby ";
     else if( isset($_POST['order'][0]['column']) && $_POST['order'][0]['column'] == 3 ) 
        $db_field_data = $_REQUEST['columns'][3]['data'];
        $db_field_name = 'firstname';
        $sql .= " order by $db_field_name $db_orderby ";
     else if( isset($_POST['order'][0]['column']) && $_POST['order'][0]['column'] == 4 ) 
        $db_field_name = 'lastname';
        $sql .= " order by $db_field_name $db_orderby ";
     else if( isset($_POST['order'][0]['column']) && $_POST['order'][0]['column'] == 5 ) 
        $db_field_name = 'email';
        $sql .= " order by $db_field_name $db_orderby ";
    
 else 
    $sql .= " ORDER BY ID ASC ";

【问题讨论】:

您希望加密列的顺序是什么? @NigelRen ASC 和 DESC 都根据帖子请求 您所说的加密字段未排序,它当前显示的顺序是什么? 不完全确定对加密数据进行排序是否明智。当然它是出于某种原因加密的,因此不应该用于排序之类的事情。 @NigelRen $_POST['order'][0]['dir'] 发布 ASC 和 DESC 字符串以对列数据进行排序。目前所有非加密数据都在排序,但加密数据未正确排序 【参考方案1】:

如果数据在php中加密,则不能使用mysql进行排序,因为MYSQL会按照加密的base64而不是原始值对数据进行排序。 MYSQL 永远不会暴露于原始的解密值,因此永远无法基于它进行排序。

您需要从Mysql中检索加密数据,在PHP中解密,然后根据解密数据的值使用usort手动对数组进行排序。

【讨论】:

实际上,我们可以通过使用 Order Preserving 加密来欺骗 MySQL 对列进行排序,就像在 CryptDB 中所做的那样。

以上是关于如何对加密的列数据进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何同时对熊猫数据框中的列进行排序[重复]

如何对数据框中有日期的列进行排序?

如何使用laravel中其他表中的列对数据进行排序

如何禁用对数据表中的列进行排序

如何在Mysql查询中通过PHP对加密数据进行排序

如何按包含文本和数字的列标题对数据框进行排序[重复]