Python
Хеширование паролей без сторонних библиотек
PBKDF2-HMAC из hashlib и сравнение в постоянном времени. Никогда не храните пароли в открытом виде.
Код
import hashlib
import hmac
import os
ITERATIONS = 600_000
def hash_password(password, salt=None):
"""Вернуть строку вида pbkdf2_sha256$итерации$соль$хеш."""
salt = salt or os.urandom(16)
digest = hashlib.pbkdf2_hmac("sha256", password.encode(), salt, ITERATIONS)
return f"pbkdf2_sha256${ITERATIONS}${salt.hex()}${digest.hex()}"
def verify_password(password, stored):
_, iterations, salt_hex, digest_hex = stored.split("$")
digest = hashlib.pbkdf2_hmac(
"sha256", password.encode(), bytes.fromhex(salt_hex), int(iterations)
)
# compare_digest защищает от атак по времени
return hmac.compare_digest(digest.hex(), digest_hex)
stored = hash_password("s3cret")
print(verify_password("s3cret", stored)) # True
print(verify_password("wrong", stored)) # False