인증은 회원가입과 로그인을 생각하면 편하다. 누구인지 확인하는 절차
인증으로 들어왔으니 그 유저에 대한 권한을 허락하는 것
회원 가입 할때 비밀번호를 암호화 해서 DB에 저장하는걸 bcrypt로 진행
위에서 설명한 단방향 해시 함수도 몇가지 취약점이 존재한다.
Salting과 Key Stretching을 구현 한 해시 함수 중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들어진 해시 함수이다.
설치
pip install bcrypt
선언
import bcrypt
passwd = '1234567'
encode진행하면 type이 str -> byte로 바뀐다
>>> passwd.encode('utf-8')
b'1234567'
decode 진행하면 byte -> str로 바뀜
>>> a=passwd.encode('utf-8')
>>> a.decode('utf-8')
'1234567'
bcrypt.gensalt()는 바이트 형식이다
>>> bcrypt.gensalt()
b'$2b$12$u3h5n4YsXmF9SiFoxgEFJe'
입력 받은 패스워드를 바이트로 바꾸고 salt를 붙힌다 그리고 다시 decode하여 str로 변환시킨 후 DB에 넣어주면 된다.
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
create 위에 패스워드를 암호화 한 후 DB에 저장한다.
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
User.objects.create(
name = name,
email = email,
password = hashed_password,
phone = phone
)
>>> c = '1234567'
>>> d = '123'
>>> hashed_password = bcrypt.hashpw(passwd.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
>>> bcrypt.checkpw(c.encode('utf-8'),hashed_password.encode('utf-8'))
True
>>> bcrypt.checkpw(d.encode('utf-8'),hashed_password.encode('utf-8'))
False