bcrypt를 이용한 비밀번호 암호화

김예랑·2021년 6월 29일
0

비밀번호를 암호화 하는 이유는
전달 받은 비밀번호 문자열을 그대로 DB에 넣으면
외부자의 해킹이나 내부자의 유출에 위험하기 때문이다.

비밀번호를 암호화하는 함수 중 하나인 bcrypt에 대해서 알아보자.

bcrypt는 블로피시 암호에 기반을 둔 암호 해시 함수로서 Niels Provos와 David Mazières가 설계하였으며 1999년 USENIX에서 발표되었다. 레인보우 테이블 공격 방지를 위해 솔트를 통합한 bcrypt는 적응형 함수의 하나이다.

bcrypt는 전달받은 비밀번호에 무작위 문자열인 Salt를 붙여 암호화한다.
이유는 Salt를 붙이지 않으면 전달받은 비밀번호의 문자열이 같으면 항상 같은 해쉬값이 나오기 때문이다.
그렇게 되면 해킹에 취약해질 수 있으므로 Salt를 붙이는게 보안상 유리하다.

=> bcrypt 해쉬 문자열의 예

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
 Alg Cost      Salt                        Hash

Alg : 알고리즘 식별자
Cost : Cost factor, 10 => 2^10 rounds
Salt : 붙여진 Salt를 명시 => byte type
Hash : 해쉬함수에 넣은 결과값 (암호화된 결과) => byte type

python에서 bcrypt를 사용하는 법

<bcrypt 설치, import>

  • bcrypt를 설치한다.
pip install bcrypt
  • bcrypt를 사용할 파일에서 import한다.
import bcrypt

<비밀번호 암호화>

  • 전달 받은 패스워드를 인코딩 한다. (bcrypt는 인자 값이 byte type이기 때문에)
password = "1234"
encoded_password = password.encode('utf-8')
  • bcrypt의 hashpw 메소드로 hash한다.
hashed_password = bcrypt.hashpw(encoded_password, bcrypt.gensalt())

<새로 입력받은 비밀번호와 해쉬화된 비밀번호 비교하여 인증>

  • 새로 입력받은 패스워드도 인코딩한다.
new_password = "1234"
encoded_new_password = new_password.encode('utf-8')
  • bcrypt의 checkpw 메소드로 일치하는지 확인한다.
bcrypt.checkpw(encoded_new_password, encoded_password) # 일치하면 True 가 반환된다.  

비밀번호 암호화는 '단방향'이기 때문에 암호화된 비밀번호를 복호화 할 수 없다.
따라서 로그인 인증을 할 때에 새로 입력받은 비밀번호를 같은 방법으로 해쉬해서 옳은 비밀번호인지 확인한다.

profile
안녕하세요. 백엔드 애송이 백송이 김예랑 입니다.

0개의 댓글