php - 如何使用 Laravel Eloquent ORM 搜索加密值?
问题描述
我有一个 Laravel 代码库,在将记录插入 Mysql 数据库之前对其进行加密。加密是使用php-encryption library 的 Crypto 方法完成的。如果我想根据其中一个加密值查找记录,则遍历所有记录即可:
$records = TheModel::all();
foreach ($records as $record){
if ($record->thefield == $value) { // thefield is decrypted in the Eloquent model definition
print $record->id;
}
}
不幸的是,这不是很可扩展。数据库仍然很小,但增长很快,所以我需要更改此代码以实际执行查询。
所以我尝试了以下代码:
$encryptedValue = \App\Crypt::encryptData($value);
$records = TheModel::where('thefield', $encryptedValue)->get();
foreach ($records as $record){
print $record->id;
}
但这不会返回任何东西。所以我然后发现这个 SO question建议添加'0x'
,将其包装BIN2HEX()
或在它之前HEX()
添加一个x
(如x'abcd'
)。
我尝试添加'0x'
(这不起作用),但我不确定如何将其他想法合并到我的代码中。
有人知道我如何用我的代码尝试这些想法吗?
解决方案
你不能用你正在使用的工具解决问题。
Laravel 的加密是随机的(这对安全性来说是一件好事,但它对于搜索操作来说是不切实际的)。
查看CipherSweet,它以可与任何数据库驱动程序一起使用的方式实现可搜索加密。目前没有在任何地方编写 Eloquent ORM 集成,但它应该很容易实现。
推荐阅读
- php - 已加载 iframe 内容,但很少显示空白页而不是内容
- mesos - API - 获取任务 - 自定义过滤器
- java - 有什么方法可以检查 ObjectInputStream 是否有等待读取的对象?
- mysql - 在 mysql 列中追加值
- oauth-2.0 - 我们可以在 SPA 中将 PKCE + 授权码授予与 SSO 一起使用吗?
- python - 查找重复的单词,仅第一次出现
- azure-synapse - 表上的更新非常慢
- android-studio - Android Studio 无法识别 Flutter 包
- wcf - 具有空用户名和密码的 wcf NetworkCredential
- python - 程序正在接受所有登录名,不确定原因