2010-12-01 37 views
1

これは可能ですか?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) 
+0

これは 'first_name__istartswith = cd ['search_term']'で動作しますか? –

+0

他のすべての検索機能では、値がおそらく最初に暗号化され、次にデータベースの値と比較されるため、これは不可能です。これは少なくとも '_exact'のために働くでしょう。ほとんどの暗号化方法は絶対に 'A'と' a'を完全に違った方法で扱うので、正直なところ、 '_iexact'でどのように動作するのか分かりません。 –

+0

はい、これは、EncryptedCharFieldのget_db_prep_value()が値を暗号化し、to_python()が復号化します。彼らはkeyczarを使用します。しかし、私がシェルでテストするとき、同じキーを使用して値を2度暗号化すると、同じ暗号が生成されません。もちろん、暗号は常に正しく復号化されます。だから、__exactはうまく動作せず、__istartswithも動作しませんでした。 私は暗号を暗号化せず、保存された暗号の一部を検索語として使用すると "うまくいきます"と言います。 – erikvw

答えて

1

を(それが適切に行われているとき、あるいは少なくとも)何かが暗号化されている場合、価値を知らなくても、暗号化されている値を獲得することは不可能です。これは、ユーザーがパスワードの値を与えたときに、パスワードの値を非常に迅速に確認できる一方で、暗号化された文字列からパスワードの値を見つけるのは非常に難しいことを意味します。これはP=NPトピックの一部です。

MyTable.objects.filter(first_name=cipher)で検索すると、暗号化された文字列を比較するだけです。これは問題ありません。しかし、MyTable.objects.filter(first_name_icontains=cipher)を試してみると、djangoにすべての値の暗号化を解除し、それらを比較してから一致するものを返すように求めています。しかし、djangoはこれを行うことはできません。なぜなら、解読されたfirst_nameフィールドの値が何であるかを誰も知らないからです。これは、データベースが侵害されてもデータが安全であることを意味する(つまり、パスワードを表示するWebサイトや組織に注意する必要があります。データベース)。全体的に、ユーザーのパスワードを見ることができないことは良いことであり、同意しなくても、良いセキュリティを確保するためには小さな値段です。

+0

私はあなたの意見に同意しますが、私は名前と個人の識別子を暗号化し、これらの値を検索して順序付ける能力とUNIQUE制約を使用する必要があります。すべてはうまくいかず、おそらく実用的ではないようです。これは「マネージャー」問題かもしれませんか? – erikvw

+0

これを行う唯一の方法は、CharFieldを用意し、最初に未処理の暗号化されていない文字列を保存してから、検索できる文字の組み合わせごとに(CSV形式で)保存します。だから 'foo'は' foo、fo、oo'になります。これを行うことで、システムのセキュリティを大幅に、暗号化しない範囲で減らすことができます。要するに、検索が必要な場合は、値を暗号化できません。部分的に暗号化された値は、完全に暗号化された値の中間ではありません。 –

+0

これは良い点です。私が望んでいたものは、どんな有用な方法でもできないようです。私は暗号化されたフィールドを完全に落としました。ありがとう!! – erikvw

1

値のHMACハッシュを別のフィールドに保存して検索するだけでもかまいません。

+0

いいえ、OPはすべてのデータに対してそれを行うことはできません。データベース上のすべての「John」を検索したい場合は不可能です。 HMACは、完璧なマッチを検索する場合にのみ役立ちます。 – ThoriumBR

関連する問題