Bcrypt

BY Jung·2021년 12월 26일
0

Bcrypt란?

  • 암호를 해싱해주는 라이브러리이다.
  • 문자열(str) 데이터가 아닌 바이트(bytes) 데이터를 암호화한다.
  • 따라서 encoding/decoding의 사전작업을 거쳐야한다.
  • 단방향(one-way) 해쉬 함수를 이용한다.

단방향 해쉬 함수

  • 비밀번호의 암호화에 일반적으로 쓰이는 알고리즘.
  • 원본 메시지를 안다면 -> 암호화된 메시지(digest)를 구하기 쉽다. 그러나,
  • 암호화된 메시지를 안다면 -> 이것만으로 원본 메시지를 구할 수 없다.

단방향 해쉬 함수 취약점

  • 미리 해쉬값들을 계산해 놓은 Rainbow Table이 있는데, 이것이 취약점으로 작용한다.
  • 이를 보완하고자 Salting과 Key Stretching을 사용한다.
  • Salting : 실제 비밀번호 + 추가적인 랜덤 데이터로 해쉬값 계산
  • Key Stretching : 계산한 단방향 해쉬값을 또 해쉬하고 또 해쉬하고 또....

Bcrpyt 실습절차

가상환경 생성
pip install bcrypt
bcrypt: 암호를 해싱해주는 라이브러리

import bcrypt
password = '1234'

레인보우 테이블을 이용한 공격을 막기 위해 솔트값을 추가해 해쉬값을 강화
bcrypt.hashpw(password, bcrypt.gensalt())

실행하면 TypeError: Unicode-objects must be encoded before hashing이 뜸
Why?
바이트형 데이터만이 해싱 가능하다. 따라서 인코딩을 거쳐야하기 때문.

Encoding/Decoding이란?

문자열(string)타입의 데이터를 ASCII 또는 utf8 형식의 bytes 타입으로 바꾸거나(encoding) 그 반대(decoding)으로 바꾸는 것을 말함

encoded_password = password.encode('utf-8')
decoded_password = encoded_password.decode('utf-8')

Hashing

hashed_password = 
bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

bcrypt.gensalt()를 입력할 때마다 솔트값이 달라지는 것을 볼 수 있음

salt= bcrypt.gensalt()로 솔트값 하나를 저장

hashed_password =
bcrypt.hashpw( password.encode('utf-8'), salt)

bcrypt check passwod 함수 : 로그인 엔드포인트 구현 시 패스워드 비교에 사용

형식: bcrypt.checkpw(password, hashed)

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

bcrypt는 단방향 해쉬 알고리즘이므로 솔팅, 스트레칭을 하고 나면 복호화가 불가능에 가깝다

profile
Slow and steady wins the race

0개의 댓글