Laravel - LIKE运算符,用于搜索加密值

时间:2015-06-01 14:03:20

标签: php sql laravel encryption sql-like

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

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

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

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

Crypt::encrypt("Text") 

每次调用时,上述内容很少生成相同的值,因此您的数据库中不会存储相同的值。

<强>建议

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

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

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

答案 1 :(得分:0)

  

我在这里做什么错了?

Laravel的加密已正确实施,这意味着每封邮件都是randomized

随机化对实现可搜索加密提出了挑战:永远不会两次获得相同的密文。幸运的是,有一个workaround for making encryption searchable

  1. 使用authenticated encryption加密每条记录。
  2. 分别存储纯文本格式的HMAC-SHA2 / BLAKE2(使用与加密密钥不同的密钥)。您可以截断哈希函数输出。这称为盲索引
    • 此外,您可以存储各种切片的多个哈希函数或纯文本的转换。 (例如,后4位数字,名字的首字母+姓氏等)
    • 每个盲索引都应有一个唯一的键。
    • 您可以将多个字段组合成一个盲指标。
    • 对于低熵输入(例如布尔字段),never use them in isolation
    • 对于严格敏感的字段,您也可以使用慢速KDF函数(PBKDF2,Argon2id),尽管这不是绝对必要的。
  3. 在执行SELECT查询时,重新计算盲索引,而不是尝试根据密文本身进行选择。

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