首页 > 解决方案 > 如何使用 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'(这不起作用),但我不确定如何将其他想法合并到我的代码中。

有人知道我如何用我的代码尝试这些想法吗?

标签: phpmysqllaravelencryptionbinary

解决方案


你不能用你正在使用的工具解决问题。

Laravel 的加密是随机的(这对安全性来说是一件好事,但它对于搜索操作来说是不切实际的)。

查看CipherSweet,它以可与任何数据库驱动程序一起使用的方式实现可搜索加密。目前没有在任何地方编写 Eloquent ORM 集成,但它应该很容易实现。


推荐阅读