Laravel 与数据表:搜索加密数据

2024-03-06

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

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

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

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

  1. 通过查询(Patient::query())
  2. 按集合(Patient::all())
  3. 由 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。您可以通过问自己以下问题来扩展其内容:

  1. How sensitive is the data I'm encryptiong?
    • 如果受到损害,人们的生活可能会受到严重影响:使用 KDF 作为盲索引。
    • 不太好:使用 HMAC 作为盲索引。
  2. 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(使用前将#替换为@)

Laravel 与数据表:搜索加密数据 的相关文章

  • 解析错误:语法错误,意外的 T_RETURN [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 遇到这个问
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为
  • 检查字符串是否是哈希值

    我正在使用 SHA 512 来散列我的密码 当然还有盐 我认为我想要的不可能 但无论如何我们还是要问一下 有没有办法检查字符串是否已经是 SHA 512 或其他算法 哈希值 当用户登录时 我想检查他的密码 如果它仍然是纯文本 则应将其转换为
  • Cakedc.users => 总是重定向到主页

    我在新的 Cakephp 安装上使用插件 CakeDC Users 我有两个控制器 PagesController php CardsController php Pages 有 1 个操作 Beta 它是主页 Cards 有两个操作 索引
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • yii2 中的自动完成

    在 Yii2 中 我希望当用户开始输入时 我的输入字段之一能够自动完成 下面是我的代码 它使用Jui Autocomplete 这是行不通的 当我打印我的数组时 我就像 Array 1 gt abc 2 gt xyz 4 gt pqr
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 如何在CentOS 5.3上安装php-mongodb?

    我已经在我的 VPS 上安装了 mongoDB 效果很好 现在我想安装 php 驱动程序以使 php 与 mongoDB 一起工作 我跟着蒙戈安装 http www php net manual en mongo installation
  • 逐行加密/解密文件?

    我对加密还很陌生 我正在尝试让逐行加密器工作 我需要能够在应用程序运行期间将加密行附加到文件中 而不仅仅是一大堆加密所有内容并保存 不过我玩得很开心 这是我的加密器 在我自己多次尝试失败后被无耻地窃取 class Encryption pr
  • Composer 无法获取 github

    今天 我尝试通过运行来安装 Laravelcomposer create project laravel laravel 5 1 myproject prefer dist我收到此错误 Could not fetch https api g
  • 付款成功后保存到数据库(paypal)

    我试图找出在客户使用 paypal 支付商品费用后将数据 之前以表单提交 保存到数据库的最佳方法 沿着这个过程的一些事情 1 在实际网站上填写表格 gt 2 登录 Paypal gt 3 立即付款 PayPal gt 4 数据已插入数据库
  • 如何在同一 PHP 页面上多次使用 mysqli fetch_assoc() 和准备好的语句?

    有没有办法启用fetch assoc 在同一页上多次使用准备好的语句 data conn gt prepare SELECT FROM some table WHERE id data gt bind param i id data gt
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • Swift 使用哪种通用排序算法?它在排序数据上表现不佳

    我一直在挑选和探索 Swift 标准库sort 其函数为Array类型 令我惊讶的是 我注意到它在已经排序的数据上表现不佳 对数组进行排序Int打乱顺序似乎比对已经排序的同一个数组进行排序快 5 倍 对已打乱顺序的对象数组进行排序比对已按排
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • 我可以让 swagger-php 在查询字符串上使用数组吗?

    我使用 Swagger php 当我定义查询字符串上的参数时 它可以是一个数组 但据我所知 它不支持这种查询字符串 https api domain tld v1 objects q 1 q 5 q 12 我相信这会被设定in the co

随机推荐

  • 将字典转换为namedtuple或其他类似可散列字典的Pythonic方法?

    我有一本字典 比如 d a 1 b 2 c 3 d 4 我想将其转换为命名元组 我当前的方法是使用以下代码 namedTupleConstructor namedtuple myNamedTuple join sorted d keys n
  • UserManager.Update(user) 方法不是线程安全的

    我正在尝试使用控制器中的 UserManager 更新用户 就在我更新用户之前 对外部服务的调用会触发一个 Webhook 该 Webhook 也会使用 UserManager 尝试更新同一用户 但这是一个不同的请求和应用程序的不同部分 w
  • 基础上的全高柱

    我正在使用 Foundation 5 Framework 需要创建 3 个相同高度的列 第二列包括 2 个面板 我需要将所有列拉伸到全高 在第二列中只有第二个面板拉伸到全高 任何想法 我不想为此使用块网格 My code div class
  • 准备好的陈述如何运作?

    我正在编写一些数据库例程 并且正在使用准备好的语句 我的环境是带有 PHP5 的 PDO 据我所知 准备好的语句主要提供性能优势 以及一些辅助优势 例如不必手动 SQL 转义输入数据 我的问题是关于性能部分 下面有两个 getPrice 函
  • 使用 PHP 进行 oAuth(适用于 google api)

    如何在 PHP 中使用 oAuth 我无法使用 pecl 安装 oauth 类 因为我使用的是共享托管 I found http code google com p oauth php http code google com p oaut
  • 带有 istream& 参数的函数 C++

    我希望我的程序使用下面的 readFile 函数读取文件 我试图找出如何使用 istream 参数调用函数 该函数的目标是通过接收文件名作为参数来读取文件 include
  • 基于线的热图或二维线直方图

    我有一个合成数据集 其中包含 1000 个不同阶的噪声多边形和 sin cos 曲线 我可以使用 python seaborn 将其绘制为线条 由于我有很多重叠的线 我想绘制某种线图的热图或直方图 我尝试过迭代列并聚合计数以使用 seabo
  • 检查是否可以在另一个数组中找到所有项目

    我需要检查一个数组中的所有项目是否可以在另一个数组中找到 也就是说 我需要检查一个数组是否是另一个数组的子集 Example var array 1 2 5 7 var otherArray 1 2 3 4 5 6 7 8 比较上面这两个数
  • LINQ 相当于Where 子句中的 SQL IsNull(..,.)

    在以下 OUTER JOIN LINQ 查询中 我在Where如果右侧行为空 则子句 如果 c CustomerID 与外连接中的 ord CustomerID 不匹配 Question 如果下面的 ord price 为 null 我该如
  • 添加字体后 Heroku Rails 资产管道无法预编译

    我正在尝试向我的 Rails 应用程序添加字体 这就是我所做的 添加字体到 app assets fonts SCSS font face font family LigatureSymbols src font url LigatureS
  • Markdown 中的 VS Code Latex 语法

    我目前正在使用 pandoc markdown 编写文档 因此使用 Latex 语法 在编写时如何获得 Latex 支持 自动完成 语法突出显示等 md file Latex Workshop 扩展适用于 tex文件 但我找不到添加文件类型
  • 在 WPF 中设置电话号码的文本框格式

    我在 WPF 窗口中有一个 DataGrid 如何在 DataGrid 中以 999 999 9999 的格式显示电话号码字符串列 DataGrid 中的电话号码列使用 CellTemplate 中的 TextBlock 和 CellEdi
  • 如何在java中将模式dd-MMM-yy的字符串日期值转换为模式dd/MM/yyyy的日期对象

    I have String dateAsString 15 May 84 我想将其转换为 Date date 15 05 1984 第一次尝试 new SimpleDateFormat dd MM yyyy format new Date
  • 如何在python中将jenkins作业配置config.xml转换为YAML格式以使用jenkins-job-builder?

    詹金斯工作建设者 http ci openstack org jenkins job builder 是一个很好的工具 可以帮助我维持工作YAML文件 参见示例配置 http ci openstack org jenkins job bui
  • Google Play Console:丢失了上传 APK 所需的上传密钥 [重复]

    这个问题在这里已经有答案了 我失去了我的上传密钥这是在 Google Play Console 上上传 Android APK 文件所必需的 尝试使用新钥匙 但由于指纹不匹配 因此不起作用 但是 我启用了 Google 的 应用程序签名 因
  • python 将ascii字符转换为有符号8位整数

    这感觉应该很简单 但我一直找不到答案 在 python 脚本中 我从 USB 设备读取数据 USB 鼠标的 x 和 y 移动 它以单个 ASCII 字符形式到达 我可以使用 ord 轻松转换为无符号整数 0 255 但是 我希望它作为有符号
  • “const”的使用是教条性的还是理性的?

    在 Delphi 中 您可以通过传递参数来加速代码const e g function A const AStr string integer or function B AStr string integer 假设两个函数内部都有相同的代
  • jinja2:渲染模板而不扩展

    如何在不扩展的情况下渲染模板 我有简单的渲染器 我想在发现这个请求是ajax后只渲染目标数据 我的模板 extends base html load i18n block extrahead endblock extrahead block
  • 超级开发模式重新编译后未检测到更改

    我设置了新的 Eclipse 工作区并从 SVN 下载了项目 我启动了超级开发模式 gwt 2 7 0 chrome 浏览器 当尝试重新编译时 它显示 跳过编译 因为没有输入文件已更改 它在旧工作区中运行良好 但在新工作区中则不然 我使用相
  • Laravel 与数据表:搜索加密数据

    我在使用 Laravel 数据表时遇到了一个很大的问题 我有一个模型 它有 3 个由 setter getter 自动加密 使用 Crypt 的值 我正在使用数据表来渲染表格 return datatables gt of Patient