2015년에 Password Hashing Competition에서 우승한 암호화 세계의 떠오르는 강자(?) 인 argon2를 소개한다.
왜 bcrypt가 아니라 argon2 를 써야 하는가에 대해서는 여기를 참조.
pip install argon2-cffi
from argon2 import PasswordHasher
ph = PasswordHasher()
hash = ph.hash("<hash할pw값을입력>")
hash #이런식으로 hash된다
>>>'$argon2id$v=19$m=102400,t=2,p=8$tSm+JOWigOgPZx/g44K5fQ$WDyus6py50bVFIPkjA28lQ'
# verify
ph.verify(hash, "<비교할pw의 string값>")
>>> True
# oudated된 hash인지를 확인할수 있다
ph.check_needs_rehash(hash)
>>> False
ph.verify(hash, "t0t411ywr0ng")
cryptographic fuction은 bytes strings에서만 작동하므로, .encode()
로 데이터를 바꿔주는 것을 잊지말자.
class LogInView(View):
def post(self, request):
data = json.loads(request.body)
try:
ph = PasswordHasher()
user = User.objects.get(username=data['username'])
user_pw = user.password
if ph.verify(user_pw.encode(), data['password'].encode()):
return JsonResponse({'success':True})
else:
return JsonResponse({'success':False}, status=401)
except exceptions.VerifyMismatchError:
return HttpResponse(status=401)
except exceptions.VerificationError:
return HttpResponse(status=401)
except KeyError:
return HttpResponse(status=400)