2014-03-19 5 views
0

Django가 데이터베이스에 저장하기 전에 PASSWORD 필드를 암호화하는 방법처럼 auth.User 모델의 first_name, last_name, email_id와 같은 모든/atleast 필드를 암호화 할 수있는 방법이 있습니까? Django 사용자 모델 필드 암호화


내 해결 방법 :

I에 유래에 & 몇 가지 질문이있는에 따라이 규정에 의해, 우리 자신의 참고 MyUser 모델 우리가 원하는 방식으로 정의 & 기본 BaseUser 모델을 상속 할 수있을 것입니다 문서를 겪었

&을 암호화하는 사용자 지정 문자 필드는 문자의 암호를 해독합니다.

내 응용 프로그램에 문제가있어, 문자 인 필드에 쉽게 액세스 할 수있는 검색 옵션을 제공했습니다. 그런 Char Fields를 모두 암호화하면 검색 옵션을 쿼리하는 것이 어렵습니다.

예 : ABCD, ABCDE, ABC가 데이터베이스에있는 문자열 인 경우 & BC가있는 모든 항목을 알고 싶다면 아무 결과도 나오지 않습니다. 이유는 각각 ABCD, ABCDE, ABC는 다른/고유 한 문자열로 암호화합니다 (PyCrypto에서 제공하는 AES 암호화를 사용하고 있습니다). 또한 BC는 ABCD, ABCDE, ABC 사이의 유사성이없는 고유 한 문자열로 암호화됩니다 (명백한 이유는 키 길이가 32 인 AES 알고리즘을 사용하고 있기 때문입니다). 그리고 제가 작성한 쿼리는

MyModel.objects.filter(first_name__icontains='BC') 

중 하나를 반환하지 않습니다. (예, 대소 문자를 구별하지 않아야합니다.)

[참고 : 사용자 지정 필드에서 "to_python", "get_db_prep_value"와 같은 모든 필수 메서드를 추가했으며 lookup 메서드도 시도했습니다. 하지만 실제로 문제는 각 문자열이 동일한 길이의 AES에서 고유 한 문자로 암호화 됨]

Django를 처음 사용하기 때문에 Django 개발자처럼 느껴지지 않을 수도 있습니다. 위의 두 가지 질문 중 하나에 대한 대답을 알고 싶습니다. 내가 대답을 얻지 않으면 나는 교착 상태에 빠져있다. 미리 감사드립니다, 그러나 내게 친절하시기 바랍니다 & 답변.

+0

이와 비슷한? https://github.com/defrex/django-encrypted-fields –

+0

@Bibhas 그렇습니다. Keyczar도 내가 암호화 할 수있는 방법 중 하나입니다. 나는 PyCrypto의 AES 구현을 사용하고있다. (나는 머리를 꺾고 코드를 변경할 준비가되어있다.) 질문에서 설명했듯이 텍스트를 쿼리 할 수 ​​있습니까? – Arun

+0

은 설명서에 설명되어 있지 않습니다. 시도해 볼 수 있습니다. 그냥 하나의 필드를 구현하고 테스트하십시오. –

답변

0

필드를 암호화하면 부분 일치를 쿼리하는 데 유용한 답을 찾지 못했습니다. 그래서 파이썬에서이 작업을 수행해야했습니다 (다른 방법은 없습니다).

이 해결 방법은 우리가 작업하고있는 데이터베이스가 작은 경우에만 잘 작동하며, 그렇지 않으면 성능 비용이 발생합니다.

데이터베이스에서 모든 튜플을 쿼리하려면 파이썬을 사용하여 부분 일치를 수행하십시오.

result = [] 
temp_result = MyModel.objects.all() 
for temp in temp_result: 
    if query.lower() in temp.first_name.lower(): 
     result.append(temp) 

또는 이와 유사한 것. 나는 이것이 쿼리의 무례한 방법이라는 것을 알고 있지만, 주어진 조건에 대해서 이것은 유일한 해결책이었다.