Php 在MySQL中搜索加密数据的最佳方法

Php 在MySQL中搜索加密数据的最佳方法,php,mysql,encryption,encryption-symmetric,Php,Mysql,Encryption,Encryption Symmetric,在将加密数据保存到MySQL之前,我使用PHP进行加密。我相信从长远来看,这是比使用MySQL的AES_*函数更好的方法 我现在的问题是,除了存储数据的可搜索散列版本外,还有没有一种有效的方法来搜索加密数据?例如,每个数据有两列:first_name_加密、first_name_散列 $hashed_search = myhash('John'); $q = "SELECT * FROM table WHERE first_name_hashed = '$hashed_search'";

在将加密数据保存到MySQL之前,我使用PHP进行加密。我相信从长远来看,这是比使用MySQL的AES_*函数更好的方法

我现在的问题是,除了存储数据的可搜索散列版本外,还有没有一种有效的方法来搜索加密数据?例如,每个数据有两列:first_name_加密、first_name_散列

$hashed_search = myhash('John');    
$q = "SELECT * FROM table WHERE first_name_hashed = '$hashed_search'";

这就是我现在所做的,有更好的方法吗?

通常,您不应该加密存储在需要搜索的数据库中的数据

在您给出的示例中,了解您为什么用名字抓取用户的上下文以及您的总体安全问题是什么将是很有帮助的

$hashed_search = myhash('John');    
$q = 'SELECT * FROM table WHERE first_name_hashed = '.$hashed_search;
这是一个web应用程序,您主要关心的是通过网络未加密传输用户的个人信息吗?在用户PC和服务器之间发送数据时使用加密连接(例如“https”)

您是否担心有人入侵服务器并下载数据库副本?考虑限制个人识别信息的数量。您真的需要存储用户的真实姓名吗

假设您需要存储个人身份识别信息,请考虑使用其他方法从数据库中获取它们的记录,而不是使用个人识别的部分(即不要用“FixStNeNess”抓取它们)。考虑用ID或用户名来抓取用户,这些用户名与他们的真实姓名无关。这将允许您利用索引快速检索记录,并且您可以将他们的个人信息(名字、姓氏、电子邮件、电话等)加密到心底

如果这对你没有帮助,也许可以提供更多关于你想要完成什么以及为什么要这样做的背景

TLDR:试图搜索加密数据是个坏主意。想一想你试图避免的问题,并想出另一个解决方案。

我现在的问题是,除了存储数据的可搜索散列版本外,还有没有一种有效的方法来搜索加密数据?例如,每个数据有两列:first_name_加密、first_name_散列

$hashed_search = myhash('John');    
$q = "SELECT * FROM table WHERE first_name_hashed = '$hashed_search'";
很近,但没有雪茄。请参阅:

例如,使用一个而不是仅仅使用MySQL的内置
AES_*()
功能:

$first_name_hash = hash_hmac('sha256', $firstName, $secretKey);
$stmt = $db->prepare('SELECT * FROM table WHERE first_name_idx = ?');
$result = $db->execute([$first_name_hash])
    ->fetch(PDO::FETCH_ASSOC);
if ($result) {
    $first_name = Crypto::decrypt($result['first_name_encrypted'], $otherSecretKey);
}
基于HMAC-SHA256的盲索引优于简单哈希


另外:使用经过身份验证的加密。这是不可协商的。

如何搜索加密数据?搜索词是什么?这里的加密用例是什么?数据散列后,您只能进行精确匹配,无法进行部分匹配。您搜索的是字符串,需要相应地引用该字符串。理论上,这会给你带来语法错误。是的。。看起来散列到第二列可能是你最好的选择。在加密数据上搜索是不可能的。这是一种加密它在第一位的点。。。就像如果你可以搜索加密数据,那么暴力就非常简单了,对吧?@Quassnoi-Nonce是个好主意,谢谢。因此,我想我们可以安全地使用以性能为代价的整表解密和非非编码精确匹配哈希搜索。您可以为加密列编制索引,加密搜索值,然后进行搜索,而无需进一步的开销。然而,对于所有实际目的,这只适用于精确匹配。例如,搜索大于或小于给定值的名称将不起作用,因为它是按加密顺序进行的,而不是按基础数据的顺序进行的。