TIL - Hashing via bcrypt

Heechul Yoon·2020년 2월 14일
0

LOG

목록 보기
5/62

암호화란?

웹상에서 유저의 데이터를 외부에서 함부로 접근할 수 없도록 원본데이터를 가공하는 것을 말한다.

암호화 종류

단방향 : 한번 암호화되면 다시 원래상태로 되돌릴수 없다. input되어온 데이터를 다시 암호화해서 비교는 가능하지만 원본상태로 되돌리기 어렵다.

양방향 : 대칭키 알고리즘을 사용해서 암호화 했지만 풀어서 보는 것이 가능하다.

bcrypt

python에서 제공하는 암호화 라이브러리로 유저가 입력한 값을 해시값으로 바꿔주는 hashpw, 유저가 입력한 비밀번호와 해시값으로된 비밀번호를 비교해서 Trure, False를 리턴하는 checkpw기능을 제공한다.

bcrypt를 통해서 sign up, sign in기능 구현

sign up

def post(self, request):
        data = json.loads(request.body)
        crypted_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
        try:
           
            Account(
                        name = data['name'],
                        email = data['email'],
                        password = crypted_password.decode('utf-8')
                        ).save()

            return HttpResponse(status = 200)
        except KeyError:
            return JsonResponse({'message':'NEED_MORE_KEY'}, status=400)
        except IntegrityError:
            return JsonResponse({'message':'USER_EXISTS'}, status = 400)
1. request로 들어온 data객체의 password값을 인코드하고 hash값으로 만들어준다.
crypted_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
2. 그리고 hash화 되어진 password를 save()한다.
Account(
                        name = data['name'],
                        email = data['email'],
                        password = crypted_password.decode('utf-8')
                        ).save()

sign in

class LoginView(View): #post가 들어오면 account테이블을 참조해서 같은값이 있으면
    def post(self, request):
        data = json.loads(request.body)

        try:
            if Account.objects.filter(name=data['name']).exists():
                user = Account.objects.get(name=data['name'])
                user_password = user.password

                if bcrypt.checkpw(data['password'].encode('utf-8'), user_password.encode('utf-8')):
                    return HttpResponse(status = 200)
                return HttpResponse(status = 400)
            else:
                return HttpResponse(status = 400)

        except KeyError:
            return JsonResponse({'message':'INVALID_KEYS'}, status=400)

1. 만약 유저가 입력한 name값이 데이터베이스에 exists()한다면 그 값을 데이터베이스 컬럼에서 가져와 user라는 객체에 담아 instance로 만들어준다.
if Account.objects.filter(name=data['name']).exists():
                user = Account.objects.get(name=data['name'])
2. 그리고 유저에게 입력받은 정보의 password를 encode한 값과 데이터베이스에서 가져온 password를 encode한 값을 bcrypt.checkpw에 차례로 넣어준다.
if bcrypt.checkpw(data['password'].encode('utf-8'), user_password.encode('utf-8')):
                    return HttpResponse(status = 200)

값은 checkpw의 값은 맞다면 True, 틀리다면 False로 리턴되기 때문에 조건문으로 사용하고 알맞은 response값을 return한다.

profile
Quit talking, Begin doing

0개의 댓글