본문 바로가기
프로그래밍/웹관련

TIL32 | 인증(Authentication)과 bcrypt

by lee365 2021. 10. 26.
반응형

🗝️ 인증 Authentication

  • Authentication은 유저의 identification을 확인하는 절차이다. (유저의 아이디와 비번을 확인하는 절차)
  • 인증이 필요한 이유
    • 누가 우리 서비스를 쓰는지, 어떻게 사용하는지 추적이 가능하도록 하기 위해
  • 인증에 필요한 것
    • 아이디, 이메일 주소, 비밀번호

 

사용자 비밀번호 암호화

  • 절대 비밀번호 그대로 DB에 저장하지 않는다.
    • 외부의 해킹 또는 내부 개발자나 인력이 유저들의 비밀번호를 볼 수 있다.
  • 사용자 비밀번호는 반드시 암호화해서 저장한다.
  • 일반적으로 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰인다.

비밀번호는 국가에서 권고하는 상용 암호화 알고리즘을 이용해 암호화하도록 법적으로 요구하고 있다. (법규상의 강제)

 

단방향 해쉬 함수

  • 원본 메시지를 변환하여 암호화된 메시지를 생성한다.

  • 원본 메시지를 알면 암호화된 메시지를 구할 수 있지만, 암호화된 메시지로는 원본 메시지를 구할 수 없다 👉️ 단방향성(one-way)

  • 본래 해쉬함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰이지만 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다.

  • 암호화 알고리즘 : MD5, SHA-1, SHA-256

 

단방향 해쉬 함수의 취약점

  • Rainbow table attack : 미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 한다.
  • 패스워드가 충분히 길거나 복잡하지 않은 경우에는 해킹하는데 그리 긴 시간이 걸리지 않는다.

Salting & Key Stretching

단방향 해쉬함수의 취약점들을 보완하기 위해 일반적으로 2가지의 보완점들이 사용된다.

Salting

  • 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법

Key Stretching

  • 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해쉬하고, 또 이를 반복하는 것

 

🗝️ bcrypt

Salting과 Key Stretching을 구현한 해쉬 함수 중 가장 널리 사용되는 것이 bcrypt이다.

hash결과값에 salt값과 hash값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.

 

Install

pip install bcrypt

 

Usage

hashpw()

  • hashpw(password: bytes, salt: bytes) -> bytes
  • bcrypt.gensalt() 는 호출할 때 마다 랜덤한 salt값 반환
  • Database에 저장할 때는 hashed_pwstring으로 저장하기 때문에 Decoding에서 저장한다.
import bcrypt

password   = '1234'
encoded_pw = password.encode('utf-8') # encoding한 문자열

# password hashing
salt      = bcrypt.gensalt()
hashed_pw = bcrypt.hashpaw(password.encode('utf-8'), salt)

 

checkpw()

  • checkpw(password: bytes, hashed_password: bytes) -> bool

  • 입력받은 password와 암호화된 password를 비교할 때 사용한다.

bcrypt.checkpw('1234'.encode('utf-8'), hashed_pw) # db에서 가져온 hashed_pw

 

참고 사이트

bcrypt 3.2.0

이미지 출처 - Add Authentication to Your App With BCrypt and JWT

 

반응형

'프로그래밍 > 웹관련' 카테고리의 다른 글

TIL34 | HTTP Status Code  (0) 2021.10.27
TIL33 | 인가(Authorization)와 JWT  (0) 2021.10.26
TIL22 | HTTP 특징과 구조(Request / Response)  (0) 2021.10.15
TIL10 | 크롬 개발자 도구 - Network panel  (0) 2021.10.08
[Pug] Syntax  (0) 2021.08.05