下面的模型有一个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
但我得到的是一个空名单,有什么办法可以绕过这个问题吗
4条答案
按热度按时间kmb7vmvb1#
从设计上讲,这是不可能的。存储在数据库中的数据是一个不透明的blob,因此即使您将字段设置为包含“乔治”的纯文本,该文本也不在数据库中。
关于再次加密数据并将存储的数据库值与之进行比较的想法很有趣,但它仍然行不通。数据是用随机的initialization vector加密的,因此不能简单地重现结果。
可能的解决方案
不过,你可以通过哈希来解决这个问题。例如,如果你的用户提供了一个电子邮件和密码来进行身份验证,但你希望电子邮件在数据库中以加密的方式存储,那么除了加密的电子邮件外,你还可以存储一个哈希版本的电子邮件。然后你可以重新生成哈希并查询,只有在找到用户后才能解密电子邮件。
vdzxcuhz2#
这不是立即可以实现的,因为存储在底层数据库中的数据是二进制格式的密文。为了支持这一点,您需要像上面提到的Kevin这样的可搜索字段,但是这些字段在大型生产用例中非常慢,因为它们需要在执行搜索之前解密。
还要注意的是,
django-encrypted-fields
已经过时了,因为它使用了Google Keyczar,而Google Keyczar已经被Google Tink所取代。我也遇到了同样的情况,创建了https://github.com/script3r/django-tink-fields来满足我的需要。v1l68za43#
在某些情况下,解决方案/解决方法可能是在Python中进行比较,而不是使用Django ORM,因此,而不是:
请执行以下操作:
请注意,如果您有许多记录,这可能效率很低。
oknwwptz4#
是的,你可以使用django-searchable-encrypted字段,但需要注意几点:
https://pypi.org/project/django-searchable-encrypted-fields/