Laravel Crypt - 比较值
Posted
技术标签:
【中文标题】Laravel Crypt - 比较值【英文标题】:Laravel Crypt - Comparing Values 【发布时间】:2014-09-12 22:43:58 【问题描述】:鉴于 Laravel 的 Crypt
总是添加盐,因此没有两个相同加密的实例是相同的。
通常,这很好,因为我可以比较两者的解密版本。但是,如果我想搜索在数据库中加密的值怎么办?
假设我有一个users
表,我想加密电子邮件地址。现在我想通过电子邮件test@email.com
找人。
我该如何为此编写查询?我不能只是 Crypt::encrypt($email)
和搜索,因为 encrypt
的这个迭代将不同于 DB 中的迭代。
编辑
目前,我唯一能想到的就是获取所有内容并过滤它们:
$match = User::all()->filter(function($record) use($email)
$field = $record->email['email'];
if(Crypt::decrypt($field) == $email) return $record;
);
但这太糟糕了。我不想搜索所有内容。
【问题讨论】:
我认为解决这个问题的唯一方法是使用固定的key
和iv
加密您的数据。我不会很难扩展 Crypt 类来做到这一点。
您可以考虑添加另一列,其中包含您可以比较的电子邮件哈希。
【参考方案1】:
如上所述,您不能。您给出的答案是如果您不需要优化它,您将实现它的方式。
如果您确实需要在不完全损害加密值的情况下对其进行优化,并且已经分析发现过滤器返回和处理的数据量是延迟的主要原因,您可以执行以下操作关注。
向表中添加一个新字段,该字段将存储散列的子集。根据唯一电子邮件地址的数量,您可以调整此子集的大小。注意:越小越好,因为您使用这种方法泄露了一些关于加密值的信息。例如,如果您存储了一个 1 字节的电子邮件地址哈希,您将加密的熵减少了约 8 位。
查询时,首先创建电子邮件哈希的子集并放置where
子句以仅返回这些行。
所有这些都假设哈希函数比解密步骤便宜。如果您想增加它的大小,这种方法将要求您重新计算所有哈希子集,因此选择一个有意义地提高性能、不会过度损害加密并且很可能不需要随着您的增长而更改的大小很重要.
注意:在这种情况下,您不应该使用像 MD5 这样的直接哈希。不是因为它容易发生碰撞,而是因为密钥空间太小了。如果性能很重要并且您存储了大量数据,您就会打开自己的 DOS 攻击,从而攻击者创建大量的电子邮件地址,这些地址都散列到同一个子集。要解决此问题,请使用带有密钥的 HMAC 函数。
请记住,除非您有真正的性能原因需要增加复杂性 - 不要
【讨论】:
以上是关于Laravel Crypt - 比较值的主要内容,如果未能解决你的问题,请参考以下文章