Kou*_*sha 6 mysql encryption laravel laravel-4
鉴于Laravel Crypt总是添加盐,因此没有相同加密的两个实例是相同的.
通常,这很好,因为我可以比较两者的解密版本.但是,如果我想搜索在数据库中加密的值,该怎么办?
假设我有一张桌子,users我想加密电子邮件地址.现在我想通过电子邮件找到某人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;
});
Run Code Online (Sandbox Code Playgroud)
但这太可怕了.我不想搜索所有内容.
正如所描述的,你不能。您给出的答案是如果您不需要优化它,您将实现它的方式。
如果您确实需要在不完全损害加密值的情况下对其进行优化,并且经过分析发现过滤器返回和处理的数据量是延迟的主要原因,则可以执行以下操作。
向表中添加一个新字段,该字段将存储哈希的子集。根据唯一电子邮件地址的数量,您可以调整该子集的大小。注意:越小越好,因为使用这种方法会泄露加密值的一些信息。例如,如果您存储电子邮件地址的 1 字节哈希值,则加密的熵将减少约 8 位。
查询时,首先创建电子邮件哈希的子集并放置一个where子句以仅返回这些行。
所有这些都假设散列函数比解密步骤更便宜。如果您想增加其大小,此方法将要求您重新计算所有哈希子集,因此选择一个能够有意义地提高性能、不会过度损害加密并且很可能不需要随着您的增长而更改的大小非常重要。
注意:在这种情况下,您不应该使用 MD5 等直接哈希值。不是因为它容易发生碰撞,而是因为密钥空间太小。如果性能很重要并且您存储大量数据,那么您就会向自己发起 DOS 攻击,攻击者会创建大量电子邮件地址,并将这些地址全部散列到同一子集。要解决此问题,请使用带有密钥的HMAC函数。
请记住,除非您有真正的性能原因需要增加复杂性,否则不要这样做