Python/Utils

파이썬에서 값 암호화 해싱 및 검증 방법(bcrypt 모듈)

jimmy_AI 2024. 5. 2. 01:26
반응형

유저의 비밀번호 등의 중요 정보를 데이터베이스에 저장하기 위해서는 반드시

값 암호화 해싱을 해야하는데요. Python의 경우에 편하게 활용이 가능한

bcrypt 모듈의 기능에 대하여 간단한 예제를 통해서 살펴보도록 하겠습니다.

 

해당 모듈 설치는 다음 명령어로 진행해주시면 됩니다.

pip install bcrypt

 

 

유저의 비밀번호 해싱 방법

유저의 비밀번호를 input으로 받아 해싱된 결과를 반환받는 함수는 다음과 같습니다.

참고로 gensalt()로 실행 시 같은 값을 해싱하더라도

매번 다른 값이 출력되도록 만들기에 보안 상 이점이 큽니다.

import bcrypt

def hash_password(user_pw: str) -> str:
    hashed_pw: bytes = bcrypt.hashpw(user_pw.encode("UTF-8"), salt=bcrypt.gensalt())
    return hashed_pw.decode("UTF-8")

 

bcrypt의 hashpw 메소드 사용을 위해서는 str -> bytes 변환이 필요합니다.

따라서, encode 과정을 먼저 수행해주고, 이후 데이터베이스에 저장할

문자열로 다시 반환받기 위하여 decode 과정을 진행해준 점을 참고해주시면 됩니다.

 

 

해싱된 비밀번호 검증 방법

이제 새로운 비밀번호를 입력받았을 때, 해싱되어 DB에 저장된 값이 입력된 값에서

해싱되었던 값인지를 검증하는 함수 코드는 다음과 같습니다.

def verify_password(user_pw: str, hashed_pw: str) -> bool:
    return bcrypt.checkpw(user_pw.encode("UTF-8"), hashed_pw.encode("UTF-8"))
    
# 사용 예제
pw = "password"
hashed_pw = hash_password(pw) # 복잡한 해시 값으로 변경
compare_result1 = verify_password("password", hashed_pw) # True
compare_result1 = verify_password("anyvalue", hashed_pw) # False

 

참고로, bcrypt의 checkpw 메소드는 해싱되었던 결과가 시드인 salt 값에 의하여

다르더라도 원본 값과의 일치 여부를 항상 검증할 수 있기에 매우 유용합니다.