【问题标题】:Search encrypted data in Database在数据库中搜索加密数据
【发布时间】:2016-02-28 10:37:47
【问题描述】:

所以我在我的表中加密了记录,我想搜索这些记录。问题是,当我再次搜索并加密我的搜索词时,它会再次对其进行加密,生成不同的随机字符串。

有没有办法加密数据,这样当再次加密相同的数据时,它会产生与第一次加密时相同的字符串?

示例:我正在使用 CI 加密库的默认设置

$data = "ABC";
$stored_data = $this->encryption->encrypt( $data );

$search = "ABC";
$search_data = $this->encryption->encrypt( $data );

if( $search_data == $stored_data ){
  var_dump("Found it");
}else{
  var_dump("No results");
}

上面产生了不同的随机字符串,所以没有办法搜索加密数据。这种问题有解决办法吗

【问题讨论】:

  • 您不想加密,而是要散列,对吗? CI 的加密通过身份验证提供语义安全。您可以在构造过程中使用 pass array("mode" => "ecb") 作为参数,但我认为您不应该这样做。
  • 无法搜索正确加密的数据......就是这样。如果密文总是相同的,它就不安全了。因此,无论您尝试做什么,它都不会以这种方式工作,您需要考虑另一种解决方案。
  • 谢谢,我想唯一的解决方案是不加密需要搜索的字段..
  • 有一种方法可以做你想做的事,但仅限于“这个确切的字符串存在吗?y/n”:paragonie.com/white-paper/…

标签: php codeigniter encryption codeigniter-3


【解决方案1】:

我知道这已经晚了,但我也遇到了类似的情况。我能看到的唯一解决方案是存储数据的单独散列版本,然后查找。它确实创建了额外的数据存储,但如果您只将它存储在不应该太糟糕的特定字段中。您必须确保在搜索时与存储的 完全匹配 匹配,否则它将不起作用(因此可能值得将您的 Hash 和 Search 值小写以确保)。取决于数据的安全性 - 选择正确的哈希将是关键以及可以处理速度的良好索引。在加密字符串中添加盐也会使您的数据更加安全。

【讨论】:

    【解决方案2】:

    正如 Narf 在他的评论中所说,“正确加密的数据是不可搜索的”。要完全理解为什么会这样,请阅读initialization vectors,然后意识到正确实现的加密使用随机初始化向量。

    但是,您可以使用称为 blind indexing 的技术解决此限制,该技术允许在明文的确定性转换上构建 Bloom 过滤器(使用截断的加密哈希函数和/或密钥派生函数),可用于 SELECT 查询。

    如果您正在寻找实现,请查看CipherSweet

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2018-06-03
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多