2013-01-11 4 views
1

파이썬의 암호화 패키지를 사용하여 장고 웹 사이트의 MySQL 데이터베이스에서 암호화 된 암호를 유지합니다.파이썬 암호화 패키지 : 암호에 여분의 문자를 입력 할 수 있습니다.

user.password = crypt(request.POST['password'], netid) 
user.save() 

가 로그인에 올바른 암호를 확인하려면 :

암호화하려면 비밀번호를 지속/:이 버그이지만, 여기에 내가 사용하고 코드입니다 있는지 확실하지 않습니다

if crypt(password, email) == user.password: 
# Grant acccess to the user's profile, etc. 

문제는 다음과 같습니다. 변수 netid = [email protected]request.POST['password'] = 'ABC123abc'을 사용하여 암호를 암호화하면 올바르게 작동합니다. 그러나 로그인을 시도 할 때 trailing_chars가 유효한 문자열 일 수있는 'ABC123abc[trailing_chars]' 암호를 사용하면 여전히 로그인 할 수 있습니다. 왜이 기능입니까? 그것은 큰 보안 구멍이있는 것처럼 보입니다.

+2

해싱 암호를 포함한 모든 사용자/암호 항목을 처리하는 기본 [Django auth] (https://docs.djangoproject.com/en/dev/topics/auth/)을 사용하지 않는 이유는 무엇입니까? – jvc26

답변

6

우선 이 아닌은 토굴 용 소금 (두 번째 인수)으로 이메일 주소를 사용해야합니다. 이것은 안전하지 않습니다. 당신은 좋은 무작위 소금을 선택해야합니다.

전통 암호문의 경우 소금은 [a–zA–Z0–9./] 집합에서 선택한 두 자리 문자열입니다. 이 버전의 crypt는 8 개의 입력 문자 만 받아들이고 8 번째 이후의 모든 입력 문자를 버립니다. 그것이 당신이 여기서보고있는 것입니다.

현대의 암호화 구현은 기존의 암호화보다 훨씬 강력한 암호화 알고리즘을 지원하지만 모든 플랫폼에서 사용할 수있는 것은 아닙니다. 새로운 알고리즘은 또한 입력을 8 문자로 제한하지 않습니다.

더 나은 알고리즘 중 하나를 사용하려면 (지원하는 플랫폼을 사용하는 경우) 특별한 형식의 소금을 제공해야합니다. 이것은 함수가 대체 알고리즘을 사용하고자 함을 인식하는 방법입니다.

glibc에서 지원하는 추가 알고리즘 (따라서 GNU/Linux에서 사용 가능)에 대해서는 crypt manpage의 "Glibc Notes"섹션을 참조하십시오.

그런데 암호를 확인할 때 수동으로 소금을 추출 할 필요가 없습니다. 암호화 된 암호는 이미 소금으로 시작하기 때문에 crypt의 두 번째 인수로 user.password (email 아님)을 전달하십시오. 이것은 이전 알고리즘을 사용하든 새로운 알고리즘을 사용하든 관계없이 작동합니다. 알고리즘을 선택하고 정확한 형식으로 소금을 생성하는 것은 암호를 확인할 때가 아니라 암호를 암호화 할 때만 수행하면됩니다.

+0

감사합니다. 매우 유익합니다. –