암호를 업데이트 할 때 사용자가 동일한 암호를 두 번 사용할 수 없도록 사용자 암호 기록을 구현하려고합니다. 장고 인증 모듈을 사용하고 있습니다.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가 관리자 패널에서 비밀번호를 생성하는 동안 추가로 랜덤 화기를 사용하는지, 버그를 발견했거나, 뭔가를 놓친 것 같은지 알 수 없습니다.
미리 감사드립니다.
나는 make_password에 대해 약간 염려하고있다. 약 100ms의 지속 시간 동안 무작위 소금으로 HMAC를 반복하고 해시로 소금을 저장한다. 'PBKDF2','Rfc2898DeriveBytes','password_hash','Bcrypt','passlib.hash' 또는 유사한 함수와 같은 함수를 사용하는 것이 더 낫습니다. 요점은 공격자가 무차별 한 암호를 찾기 위해 상당한 시간을 소비하게하는 것입니다. – zaph
참고 : NIST는 현재 암호 암호가 만료되지 않도록 제안합니다. 그것은 우리가 컴퓨터를 사용했던 옛날 방식에 대한 오래된 생각이었습니다.오늘날 침해의 징후가 없으면 사람들이 암호를 변경하도록하지 마십시오. 참조 : [NIST Digital Identity Guidelines] (http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63b.pdf) – zaph
NIST의 협조에 동의하지만 클라이언트가이 기능을 요구합니다. 로그인 후 또는 비밀번호를 잃어 버린 후에 만 "기능"에 액세스 할 수 있으므로이 기능이 무차별 공격과 관련 될 수는 없습니다. (공격자가 로그인 한 경우 이미 너무 늦기 때문에이 스크립트에 보안 기능을 추가해도 아무런 변화가 없습니다.) – ljungi