django过滤器和django加密域

yvgpqqbh  于 2022-11-26  发布在  Go
关注(0)|答案(4)|浏览(205)

下面的模型有一个first_name字段。

from django.db import models
from encrypted_fields import EncryptedCharField

class Customer(models.Model):
    first_name = EncryptedCharField(max_len=30)

我使用django-encrypted-fields来加密存储在我的db中的数据。截至目前(我认为)我不能过滤结果。
我要这样做:

customers = Customer.objects.all().filter(first_name__icontains="George") #George exists as customer

但我得到的是一个空名单,有什么办法可以绕过这个问题吗

kmb7vmvb

kmb7vmvb1#

从设计上讲,这是不可能的。存储在数据库中的数据是一个不透明的blob,因此即使您将字段设置为包含“乔治”的纯文本,该文本也不在数据库中。
关于再次加密数据并将存储的数据库值与之进行比较的想法很有趣,但它仍然行不通。数据是用随机的initialization vector加密的,因此不能简单地重现结果。

可能的解决方案

不过,你可以通过哈希来解决这个问题。例如,如果你的用户提供了一个电子邮件和密码来进行身份验证,但你希望电子邮件在数据库中以加密的方式存储,那么除了加密的电子邮件外,你还可以存储一个哈希版本的电子邮件。然后你可以重新生成哈希并查询,只有在找到用户后才能解密电子邮件。

vdzxcuhz

vdzxcuhz2#

这不是立即可以实现的,因为存储在底层数据库中的数据是二进制格式的密文。为了支持这一点,您需要像上面提到的Kevin这样的可搜索字段,但是这些字段在大型生产用例中非常慢,因为它们需要在执行搜索之前解密。
还要注意的是,django-encrypted-fields已经过时了,因为它使用了Google Keyczar,而Google Keyczar已经被Google Tink所取代。我也遇到了同样的情况,创建了https://github.com/script3r/django-tink-fields来满足我的需要。

v1l68za4

v1l68za43#

在某些情况下,解决方案/解决方法可能是在Python中进行比较,而不是使用Django ORM,因此,而不是:

return BlockedIP.objects.filter(ip_address=ip_address).exists()

请执行以下操作:

return ip_address in BlockedIP.objects.values_list('ip_address', flat=True)

请注意,如果您有许多记录,这可能效率很低。

oknwwptz

oknwwptz4#

是的,你可以使用django-searchable-encrypted字段,但需要注意几点:

  • 您需要添加可搜索的字段,然后在这些字段上自行加密
  • 更新无法正常工作,您需要同时更新加密字段和可搜索字段
  • 在之后添加可搜索字段意味着需要遍历对象并将值设置为自身(不要引用我的话,但它就是这样出现的)。

https://pypi.org/project/django-searchable-encrypted-fields/

相关问题