인증, 인가, 비밀번호 암호화

BLAKE KIM·2020년 8월 16일
0

암호화를 위한 라이브러리 Bcrypt를 사용함.

Bcrypt 설치

pip install bcrypt

Bcrypt import

import bcrypth

bcrypt의 암호화 방법

bcrypt는 str 데이터가 아닌 Bytes 데이터를 암호화한다. 따라서 암호화시에 bytes화 해야합니다. 파이썬에서는 str 을 encode하면 bytes(이진화) 되고, Bytes 를 decode하면 str 화 합니다. encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용합니다.

password = '1234'
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
print(hashed_password)
# b'$2b$12$YFs9rh.1LgJwZuf9ibyjpuLvBoCaGX0MzedFWF2Jo0zU3lMZurZ4a'

hashed_password의 타입은 bytes타입이다. 이렇게 암호화된 것은 복호화할 수 없는 단방향 암호화이다. 비밀번호를 확인하는 작업은 다음과 같이 진행한다.

new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'),hashed_password)
# True

이 때 비교할 대상인 두 패스워드는 모두 bytes 타입이어야 한다. django에서 이를 적용시켜 db에 저장하게 되면 기존의 필드타입이 str타입이어서 bytes타입으로 저장하면 str타입으로 저장되어 비교가 불가능해진다. 또한 bytes타입을 그대로 저장하면 이를 나타내는 b까지 함께 문자열로 저장되서 불러와서 비교할 때 애를 먹었다. 때문에 나는 저장시에 str으로 decode해서 저장하고 불러와서 encode하여 비교하였다.

JWT(JSon Web Token)

PyJWT 라이브러리 설치

pip install pyjwt
import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.

SECRET = 'secret' #'랜덤한 조합의 키' django 프로젝트의 settings.py에 있다.

access_token = jwt.encode({'id' : 1}, SECRET, algorithm = 'HS256')
print(access_token)
# b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'

jwt의 결과물 또한 bytes타입이다. 때문에 로그인 시 발행할 때 JSON형식으로 보내기 위해서 decode 후 보내주었다.

후에 들어온 jwt를 비교하는 것은 다음과 같다.

header = jwt.decode(access_token, SECRET, algorithm = 'HS256')
print(header)
# {'id': 1}

header의 Authorization으로 토큰은 들어오게 되는데 header에서 Authorization Key를 통해 값을 가져온 후 비교한다.

profile
BackEnd

0개의 댓글