//查询条件
if(isset($_GPC['username'])){
$where .= " AND AES_DECRYPT(UNHEX(username),'$rid') LIKE :key";
$whereArray[':key'] = '%'.$_GPC['username'].'%';
}

//mysql 直接解码
$data['data'] = pdo_fetchall("select *,AES_DECRYPT(UNHEX(username), '$rid') as username,AES_DECRYPT(UNHEX(mobile), '$rid') as mobile FROM " . tablename($r_config['mysql']['propose']) . " $where order by id desc LIMIT " . ($data['currentPage'] - 1) * $data['currentCount'] . ',' . $data['currentCount'], $whereArray);

//php解码
foreach ($data['data'] as $k => $v) {
$data['data'][$k]['username'] = DataMaskingDecrypt($v['username'],$rid);
$data['data'][$k]['mobile'] = substr_replace(DataMaskingDecrypt($v['mobile'],$rid), '****', 3, 4);
}

//数据插入

/*数据重组加密 S*/
$data['username'] = DataMaskingEncrypt($data['username'],$rid);
$data['mobile'] = DataMaskingEncrypt($data['mobile'],$rid);
/*数据重组加密 E*/

/*方法*/
//脱敏 解密
//在用php函数hex2bin()把16转换成字符串时,如果输入的16进制数据有误,16进制字符串长度不是偶数位导致转换失败。16进制转换成字符串失败时Hexadecimal input string must have an even length问题可以用以下代码解决。
function DataMaskingDecrypt($data,$key = ''){
$SecretKey = !empty($key) ? trim($key) : $GLOBALS['_W']['config']['setting']['authkey'];
if(empty($data) || empty($SecretKey)){
return false;
}
//被加密的数据是偶数,十六进制会warning报错,判断是偶数,不能使用hex2bin方法
$checkStr = strspn($data, '0123456789abcdefABCDEF');
if (strlen($checkStr) % 2) {
return openssl_decrypt(base64_encode(pack("H*", $data)), 'aes-128-ecb', $SecretKey );
} else {
return openssl_decrypt(base64_encode(hex2bin($data)), 'aes-128-ecb', $SecretKey );
}
}

//脱敏 加密
function DataMaskingEncrypt($data,$key = ''){
$SecretKey = !empty($key) ? trim($key) : $GLOBALS['_W']['config']['setting']['authkey'];
if(empty($data) || empty($SecretKey)){
return false;
}
return bin2hex(base64_decode(openssl_encrypt($data,'aes-128-ecb', $SecretKey )));
}

 

参考文档:https://blog.csdn.net/qq_34701838/article/details/117171656