django过滤器和django-encrypted-fields

时间:2014-05-26 13:14:10

标签: django encryption django-filter

我有以下具有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来加密存储在我的数据库中的数据。截至此(我认为)我无法过滤结果。我想这样做

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

但我得到一个空列表。我有办法绕过那个吗?

3 个答案:

答案 0 :(得分:2)

这在设计上是不可能的。存储在数据库中的数据是不透明的blob,因此即使您将字段设置为包含“George”的明文,该文本也不在数据库中。

关于再次加密数据并将存储的数据库值与之比较的想法很有意思,但它仍然无效。数据是使用随机initialization vector加密的,因此您无法简单地重现结果。

可能的解决方案

您可以通过散列来解决问题。例如,如果您的用户提供了用于身份验证的电子邮件和密码,但您希望将电子邮件加密存储在数据库中,则除了加密版本之外,您还可以存储电子邮件的哈希版本。然后,您可以重现哈希并对其进行查询,并且只有在找到您的用户后才能解密该邮件。

答案 1 :(得分:0)

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

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

执行以下操作:

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

请注意,如果您有很多记录,这可能会很无效。

答案 2 :(得分:0)

是的,您可以使用带有一些警告的django-searchable-encrypted字段来做到这一点:

  • 您需要添加可搜索的字段,并在这些字段上自己加密
  • 更新无法正常进行,您需要同时更新加密字段和可搜索字段
  • 在之后添加可搜索字段意味着您需要遍历对象并将其值设置为自身(对此不加引号,但这就是它的显示方式)。

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