【问题标题】:How to search for encrypted value using Laravel Eloquent ORM?如何使用 Laravel Eloquent ORM 搜索加密值?
【发布时间】:2019-03-31 08:52:03
【问题描述】:

我有一个 Laravel 代码库,记录在插入 Mysql 数据库之前已加密。使用Crypto methods of the php-encryption library 完成加密。如果我想根据其中一个加密值查找记录,则循环遍历所有记录即可:

$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;
}

但这不会返回任何东西。于是我又找到this SO question,建议加'0x',用BIN2HEX()HEX()包起来,或者在它前面加x(比如x'abcd')。

我尝试添加 '0x'(这不起作用),但我不确定如何将其他想法合并到我的代码中。

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

【问题讨论】:

    标签: php mysql laravel encryption binary


    【解决方案1】:

    你无法用你正在使用的工具解决问题。

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

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

    【讨论】:

    • 感谢您的提示。我实际上并没有使用 Laravel 加密,而是使用 php-encryption 库的加密(添加到问题中)。知道选择使用该加密是否可行吗?
    • 经过一些研究和多次加密同一事物的简单测试后,我确实发现我无法加密一个值并搜索该加密值。所以我要么需要遍历这些值,要么使用 Ciphersweet。我看看我会走哪条路。
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2012-11-03
    • 2021-07-03
    • 2014-09-08
    • 2015-06-26
    • 2013-07-07
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多