Python

[Python] Bcrypt and Jwt

UnoCode 2020. 7. 14. 19:38

안녕세요

 

이번 시간에는 인증, 인가에 많이 쓰이는 bcrypt와 jwt에 대해서 다루어 보겠습니다.

 

bcrypt를 설치를 안하신 분들은 다음과 같은 명령어로 설치 하시기 바랍니다.

 

pip install bcrypt

bcrypt는 문자열을 해싱해주는 함수인데요.

 

보통 비밀번호를 db에 저장할때 많이 사용합니다.

 

설치가 끝나셨다면

 

python을 켜서

 

import bcrypt를 입력 합니다.

 

>>> import bcrypt

비밀번호도 하나 만들어 봅시다

 

>>> password = "1234"

해싱 작업을 하겠습니다.

 

>>> hash_password = bcrypt.hashpw(password,bcrypt.gensalt())

흠흠 에러가 뜨는 군요.

 

에러를 보면 must be encode before hashing 이라는 군요 ("해싱해기전에 반드시 encode 해줘라") 이런 뜻입니다.

 

그럼 password를 encode해봅시다.

 

>>> password = password.encode('utf-8')
>>> hash_password = bcrypt.hashpw(password,bcrypt.gensalt())
>>> print(hash_password) 

다시 한번 입력 해보고 출력을 해보면 

 

정삭적으로 해싱 된 것을 볼 수 있습니다.

 

해당 값을 DB에 저장 하면 됩니다.

 

그렇다면 단방향으로 암호화가된 데이터를 어떻게 스트링 데이터와 비교를 할까요?

https://pypi.org/project/bcrypt/

 

bcrypt

Modern password hashing for your software and your servers

pypi.org

위 사이트를 참고 하시면 checkpw함수가 있습니다.

 

>>> bcrypt.checkpw("1234".encode('utf-8'),hash_password)

 

첫번째 코드에서는 1234를 비교하였고 두번째 에서는 123과 비교를 해서 T/F값이 나온 것을 볼 수 있습니다.

 

 

2. JWT

 

jwt는 인가할때 도움을 주는 뇨속 이다.

 

실습을 위해 install 해보자

 

pip install pyjwt

 

jwt를 import해주고

>>> import jwt
>>> encoded_jwt = jwt.encode({"user-id":5},"secret", algorithm="HS256")

파람 값 : 암호화할 데이터, 암호화 키, 알고리즘

오우 user-id값이 암호화 되었군요..

 

jtw는 양뱡향 암호 화라서 풀수도 있어여 합니다.

 

>>> jwt.decode(encoded_jwt,"secret",algorithm="HS256")

 

파람 값 : 암호화된 문자열 , 복호화 키, 암호 알고리즘