Python

비밀번호 암호화에 passlib와 hashlib 비교 (python)

ZZJJing 2025. 3. 6. 13:35
반응형

Python에서 비밀번호 암호화에 passlibhashlib 중 무엇이 더 나은지는 사용 목적과 요구사항에 따라 다르다. 

두 라이브러리는 서로 다른 목적으로 설계되었기 때문에, 상황에 맞는 선택이 중요합니다.

아래에서 두 라이브러리의 특징과 비밀번호 암호화에 대한 적합성을 비교해 보겠습니다.


1. hashlib

  • 설명: Python 표준 라이브러리로, MD5, SHA-1, SHA-256 등 다양한 해시 알고리즘을 제공합니다.
  • 특징:
    • 단방향 해시 함수를 구현하며, 주로 데이터 무결성 확인이나 간단한 해싱에 사용됩니다.
    • 솔트(salt)나 작업 부하(work factor)를 자체적으로 지원하지 않으므로, 비밀번호 저장용으로 사용하려면 직접 구현해야 합니다.
    • 빠르고 가볍지만, 비밀번호 암호화에는 최적화되어 있지 않습니다.
  • 장점:
    • 표준 라이브러리라 별도 설치가 필요 없음.
    • 단순한 해시 계산에 적합.
  • 단점:
    • 비밀번호 저장을 위해 안전하게 사용하려면 솔트와 작업 부하를 직접 관리해야 함.
    • 현대적인 비밀번호 해싱 알고리즘(예: bcrypt, Argon2 등)을 지원하지 않음.
    • 브루트포스 공격에 취약할 가능성이 높음(특히 MD5, SHA-1 같은 오래된 알고리즘 사용 시).
  • 비밀번호 암호화 적합성:
    hashlib은 비밀번호 저장용으로 권장되지 않습니다. 안전한 비밀번호 해싱을 위해서는 솔트와 작업 부하를 처리해야 하는데, 이를 직접 구현하는 것은 번거롭고 실수하기 쉽습니다.

2. passlib

  • 설명: 비밀번호 해싱 및 암호화에 특화된 서드파티 라이브러리로, bcrypt, Argon2, PBKDF2 등 현대적인 알고리즘을 지원합니다.
  • 특징:
    • 솔트 생성 및 관리를 자동으로 처리.
    • 작업 부하(work factor)를 조정할 수 있어 브루트포스 공격에 강함.
    • 비밀번호 검증을 위한 편리한 API 제공.
    • 다양한 해싱 알고리즘을 통합적으로 지원하며, 알고리즘이 오래되었을 경우 업그레이드도 지원.
  • 장점:
    • 비밀번호 저장에 특화되어 있어 보안성이 높음.
    • 사용이 간편하고, 복잡한 구현을 직접 할 필요 없음.
    • 현대적인 보안 표준(예: bcrypt, Argon2)을 따름.
  • 단점:
    • 서드파티 라이브러리라 별도 설치 필요(pip install passlib).
    • hashlib에 비해 약간의 오버헤드가 있을 수 있음(비밀번호 해싱은 의도적으로 느리게 설계됨).
  • 비밀번호 암호화 적합성:
    passlib은 비밀번호 저장 및 인증에 매우 적합합니다. 특히 bcrypt와 같은 알고리즘은 현재 보안 업계에서 널리 권장되는 표준입니다.

비교 및 권장 사항

기준                                                                                      hashlib  VS  passlib

목적 일반 해싱(무결성 확인 등) 비밀번호 해싱 및 인증
솔트 지원 직접 구현 필요 자동 지원
보안성 낮음(구현 방식에 따라 다름) 높음(현대 알고리즘 지원)
사용 편의성 낮음(추가 작업 필요) 높음(API 간단)
설치 필요 여부 없음(표준 라이브러리) 있음(서드파티)

비밀번호 암호화를 위해 추천:

  • 권장: passlib
    비밀번호를 안전하게 저장하고 인증하려면 passlib이 훨씬 더 적합합니다. 특히 bcryptArgon2 같은 알고리즘을 사용하면 보안성이 높아지고, 구현도 간단합니다. 
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

# 비밀번호 해싱
password = "mypassword"
hashed = pwd_context.hash(password)
print(hashed)

# 비밀번호 검증
print(pwd_context.verify("mypassword", hashed))  # True
print(pwd_context.verify("wrongpassword", hashed))  # False
 
  • hashlib을 사용할 경우:
    비밀번호 저장이 아닌, 단순히 데이터 무결성을 확인하거나 빠른 해시 계산이 필요한 경우에만 적합합니다. 비밀번호 저장용으로 사용하려면 솔트와 작업 부하를 직접 구현해야 하므로 권장되지 않습니다.

 

현재 버전이 passlib이 에러가 나서 hashlib으로 사용중인데, 다시 바꿔야할 것 같다 ㅠㅠ 

728x90
반응형

'Python' 카테고리의 다른 글

fastapi - Event loop is closed 에러  (0) 2025.03.04
fastapi - bcrypt 오류  (0) 2025.02.27
인텔리제이에서 파이썬 실행 환경 구성하기  (0) 2025.02.25
유튜브 mp3음원 추출  (0) 2025.02.22
[Python/OCR] Tessearact 오류 정리  (0) 2025.02.18