Django가 bcrypt를 사용하여 암호 생성

2439 단어 bcryptdjango
요구 사항
다른 시스템의 사용자를 관리하기 위해 시스템을 설계(Django)해야 합니다.사용자는 다른 시스템에 로그인하여 진행하고 그곳의 암호는 bcrypt로 검사하기 때문에 Django시스템에서 암호 저장도 bcrypt로 암호화하여 저장해야 한다.
한편, Django는 자체적인 User에서 Password 기능(명문 입력, 암호화 문자열 자동 생성)을 제공했지만 모델에서는 소위 PasswordField를 제공하지 않았다.
따라서, 수요는 어떻게 자신이 실현한 등록 기능에서 명문 암호를 bcrypt로 암호화하여 저장하는가 하는 것이다
설계
이전에는 안전에 대한'전문'지식이 누적되지 않았기 때문에 루트, 보기, 폼 등 구성 요소를 만들기로 결정했지만 자료를 찾는 과정에서 많은 유용한 자료를 발견했다.
그러나 앞당겨 최적화하는 것은 만악의 근원이다. 나는 기술 방안을 중도에 바꾸기로 결정하지 않고 다음 판을 기다렸다가 더욱 전문적인 방안으로 바꾸었다.
창설 루트, 보기, 폼, 템플릿 등 과정은 모두 비교적 간단하기 때문에 군더더기 없이 명문 암호를 어떻게 암호화하는 과정에 중심을 두었다.
bcrypt 다운로드
파이썬 버전의 bcrypt 사이트, 설치 명령: pip install bcrypt이루어지다
다음form의 clean_password() 함수에서 암호화된 문자열을 되돌려줍니다.
import bcrypt

class SignUpForm(forms.Form):
    password1 = forms.CharField(
        required=True,
        widget=forms.PasswordInput(attrs={'placeholder': '    ', 'class': 'input pass'})
    )
    password2 = forms.CharField(
        required=True,
        widget=forms.PasswordInput(attrs={'placeholder': '      ', 'class': 'input pass'})
    )


    def clean_password2(self):
        cleaned_data =  super(SignUpForm, self).clean()
        password2 = cleaned_data.get('password2')

        return bcrypt.hashpw(password2, bcrypt.gensalt())

views에서 값을 받을 때form.cleaned_data['password2']로 암호화된 문자열을 찾을 수 있습니다. 검증 기능은 수요 부분에서 소개를 했고django가 책임을 지지 않아도 됩니다.
배갱
내 django는python3을 기반으로 하는데python2에서 암호화 문자열을 생성하는 과정에 문제가 없지만 python3에서는 다음과 같은 오류를 보고합니다.
Unicode-objects must be encoded before hashing

다음 원인을 찾았습니다.python3에서 문자열strbytes 두 가지 형태가 있기 때문에 변경이 필요합니다.
bcrypt.hashpw(password2.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

또한 bcrypt는 여러 가지 기준이 있는데 우리가 필요로 하는 것은 2a이기 때문에 다음과 같이 바꾸어야 한다.
bcrypt.hashpw(password2.encode('utf-8'), bcrypt.gensalt(prefix=b'2a')).decode('utf-8')

이렇게 하면 정확한 결과를 얻을 수 있다.
결실
패스워드의 값이 bcrypt 암호화된 문자열임을 볼 수 있습니다.
관련 자료
  • 2a버전의bcrypt생성 및 검증
  • 유니코드-objects must be encoded before hashing 오류 처리 자료
  • 문서 작성자: Yarving Liu 문서 링크:http://yarving.historytale.co...저작권 고지: 본 블로그의 모든 기사는 특별 고지를 제외하고 CC BY-NC-SA 4.0 라이센스 계약을 따릅니다.전재는 출처를 밝혀 주십시오!

    좋은 웹페이지 즐겨찾기