You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
27 lines
792 B
Python
27 lines
792 B
Python
# backend/app/auth/password.py — 비밀번호 해시/검증 (stdlib pbkdf2, 의존성 없음)
|
|
import hashlib
|
|
import hmac
|
|
import os
|
|
|
|
_ITER = 200_000
|
|
_ALGO = "sha256"
|
|
|
|
|
|
def hash_password(password: str) -> str:
|
|
salt = os.urandom(16)
|
|
dk = hashlib.pbkdf2_hmac(_ALGO, password.encode("utf-8"), salt, _ITER)
|
|
return f"pbkdf2${_ITER}${salt.hex()}${dk.hex()}"
|
|
|
|
|
|
def verify_password(password: str, stored: str) -> bool:
|
|
try:
|
|
scheme, iters, salt_hex, hash_hex = stored.split("$")
|
|
if scheme != "pbkdf2":
|
|
return False
|
|
dk = hashlib.pbkdf2_hmac(
|
|
_ALGO, password.encode("utf-8"), bytes.fromhex(salt_hex), int(iters)
|
|
)
|
|
return hmac.compare_digest(dk.hex(), hash_hex)
|
|
except (ValueError, AttributeError):
|
|
return False
|