비밀번호 암호화

brian·2022년 5월 20일
0

encoding 과 decoding

encoding : 'str' -> 'byte'
decoding : 'byte' -> 'str'

bcrypt

pip install bcrypt

기본 문법 : bcrypt.hashpw(password, salt)
salt 생성 : bcrypt.gensalt([num])
비밀번호 확인 : bcrypt.checkpw(password, hashed_pw)

회원가입시 비밀번호 암호화

class SignupView(View):
    def post(self, request):

        try :
            signup_data = json.loads(request.body)
            email       = signup_data["email"]
            password    = signup_data["password"]    

            hashed_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

            Accounts.objects.create(
                name         = signup_data["name"],
                email        = email,
                password     = hashed_pw.decode('utf-8'),
                phone_number = signup_data["phone_number"],
                )

            return JsonResponse({"MESSAGE": "SUCCESS"}, status=201)

        except KeyError :
            return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=400)

request.body에 담겨온 데이터를 json.loads로 ditc type으로 캐스팅해서 signup_data에 담는다.

이 중 key 가 "password"인 value를 'password'라는 변수에 담고, bycrypt의 메서드를 활용해서 암호화하는 과정이다.

초기에 입력받은 password 는 str 타입이므로 encoding을 통해 byte 타입으로 바꿔서 활용한다.

이렇게 암호화된 비밀번호를 DB에 저장할 때는 다시 str 타입으로 바꿔줘야 한다(decoding)

로그인시 비밀번호 체크

bcrypt.checkpw(password, hashed_pw)

class LoginView(View):
    def post(self, request):
        
        try :
            login_data = json.loads(request.body)
            email      = login_data["email"]
            password   = login_data["password"]

            account = Accounts.objects.get(email=email)
            if not bcrypt.checkpw(password.encode('utf-8'), account.password.encode('utf-8')) :
                raise ValidationError("INCORRECT_PASSWORD")

            token = jwt.encode( {'account_id': account.id}, settings.SECRET_KEY, settings.ALGORITHM)

            return JsonResponse({"TOKEN": token}, status=201)

		except KeyError :
            return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=400)

        except ValidationError as verr :
            return JsonResponse({"MESSAGE": verr.message}, status=401)

중간에 jwt 라는 녀석이 나오는데 토큰발급에 관한 라이브러리 이므로 별도 포스팅으로 다루도록 하자.

0개의 댓글