Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:在EncryptedCharField(Django扩展)上搜索,这可能吗?_Django_Django Models - Fatal编程技术网

Django:在EncryptedCharField(Django扩展)上搜索,这可能吗?

Django:在EncryptedCharField(Django扩展)上搜索,这可能吗?,django,django-models,Django,Django Models,这可能吗 对于名为“first_name”的EncryptedCharField模型,我注意到在搜索时该字段不会解密。在所有其他用途中,它都很好。这不起作用: if form.is_valid(): cd = form.cleaned_data search_results = MyTable.objects.filter(first_name__icontains=cd['search_term']) crypter = Crypter.Read(settings.ENCRY

这可能吗

对于名为“first_name”的EncryptedCharField模型,我注意到在搜索时该字段不会解密。在所有其他用途中,它都很好。这不起作用:

if form.is_valid():
    cd = form.cleaned_data
    search_results = MyTable.objects.filter(first_name__icontains=cd['search_term'])
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)
这是故意的还是我做错了什么? 谢谢你的帮助

首先加密搜索项,即使是准确的解密值,也不会起作用,因为密码不会与数据库中存储的密码相同。所以这是行不通的:

if form.is_valid():
    cd = form.cleaned_data
    search_results = MyTable.objects.filter(first_name__icontains=cd['search_term'])
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)

当某物被加密时(或者至少当它被正确地加密时),在不知道该值的情况下,不可能获得已加密的值。这意味着,虽然您可以非常快速地检查密码的值,但由于用户已经给了您密码的值,因此很难从加密字符串中找到密码的值。这是主题的一部分


当您通过
MyTable.objects.filter(first\u name=cipher)
搜索say时,您只是在比较加密字符串,这很好。但是,当您尝试
MyTable.objects.filter(first\u name\u icontains=cipher)
时,您要求django对所有值进行解密、比较,然后返回匹配的值。但是,django不能这样做,因为没有人知道解密的first_name字段的值是多少。这是出于设计,因为这意味着即使数据库被破坏,数据也是安全的(这也是为什么你应该注意任何会向你显示密码的网站或组织,因为这意味着他们没有加密数据库中的值)。总的来说,看不到用户密码是一件好事,即使你不同意,为获得良好的安全性付出的代价也很小。

你可以简单地将该值的HMAC散列存储在另一个字段中,然后进行搜索。

因此它确实适用于
first\u name\u istartswith=cd['search\u term']
?我猜这是不可能的,因为在所有其他搜索功能中,值可能首先被加密,然后与数据库中的值进行比较。这至少对精确的有效。老实说,我不确定它如何处理
\u iexact
,因为大多数加密方法将绝对不同地处理
A
A
。是的,这就是它的作用,EncryptedCharField的get_db_prep_value()encrypt是值,to_python()解密。他们使用钥匙沙皇。但是,当我在shell中测试时,使用相同的密钥对值加密两次并不会生成相同的密码。当然,密码总是正确解密的。所以“精确”既不起作用,也不适用。虽然荒谬,但如果我不加密密码并使用部分存储密码作为搜索词,它“工作”。soory的意思是:虽然荒谬,但如果我不加密“搜索词”并使用部分存储密码作为搜索词,它“工作”。我同意你的观点,但我需要加密姓名和个人标识符,并保持对这些值进行搜索和排序的能力,以及使用唯一约束。所有这些似乎都不起作用,也许也不实用。这可能是一个“管理器”问题吗?唯一可以做到这一点的方法是使用CharField,首先保存原始加密的未修改字符串,然后在它之后存储(比如csv格式)您希望能够搜索的每个不同字母组合。所以
foo
将变成
foo,fo,oo
。这样做会大大降低系统的安全性,甚至可以不加密它们。简言之,如果您需要搜索,则无法加密您的值;部分加密值不是完全加密值的中缀。这些都是好的方面。看来我想做的事没有任何用处。我完全删除了加密字段。谢谢不,OP不能对所有数据执行此操作。如果他想搜索数据库中所有的“约翰”,那是不可能的。HMAC仅在搜索完美匹配时有用。