Php 使用datatables的Laravel:搜索加密数据

Php 使用datatables的Laravel:搜索加密数据,php,laravel,performance,encryption,datatable,Php,Laravel,Performance,Encryption,Datatable,我在使用Laravel的datatables时遇到了一个很大的问题。我有一个模型,它有3个值,由setter/getter自动加密(使用Crypt) 我使用datatables来呈现表,方法是: return datatables()->of(Patient::query()) ->addColumn('name_surname', function($row){ return $row->name.' '.$row->su

我在使用Laravel的datatables时遇到了一个很大的问题。我有一个模型,它有3个值,由setter/getter自动加密(使用Crypt)

我使用datatables来呈现表,方法是:

    return datatables()->of(Patient::query())
        ->addColumn('name_surname', function($row){
            return $row->name.' '.$row->surname;
        })
        ->make(true);
将模型传递到datatable有3种方法:

  • 按查询(患者::查询())
  • 按集合(患者::全部())
  • 由DB facade提供
  • 第三个不解密数据。 该查询速度极快,但不允许搜索数据 收集允许任何东西,但它的超慢。(5-7秒/表格绘制)。 我也尝试过缓存它,但它没有给我带来任何帮助

    我怎样才能在不导致性能下降的情况下搜索加密数据

    顺便说一句。 这就是我用于setter加密和getter解密的特性

    public function getAttribute($key)
    {
        $value = parent::getAttribute($key);
        if (in_array($key, $this->encryptable)) {
            $value = Crypt::decrypt($value);
        } return $value;
    }
    
    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encryptable)) {
            $value = Crypt::encrypt($value);
        }
        return parent::setAttribute($key, $value);
    }
    
    更新(2019-06-02):有一个独立的库实现了这一点,称为。此外,还有一个Laravel适配器

    这已经在一篇题为(恰当地)的博客文章中得到了回答。您可以通过问自己以下问题来扩展其内容:

  • 我加密的数据有多敏感?
    • 如果它受到损害,人们的生活可能会受到严重影响:使用KDF作为盲指数
    • 不太好:使用HMAC作为盲索引
  • 在SELECT查询中只需要精确匹配,还是可以容忍冲突,只要冲突数量不太多?
    • 从未发生冲突:使用完整的KDF/HMAC输出
    • 冲突确定:截断(节省存储空间),用作Bloom过滤器
  • 一旦您回答了这些问题,您将确保您的加密提供密文完整性(例如,libnaude的
    crypto\u secretbox()
    ,每条消息都有一个随机的nonce),您将使用HMAC/PBKDF2和不同的键,生成明文的盲索引,与密文一起存储(即单独的列)

    与其查询密文,只需重建盲索引,然后解密结果。这为您提供了快速、可靠的搜索操作,同时仍然提供语义安全的数据加密