在MySQL

时间:2016-04-15 19:14:20

标签: php mysql encryption encryption-symmetric

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

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

关闭,但没有雪茄。请参阅:How to search encrypted information with a blind index

一个例子,使用authenticated encryption library而不是仅仅使用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的盲目索引优于简单散列。

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

答案 1 :(得分:0)

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

在您给出的示例中,了解您通过名字抓取用户的原因以及您的整体安全问题是有帮助的。

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

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

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

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

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

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