gpt4 book ai didi

mysql - Laravel Crypt - 比较值

转载 作者:可可西里 更新时间:2023-11-01 06:49:54 25 4
gpt4 key购买 nike

鉴于 Laravel 的 Crypt 总是添加盐,因此没有两个相同加密的实例是相同的。

通常,这很好,因为我可以比较两者的解密版本。但是,如果我想搜索在数据库中加密的值怎么办?

假设我有一张用户表,我想加密电子邮件地址。现在我想通过电子邮件 test@email.com 找到某人。

我该如何着手为此编写查询?我不能只是 Crypt::encrypt($email) 和搜索,因为 encrypt 的这次迭代将与数据库中的不同。

编辑

目前,我唯一能想到的就是获取所有内容,并通过它们进行过滤:

$match = User::all()->filter(function($record) use($email) {
$field = $record->email['email'];

if(Crypt::decrypt($field) == $email) return $record;
});

但这太糟糕了。我不想搜索所有内容。

最佳答案

如前所述,您不能。如果您不需要优化它,您给出的答案就是实现它的方式。

如果您确实需要在不完全损害加密值的情况下对其进行优化,并且分析发现过滤器返回和处理的数据量是延迟的主要原因,您可以执行以下。

向表中添加一个新字段,该字段将存储散列的一个子集。根据唯一电子邮件地址的数量,您可以调整此子集的大小。注意:越小越好,因为您使用这种方法会泄露有关加密值的一些信息。例如,如果您存储电子邮件地址的 1 字节散列,则加密的熵减少了约 8 位。

当您查询时,首先创建电子邮件哈希的子集并放置一个 where 子句以仅返回那些行。

所有这些都假设散列函数比解密步骤成本更低。如果你想增加它的大小,这种方法将要求你重新计算所有哈希子集,因此选择一个有意义地提高性能的大小,不会过度损害加密并且很可能不需要随着你的增长而改变是很重要的.

注意:在这种情况下,您不应该使用像 MD5 这样的直接散列。不是因为它易受碰撞影响,而是因为 key 空间非常小。如果性能很重要并且您存储了大量数据,那么您就可以对自己进行 DOS 攻击,攻击者可以借此创建大量电子邮件地址,这些地址都散列到同一子集。要加强解决此问题,请使用 HMAC使用 key 函数。

请记住,除非您有真正的性能原因需要增加复杂性,否则不要

关于mysql - Laravel Crypt - 比较值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24881849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com