我在使用 Laravel 数据表时遇到了一个很大的问题。我有一个模型,它有 3 个由 setter/getter 自动加密(使用 Crypt)的值。
我正在使用数据表来渲染表格:
return datatables()->of(Patient::query())
->addColumn('name_surname', function($row){
return $row->name.' '.$row->surname;
})
->make(true);
有 3 种方法将模型传递到数据表:
- 通过查询(Patient::query())
- 按集合(Patient::all())
- 由 DB 门面设计
第三个不解密数据。
查询速度超快,但不允许搜索数据
集合允许一切,但速度超慢。 (5-7 秒/桌抽奖)。
我也尝试过缓存它,但令我惊讶的是它并没有对此带来任何帮助
如何才能搜索加密数据而不导致性能下降如此之低?
顺便提一句。
这就是我用于 setter 加密和 getter 解密的 Trait
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):有一个独立的库可以实现此功能,称为甜密码 https://ciphersweet.paragonie.com。此外,还有一个 Laravel 适配器正在进行中 https://github.com/paragonie/eloquent-ciphersweet.
这个问题已经在一篇题为(适当)的博客文章中得到了回答,使用 PHP 和 SQL 构建可搜索的加密数据库 https://paragonie.com/blog/2017/05/building-searchable-encrypted-databases-with-php-and-sql。您可以通过问自己以下问题来扩展其内容:
- How sensitive is the data I'm encryptiong?
- 如果受到损害,人们的生活可能会受到严重影响:使用 KDF 作为盲索引。
- 不太好:使用 HMAC 作为盲索引。
- Do we want only exact matches in the SELECT query, or are collisions tolerable provided they aren't too numerous?
- 永远不会发生冲突:使用完整的 KDF/HMAC 输出。
- 碰撞正常:截断(节省存储空间),用作布隆过滤器。
一旦回答了这些问题,您将确保您的加密提供密文完整性(例如 libsodium 的crypto_secretbox()
每条消息都有一个随机数),并且您将使用 HMAC/PBKDF2不同的钥匙生成一个盲索引与密文一起存储的明文(即单独的列)。
无需查询密文,只需重建盲索引,然后解密结果即可。这为您提供了快速、可靠的搜索操作,同时仍然提供语义安全的数据加密。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)