← retour aux snippets

hashlib.scrypt: hacher un mot de passe

Dériver un hash résistant au GPU/ASIC pour stocker des mots de passe.

python security #scrypt#password#kdf

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.