Laravel - LIKE操作符搜索加密值



我正试图在我的Laravel应用程序中实现一个搜索模块,可以按名称过滤用户。为了保护用户,'name'列的行在DB上进行了加密。我面临的问题是,下面的查询总是返回0个结果。

在搜索数据库之前,我正在加密搜索输入值。

$patients = DB::select( DB::raw("SELECT * FROM patient WHERE name LIKE '%".Crypt::encrypt($searchText)."%';"));

我哪里做错了?

Crypt::encrypt("Text") 

上面的代码很少会在每次调用时生成相同的值,因此您不会在DB中存储相同的值。

不要加密用户名,除非你真的需要。如果您必须加密名称,请尝试以下操作:

$patients = DB::select("SELECT * FROM patient WHERE name = '".Crypt::encrypt($searchText)."'");

您的加密值将区分大小写,因此将列排序改为latin1_general_cs

我哪里做错了?

Laravel的加密是正确实现的,这意味着每条消息都是随机的!

随机化给实现可搜索加密带来了一个挑战:你永远不会得到两次相同的密文。幸运的是,有一种解决方法可以使加密成为可搜索的。

  1. 使用经过验证的加密对每个记录进行加密。
  2. 单独存储明文的HMAC-SHA2/BLAKE2(与加密密钥不同的密钥)。您可以截断哈希函数的输出。这被称为盲索引
    • 此外,您可以存储明文的各种切片或转换的多个哈希函数。(例如,最后4位数字,首字母缩写+姓氏等)
    • 每个盲索引应该有一个不同的键。
    • 可以将多个字段组合成一个盲索引。
    • 对于低熵输入(例如布尔字段),永远不要单独使用它们。
    • 对于高度敏感的字段,您也可以使用慢KDF函数(PBKDF2, Argon2id),尽管这不是严格必要的。
  3. 在执行SELECT查询时重新计算盲索引,而不是尝试基于密文本身进行选择。

这可能听起来很多,但在实践中,CipherSweet实现了所有的底层机制,并且对于大多数PHP开发人员来说应该足够容易使用。(如果事实并非如此,请在Github上提交错误;我们希望它是这样的

最新更新