这可能吗?
对于名为“first_name”的EncryptedCharField的模型,我注意到当我在其上搜索时该字段不会解密。在所有其他用途中它是好的。这不起作用:
if form.is_valid():
cd = form.cleaned_data
search_results = MyTable.objects.filter(first_name__icontains=cd['search_term'])
这是设计还是我做错了什么? 谢谢你的帮助...
首先加密搜索词,即使确切的解密值也不会起作用,因为密码不会与存储在db中的密码相同。所以这不起作用:
crypter = Crypter.Read(settings.ENCRYPTED_FIELD_KEYS_DIR)
if form.is_valid():
cd = form.cleaned_data
cipher = crypter.Encrypt(cd['search_term'])
search_results = MyTable.objects.filter(first_name__icontains=cipher)
答案 0 :(得分:1)
当某些内容被加密时(或至少在正确完成时),在不知道该值的情况下,无法获得已加密的值。这意味着虽然您可以非常快速地检查说密码的值,但由于用户已经为您提供了密码的值,因此很难从加密字符串中找出密码的值。这是P=NP主题的一部分。
当您通过MyTable.objects.filter(first_name=cipher)
搜索时,您只是比较加密字符串,这很好。但是,当您尝试MyTable.objects.filter(first_name_icontains=cipher)
时,您要求django解密所有值,比较它们,然后返回匹配的值。但是,django不能这样做,因为没有人知道解密的first_name字段的值是什么。这是设计意思,因为这意味着即使数据库受到损害,数据也是安全的(这也是为什么你应该注意任何会向你显示密码的网站或组织,因为这意味着他们没有加密他们的密码。数据库)。总的来说,无法看到用户密码是件好事,即使你不同意,也要付出很小的代价来保证良好的安全性。
答案 1 :(得分:1)
您可以简单地将值的HMAC哈希存储在另一个字段中,然后搜索它。