繁体   English   中英

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

[英]Best way to search encrypted data inside MySQL

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

我现在的问题是,除了存储可搜索的哈希数据版本之外,是否有一种有效的方法来搜索加密数据? 例如,每个数据有两列:first_name_encrypted,first_name_hashed。

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

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

我现在的问题是,除了存储可搜索的哈希数据版本之外,是否有一种有效的方法来搜索加密数据? 例如,每个数据有两列:first_name_encrypted,first_name_hashed。

关闭,但没有雪茄。 请参阅: 如何使用盲目索引搜索加密信息

例如,使用经过身份验证的加密库而不是仅使用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的盲目索引优于简单散列。

另外:使用经过身份验证的加密 这是不容谈判的。

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

在您给出的示例中,了解您为什么以名字抓取用户的背景以及您的整体安全问题是有帮助的...

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

这是一个Web应用程序,您主要关心的是通过网络传输用户的个人信息吗? 在用户的PC和服务器之间发送数据时使用加密连接(例如“https”)。

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

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

如果这对您没有帮助,可能会提供更多关于您要完成的内容以及原因的背景信息。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM