我如何在Laravel使用像操作符搜索加密数据



我如何在Laravel使用像操作符搜索数据,我已经使用了

encrypt($searchValue); 

Crypt::encryptString($searchValue)

都返回完全加密的数据但我需要的是可搜索的数据比如使用运算符,在这种情况下,名字是加密格式搜索正常文本时返回null


User::where('first_name', 'like', '%' . 'abc' . '%')->get();
//it's return null

当我使用

//searchValue is like only 'ab'
User::where('first_name', 'like', '%' . Crypt::encryptString($searchValue) . '%')->get();
//it's also return null 

我也遇到过这个问题。

我的解决方案是使用Laravel Scout建立一个搜索索引。

根据加密数据的安全策略(以及您正在使用的搜索驱动程序),此解决方案可能不适合。

我正在使用Laravel TNT搜索驱动程序,它将索引存储在我的服务器上。

<?php
namespace AppModels;
use IlluminateSupportFacadesCrypt;
use LaravelScoutSearchable;
class User extends Model
{
use Searchable;
public function toSearchableArray(): array
{
return [
'id' => $this->id,
'email' => $this->getDecryptedEmail()
];
}
public function getDecryptedEmail(): string
{
return Crypt::decryptString($this->email);
}
}

然后在你的控制器中,或者任何你想要实现搜索功能的地方:

...
public function search(Request $request)
{
return User::search($request->input('email'))->get();
}
...

如果需要进行精确匹配,可以对搜索结果使用filter方法。首先进行搜索应该比过滤大量数据集提供更好的性能。

如果需要,还可以对搜索函数设置约束,例如:

public function search(Request $request)
{
$constraints = User::where('is_active', '=', 1);
$filtered = User::search($request->input('email'))
->constrain($constraints)
->get()
->filter(function ($user) use ($request) {
return $user->getDecryptedEmail() === $request->input('email');
});
}

Crypt::encryptString('abc')每次调用时将输出一个略有不同的字符串。因此,您不能执行以下操作:

User::where('first_name', 'LIKE', '%abc%')->get();
# OR
User::where('first_name', 'LIKE', '%' . Crypt::encryptString('abc') . '%')->get();

如果您加密字符串并将其保存到数据库中,关键是您不能将其视为纯文本,并且通过扩展,无法对其进行搜索。

旁注,你的第一个案例%abc%可能返回一个结果,如果另一个加密字符串有该序列,但它将不是一个可靠的方式来搜索abc的未加密值,所以你不能依赖它。

相关内容

  • 没有找到相关文章

最新更新