如何实现对加密数据库字段的搜索

mpbci0fu  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(416)

我使用php和mysql作为我的web应用程序。我有一个要求,我需要加密用户特定的信息,如姓名和电子邮件地址。

$name = "Kevin John";
$encryptionMethod = "AES-256-CBC";
$secretHash = "25c6c7ff35b8879b151f2136cd13574";
$enc_name = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);

我正在数据库中存储此加密名称。但真正的问题是我需要根据用户的名字搜索他们example:-

$qry = "select * from users where name like %john%";

有什么建议吗

mi7gmzs6

mi7gmzs61#

你可能有几种选择,有些简单,有些不简单
搜索/关键字字段通常未加密存储以解决此问题(您显然不希望这样)
如前所述,扫描整个表,解密每个记录都可以,但可能不可行
您可以使用静态iv实现确定性加密,对搜索的项进行加密,并搜索已加密的值。知道static iv正在降低(有时会破坏)安全级别
您可能会看到专门为加密数据上的操作设计的同态加密,但不知道您在做什么,这可能是实现自己的加密非常陡峭和容易出错的路径(即使是经验丰富的专业人员也不建议这样做)。我还不敢穿过这扇门。
您可以存储加密哈希(例如。g。sha256)的索引值(可能沿着加密值)。然后,您可以只搜索散列的搜索项,而不必重新编码原始值

1cklez4t

1cklez4t2#

不建议对要搜索的数据进行加密。
您可以选择不加密要搜索的字段。
或者你可以获取所有的数据,解密和搜索,如果行包含你想要的应用层(我不建议这种方法)。

// Pseudocode
$searchTerm = 'john';
$allNamesQuery = 'select * from users'; 
$allNamesData = execQuery($allNamesQuery);
$suggestions = [];
foreach($allNamesData as $row){
    $row = decryptNameFromRow($row);
    if(contains($row['name'], $searchTerm))
       array_push($suggestions, $row);
}
print_r($suggestions);

如果有其他选择,请提出建议。

o7jaxewo

o7jaxewo3#

在sql中使用aes加密和解密来实现对加密db字段的搜索。syntax:-
aes\u encrypt('text\u to\u encrypt','secret\u key')
aes\u decrypt('text\u to\u decrypt','secret\u key')
首先在sql中使用aes加密将数据加密并存储在db中 INSERT INTO User (fname,email,mobile) VALUES (AES_ENCRYPT('Arun gopan', 'Qwfe345dgfdg'), AES_ENCRYPT('arun123@fa.com', 'Qwfe345dgfdg'),'9658475577'); 现在您可以在sql中使用aes decrypt查询db以执行搜索操作。 SELECT AES_DECRYPT(fname,'Qwfe345dgfdg'), AES_DECRYPT(email,'Qwfe345dgfdg') FROM User WHERE AES_DECRYPT(fname,'Qwfe345dgfdg') LIKE '%Arun%';

相关问题