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



我在使用Laravel的DataTables时遇到了一个很好的问题。我有一个具有3个值的模型,该值会自动加密(使用crypt)setter/getter。

我正在使用DataTables渲染表:

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

有3种将模型传递到数据表的方法:

  1. by query(datient :: query())
  2. 通过收集(病人:: all())
  3. DB立面

第三个未解密数据。查询是超快的,但不允许通过数据搜索收集允许所有内容,但非常慢。(5-7秒/表格)。我还尝试过缓存它,但它没有为此带来任何帮助

如何搜索加密数据而不会导致性能降低?

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

UPDATE(2019-06-02):有一个独立的库,可以实现此功能,称为Ciphersweet。此外,Laravel适配器正在工作中。

这已经在题为(适当)的博客文章中得到了回答,该文章使用PHP和SQL构建了可搜索的加密数据库。您可以通过问自己以下问题来扩展其内容:

  1. 我加密的数据有多敏感?
    • 人们的生活受到损害,可能会受到严重影响:使用KDF进行盲目索引。
    • 不是很:将HMAC用于盲目索引。
  2. 我们是否只需要在选定查询中进行精确匹配,或者如果碰撞不能太多?
    • 永远不会发生碰撞:使用完整的KDF/HMAC输出。
    • 碰撞确定:截断(保存在存储中),用作绽放过滤器。

回答了这些问题后,您将确保您的加密提供Ciphertext的完整性(例如,每条消息随机nonce libsodium的crypto_secretbox()),并且您将使用使用HMAC/PBKDF2>键要生成盲目索引纯文本以与ciphertext一起存储(即单独的列)。

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

最新更新