我有以下具有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
但我得到一个空列表。我有办法绕过那个吗?
答案 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/