これは可能ですか?Django:EncryptedCharField(django-extensions)で検索することは可能ですか?
"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)
これは 'first_name__istartswith = cd ['search_term']'で動作しますか? –
他のすべての検索機能では、値がおそらく最初に暗号化され、次にデータベースの値と比較されるため、これは不可能です。これは少なくとも '_exact'のために働くでしょう。ほとんどの暗号化方法は絶対に 'A'と' a'を完全に違った方法で扱うので、正直なところ、 '_iexact'でどのように動作するのか分かりません。 –
はい、これは、EncryptedCharFieldのget_db_prep_value()が値を暗号化し、to_python()が復号化します。彼らはkeyczarを使用します。しかし、私がシェルでテストするとき、同じキーを使用して値を2度暗号化すると、同じ暗号が生成されません。もちろん、暗号は常に正しく復号化されます。だから、__exactはうまく動作せず、__istartswithも動作しませんでした。 私は暗号を暗号化せず、保存された暗号の一部を検索語として使用すると "うまくいきます"と言います。 – erikvw