2017-11-15 2 views
0

암호를 업데이트 할 때 사용자가 동일한 암호를 두 번 사용할 수 없도록 사용자 암호 기록을 구현하려고합니다. 장고 인증 모듈을 사용하고 있습니다.Django : make_password가 django.auth와 다른 암호를 출력합니다.

사용자가 생성 한 새 암호를 추가 SQL 테이블 my_userpasswordhistory에 저장하면됩니다.

그런 다음 새 암호를 이전 암호와 비교하여 검사 할 수있는 새 PasswordValidator를 만들었습니다. 내가 그렇게하려는 의도는 데이터베이스의 사용자가 이전 암호를 모두 가져 와서 salt을 분리하고 make_password(newpassword, salt)을 실행하는 것입니다.

다음 코드를 참조하십시오 :

pass_list = UserPasswordHistory.objects.all().filter(user=user) 

    for old_pass in pass_list: 
     #split password so we get the hash and the salt 
     split_pass = old_pass.password.split('$') 
     salt = split_pass[2] 
     pw = split_pass[-1] 
     if make_password(password, salt) == old_pass.password: 
      raise ValidationError(
       _('Your new Password needs to be different from your old one!'), 
       code='password_identic' 
      ) 

문제를

오전 데 문제는 어떻게 든 (인터페이스를 통해) 관리자 백엔드에서 장고에 의해 생성 된 암호가 암호와 다른 점이다 make_password()을 사용하여 만듭니다.

내 암호 데이터베이스의 값이

입니다 :은 An 같은 글의 원료 암호를 소금 trlHVdErn23Z를 사용하지만

select password from my_userpasswordhistory; pbkdf2_sha256$36000$trlHVdErn23Z$BAxX9p3o54QGovIWluP3dM7q73HQNZy9VuYOA6rv268=

, 내가 얻을 :

pbkdf2_sha256$36000$trlHVdErn23Z$6WbA/0fUvDi82GjN7lqjdMoaDiaoojGY3A913CGuFBY=

또한 make_password()을 여러 번 실행하면 항상 동일한 (두 번째) 암호 해시가 출력됩니다.

Django가 관리자 패널에서 비밀번호를 생성하는 동안 추가로 랜덤 화기를 사용하는지, 버그를 발견했거나, 뭔가를 놓친 것 같은지 알 수 없습니다.

미리 감사드립니다.

+0

나는 make_password에 대해 약간 염려하고있다. 약 100ms의 지속 시간 동안 무작위 소금으로 HMAC를 반복하고 해시로 소금을 저장한다. 'PBKDF2','Rfc2898DeriveBytes','password_hash','Bcrypt','passlib.hash' 또는 유사한 함수와 같은 함수를 사용하는 것이 더 낫습니다. 요점은 공격자가 무차별 한 암호를 찾기 위해 상당한 시간을 소비하게하는 것입니다. – zaph

+0

참고 : NIST는 현재 암호 암호가 만료되지 않도록 제안합니다. 그것은 우리가 컴퓨터를 사용했던 옛날 방식에 대한 오래된 생각이었습니다.오늘날 침해의 징후가 없으면 사람들이 암호를 변경하도록하지 마십시오. 참조 : [NIST Digital Identity Guidelines] (http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63b.pdf) – zaph

+0

NIST의 협조에 동의하지만 클라이언트가이 기능을 요구합니다. 로그인 후 또는 비밀번호를 잃어 버린 후에 만 ​​"기능"에 액세스 할 수 있으므로이 기능이 무차별 공격과 관련 될 수는 없습니다. (공격자가 로그인 한 경우 이미 너무 늦기 때문에이 스크립트에 보안 기능을 추가해도 아무런 변화가 없습니다.) – ljungi

답변

0

make_password 대신 check_password을 사용해야합니다. (암호, 인코딩)을 django documentation

은 check_password에서

수동으로 데이터베이스에 해시 된 암호에 일반 텍스트 암호를 비교하여 사용자를 인증하려는 경우

, 편의 함수 check_password()를 사용하십시오. 검사 할 일반 텍스트 암호와 확인할 데이터베이스의 사용자 암호 필드의 전체 값을 비교하여 일치하는 경우 True를 반환하고 그렇지 않으면 False를 반환합니다.

+0

해시가 이전 암호와 다르기 때문에 작동하지 않습니다. 암호가 하나 뿐인 경우 제안하는 방법이 작동하지만 이전 암호 범위와 비교하여 새 암호를 확인할 수 있어야합니다. – ljungi

관련 문제