# Created on savesnippets.com ยท https://savesnippets.com/p7cplgYc5GMzaf import base64 import hashlib import os import hmac def hash_password(password: str) -> str: salt = os.urandom(16) n, r, p = 2 ** 14, 8, 1 key = hashlib.scrypt(password.encode(), salt=salt, n=n, r=r, p=p, dklen=32) return f"scrypt${n}${r}${p}${base64.b64encode(salt).decode()}${base64.b64encode(key).decode()}" def verify_password(password: str, stored: str) -> bool: try: algo, n, r, p, salt_b64, key_b64 = stored.split("$") if algo != "scrypt": return False salt = base64.b64decode(salt_b64) key = base64.b64decode(key_b64) candidate = hashlib.scrypt(password.encode(), salt=salt, n=int(n), r=int(r), p=int(p), dklen=len(key)) return hmac.compare_digest(candidate, key) except (ValueError, TypeError): return False stored = hash_password("hunter2") print(verify_password("hunter2", stored)) # True print(verify_password("wrong", stored)) # False