웹상에서 유저의 데이터를 외부에서 함부로 접근할 수 없도록 원본데이터를 가공하는 것을 말한다.
단방향 : 한번 암호화되면 다시 원래상태로 되돌릴수 없다. input되어온 데이터를 다시 암호화해서 비교는 가능하지만 원본상태로 되돌리기 어렵다.
양방향 : 대칭키 알고리즘을 사용해서 암호화 했지만 풀어서 보는 것이 가능하다.
python에서 제공하는 암호화 라이브러리로 유저가 입력한 값을 해시값으로 바꿔주는 hashpw, 유저가 입력한 비밀번호와 해시값으로된 비밀번호를 비교해서 Trure, False를 리턴하는 checkpw기능을 제공한다.
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)
crypted_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
Account(
name = data['name'],
email = data['email'],
password = crypted_password.decode('utf-8')
).save()
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)
if Account.objects.filter(name=data['name']).exists():
user = Account.objects.get(name=data['name'])
if bcrypt.checkpw(data['password'].encode('utf-8'), user_password.encode('utf-8')):
return HttpResponse(status = 200)
값은 checkpw의 값은 맞다면 True, 틀리다면 False로 리턴되기 때문에 조건문으로 사용하고 알맞은 response값을 return한다.