Php 在数据库中搜索加密数据

Php 在数据库中搜索加密数据,php,codeigniter,encryption,codeigniter-3,Php,Codeigniter,Encryption,Codeigniter 3,所以我的表中有加密的记录,我想搜索这些记录。问题是,当我再次搜索并加密我的搜索词时,它会再次加密,生成不同的随机字符串 有没有一种方法可以加密数据,这样当再次加密相同的数据时,它会产生与第一次加密时相同的字符串 示例:我正在使用CI加密库的默认设置 $data = "ABC"; $stored_data = $this->encryption->encrypt( $data ); $search = "ABC"; $search_data = $this->encryptio

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

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

示例:我正在使用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");
}

上面的代码生成不同的随机字符串,因此无法搜索加密数据。有没有解决这类问题的办法

正如纳夫在评论中所说,“正确加密的数据是不可搜索的”。要完全理解这一点,请继续阅读,然后认识到正确实现的加密使用随机初始化向量

但是,您可以使用一种名为的技术来解决此限制,该技术允许在可用于选择查询的明文的确定性转换上构造Bloom过滤器(由截断的加密哈希函数和/或密钥派生函数构成)


如果您正在寻找一个实现,请查看。

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

您不想加密,但想散列,对吗?CI的加密通过身份验证提供语义安全性。您可以在构建过程中使用pass
array(“mode”=>“ecb”)
作为参数,但我认为这不是您应该做的。正确加密的数据不可搜索。。。事情就是这样。如果密文总是一样的,它就不安全了。因此,无论你想做什么,它都不会以这种方式工作,你需要考虑另一种解决方案。谢谢,我想唯一的解决方案是不加密需要加密的字段。有一种方法可以做你想做的事情,但它非常局限于“这个确切的字符串存在吗?y/n”:很好的建议!也会对我有用..谢谢分享:)