带数据表的Laravel:搜索加密数据

时间:2017-12-20 18:21:58

标签: php laravel performance encryption datatable

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

我正在使用数据表来渲染表:

    return datatables()->of(Patient::query())
        ->addColumn('name_surname', function($row){
            return $row->name.' '.$row->surname;
        })
        ->make(true);

有三种方法可以将模型传递给datatable:

  1. 通过查询(Patient :: query())
  2. 收集(Patient :: all())
  3. by DB facade
  4. 第三个不解密数据。 查询是超快的,但不允许搜索数据 收藏允许一切,但它超慢。 (5-7秒/桌面抽奖)。 我也试过缓存它,但它没有给我的惊喜带来任何帮助

    如何在不降低性能的情况下搜索加密数据?

    顺便说一下。 这就是我用于设置加密和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);
    }
    

1 个答案:

答案 0 :(得分:3)

在一篇标题为(恰当)Building Searchable Encrypted Databases with PHP and SQL的博文中已经回答了这个问题。您可以通过问自己以下问题来扩展其内容:

  1. 我加密的数据有多敏感?
    • 如果受到损害,人们的生命可能会受到严重影响:使用KDF作为盲目索引。
    • 不是很好:使用HMAC作为盲目索引。
  2. 我们是否只想在SELECT查询中使用完全匹配,或者只要它们不是太多就可以容忍冲突?
    • 无冲突:使用完整的KDF / HMAC输出。
    • 碰撞OK:截断(保存在存储中),用作Bloom过滤器。
  3. 一旦你回答了这些问题,你将确保你的加密提供密文完整性(例如libsodium的crypto_secretbox(),每条消息有一个随机的随机数),你将使用HMAC / PBKDF2和< strong>一个不同的密钥,用于生成明文的盲目索引,以存储在密文(即单独的列)旁边。

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