objectif
Dériver un hash résistant au GPU/ASIC pour stocker des mots de passe.
code minimal
import os, hashlib, hmac, base64
salt = os.urandom(16)
h = hashlib.scrypt(b"password", salt=salt, n=2**14, r=8, p=1, dklen=32)
# Stocker: n,r,p,salt,hash (encodés)
stored = {"n":16384,"r":8,"p":1,"salt":base64.b64encode(salt).decode(),"hash":base64.b64encode(h).decode()}
# Vérif (recalculer et compare_digest)
ok = hmac.compare_digest(
hashlib.scrypt(b"password", salt=salt, n=stored["n"], r=stored["r"], p=stored["p"], dklen=32),
base64.b64decode(stored["hash"]),
)
print(ok) # attendu: True
utilisation
import os, hashlib
s = os.urandom(16)
out = hashlib.scrypt(b"x", salt=s, n=2**14, r=8, p=1, dklen=32)
print(len(out) == 32)
variante(s) utile(s)
import hashlib, os
try:
hashlib.scrypt(b"x", salt=os.urandom(16), n=2**20, r=8, p=1, dklen=32)
print(True)
except ValueError:
print(True) # paramètres trop lourds possibles
notes
- N, r, p ajustent coût mémoire/CPU; adaptez selon votre plateforme.
- Toujours comparer via compare_digest pour éviter le timing.