TIL 18 bcrypt(비크립트)

CastleQ·2021년 6월 3일
0

인증&인가

목록 보기
2/3
post-thumbnail

bcrypt(비크립트)란?

Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들이전 해쉬함수 이다.

bcrypt는 애초부터 패스워드 저장을 목적으로 설계되었다.

python 가상환경에 대한 이해가 있다고 가정하고 글을 진행하도록 하겠습니다.

bcrypt(비크립트) 사용법

$ conda activate (가상환경 이름)

$ pip install bcrypt

python인터프리터를 실행한다!

import bcrypt

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

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

hashed_password의 값은 어떠한 형태일까요?

type(hashed_password)
<class 'bytes'>

이러한 방식은 이전의 포스팅에서 언급했던 단방향 암호화 즉 복호화 할 수 없도록 암호화 하는 방식입니다.
비밀번호를 확인해야 할 때에는bcrypt.checkpw()메소드를 사용하여 검사합니다.

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

bcrypt.checkpw()의 rule
bcrypt.checkpw(입력받은 패스워드, 저장된 암호화된 패스워드)
들어가는 데이터 타입은 byte 여야 합니다 !

❗️❗️❗️checkpw()의 로직❗️❗️❗️

checkpw()메소드가 매번 바뀌는 솔트 값을 어떻게 읽어 올까라는 의문점이 있었다.
우리가 어떤 값을 데이터베이스에 저장할 때에는 bytes값으로 인코딩한 값을 디코딩해서
str타입으로 저장하는데 checkpw()메소드는 그 임의의 문자열을 판독하여 안에있는 솔트값을 인지하고 그 나머지의 해시화된 값을 입력된 값과 비교해 일치 여부를 확인한다.
한마디로 bcrypt.gensalt()를 할때는 매번 임의의 값을 부여하지만 데이터베이스에 들어 간 값은 bcrypt.gensalt()에 의해 생성된 값이 고정된 것이다.

참고자료
위코드 노션 페이지
django 공식문서
https://velog.io/@devmin/bcrypt-jwt-basic

profile
DONE IS BETTER THAN PERFECT

0개의 댓글