【问题标题】:Search filter on encrypted data in MySQLMySQL中加密数据的搜索过滤器
【发布时间】:2018-03-21 10:26:41
【问题描述】:

查询说明:假设我有一个数据库表,它以加密形式存储所有用户的数据。我有一个管理员可以搜索用户数据的功能。现在的问题是,管理员将在文本框中输入普通文本,我必须根据管理员的输入过滤用户列表(在每次文本更改时)。因此,与此同时,我有一堆加密形式的数据,我必须根据管理员输入的普通文本对其进行过滤。

到目前为止我想出的解决方案是,我首先解密所有数据,然后应用过滤器。但我很想知道,如果我的数据库中有数百万条记录,那么当前的方式似乎无用且效率低下。

谁能帮助我以最有效的方式搜索加密数据?

任何帮助将不胜感激!

谢谢。

【问题讨论】:

  • 加密关键字
  • @mewc:每次文本更改时,加密值都可能不同。
  • 您是如何加密/解密数据的?通过AES_ENCRYPT/AES_DECRYPT还是通过php编码?
  • @RonakThakkar,加密整个数据库不是一个好主意,你应该只加密必要的数据。

标签: php mysql database encryption filter


【解决方案1】:

到目前为止我想出的解决方案是,我首先解密所有数据,然后应用过滤器。但我很想知道,如果我的数据库中有数百万条记录,那么当前的方式似乎无用且效率低下。

您说得对,这不是一个可扩展的解决方案。如果您想深入研究这个问题,请参阅:Building Searchable Encrypted Databases with PHP and SQL

你想做的是:

  1. 使用经过身份验证的加密按原样存储加密数据。
  2. 在密文旁边存储明文的盲索引
    • 盲索引可以是HMAC-SHA256(plaintext, separate_key)
    • 敏感值应改用sodium_crypto_pwhash()hash_pbkdf2()
    • 为节省空间,请截断盲索引并将其视为 Bloom 过滤器。

这为您提供了两全其美的优势:数据加密可以抵抗被动和主动攻击,但也允许在快速 SELECT 查询中使用。

更新(2019 年 3 月 27 日):与其自己构建,不如查看实现此设计的 CipherSweet

【讨论】:

  • 仅仅因为它使用 AES 并不意味着它在安全地使用 AES。 AES 是一种分组密码,它不是自动安全的。 blog.filippo.io/the-ecb-penguinrobertheaton.com/2013/07/29/padding-oracle-attack
  • 你的评论是不合理的。
  • 需要明确的是,如果您在密文旁边使用 HMAC-SHA256(plaintext, separate_key),那么如果相同的明文存储在两个不同的行中,攻击者将能够看到这两行存储相同的值,对吧,即使攻击者无法分辨该值是什么?
猜你喜欢
  • 2021-06-29
  • 2014-04-04
  • 2021-01-14
  • 2017-05-18
  • 1970-01-01
  • 2012-12-18
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多