如何对加密的列数据进行排序?
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 中所做的那样。以上是关于如何对加密的列数据进行排序?的主要内容,如果未能解决你的问题,请参考以下文章