Python

Хеширование паролей без сторонних библиотек

Algonexys · 07.08.2026 · 👁 0

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