study/Python 🌼

[Python] 암호화를 하는 bcrypt

서나쓰 2021. 5. 28. 13:18
728x90
  • bcrypt는 단방향 암호화해주는 파이썬 라이브러리
  • 단방향이라면 평문→암호화는 가능하지만 암호화→평문으로 복호화는 어렵다
  • 비밀번호를 관리할 때 유용하게 쓰인다
  • db에 암호화되어 저장된 비밀번호를 복호화하는 것도 불가능하기 때문에 내부자가 회원의 비밀번호를 알아내는 것도 불가능하며, 회원이 입력한 비밀번호화 일치하는지만 확인한다
  • hahsing : 원본의 의미를 알 수 없게 섞어놓은 것
  • salting : 실제 비밀번호에 랜덤 값을 더해서 해시값을 계산하는 방법
  • key stretching : 해쉬 값을 여러번 반복하는 행위

pip install bcrypt
pip install pyjwt

→ pyjwt는 jwt(json web token)을 암호화, 복호화해주는 라이브러리이다

>>> import bcrypt    #1 
>>> password = 'pass1234'  #2
>>> bcrypt.hashpw(password, bcrypt.gensalt())   #3

라이브러리를 임포트 해 주고 나서 임이의 패스워드를 암호화한다.

이렇게 하면 #3번 라인에서 에러가 발생한다.

암호화 함수는 오직 bytes string에서만 작동하기 때문에, 해싱하기 전에 password를 bytes string으로 변환해줘야 한다. utf8 인코딩을 해 주자.

password.encode('uft-8')
#혹은
b = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

암호화된 byte 형식의 패스워드가 입력되는 것을 볼 수 있다

여기서 b 는 바이트 형식이기에 디코딩을 해서 데이터베이스에 저장해야 한다.

암호화된 비밀번호 일치 확인

c = '123456'
bcrypt.checkpw(c.encode('utf-8'), b)  #False

c = 'pass1234'
bcrypt.checkpw(c.encode('utf-8'), b)  #True

토큰 발행

  • 사용자가 id, pw를 입력해 로그인 버튼을 누르면 서버는 id와 pw를 db에 저장한 것과 비교하고, 인증이 완료되면 회원에게 토큰 발행.
  • 그 토큰은 브러우저의 쿠키나 세션 스토리지에 저장되어 서버에 데이터를 요청할 때마다 토큰 담아 정보 요청
>>> import jwt  #설치는 pyjwt로 했지만, 쓸 때는 jwt로 한다
>>> jwt.encode({'user_id' : 1}, 'blah', algorithm='HS256')  #2
>>> jwt.decode({'user_id' : 1}, 'blah', algorithm='HS256')   #3
> {'user_id' : 1}  #4
  • 토큰 대상, 시크릿키, 해싱 알고리즘을 차례로 넣는다.
  • 다만 토큰이 탈취당할 경우 보안에 타격을 입어 refresh token도 존재한다.
728x90

'study > Python 🌼' 카테고리의 다른 글

[Python] 월 단위의 날짜 차이 계산  (0) 2021.07.05
[Python] Mac SSLCertVerificationError  (0) 2021.06.30
[Python] dataclass 모듈 사용법  (1) 2021.05.28
[Python] SQLAlcehmy  (0) 2021.05.28
[Python] classmethod vs staticmethod  (0) 2021.05.28