在数据库中搜索加密数据



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

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

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

上面产生了不同的随机字符串,因此无法搜索加密数据。这类问题有解决方案吗?

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

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

然而,您可以使用一种名为盲索引的技术来解决这一限制,该技术允许Bloom过滤器(由截断的加密哈希函数和/或密钥派生函数制成)在明文的确定性转换上构建,这可以在SELECT查询中使用。

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

最新更新