Stochează parolele cu Argon2id sau bcrypt, niciodată în clar

Subiect din roadmap-ul Bune practici: securitatea API-urilor · parte din „Autentificare”

Stocarea parolelor în text simplu („în clar”) este una dintre cele mai grave vulnerabilități de securitate, transformând orice breșă de date într-o catastrofă pentru utilizatori. Dacă baza ta de date este compromisă, atacatorii pot accesa direct conturile oamenilor, având posibilitatea de a le folosi și pe alte site-uri unde aceștia au reutilizat aceeași parolă. Prin hash-uirea criptografică, chiar și în cazul unei scurgeri de date, parolele rămân protejate, deoarece procesul de inversare este computațional extrem de costisitor și adesea imposibil de realizat în timp util.

Cum o aplici

  1. Alege algoritmul potrivit: Preferă Argon2id (câștigătorul Password Hashing Competition) pentru rezistența sa la atacuri hardware (GPU/ASIC). Folosește bcrypt ca alternativă solidă și larg suportată dacă Argon2 nu este disponibil în librăria ta.
  2. Configurează parametrii de cost: Asigură-te că funcția de hash este suficient de lentă pentru a frena atacurile brute-force, dar rapidă suficient pentru a nu bloca experiența utilizatorului. Pentru Argon2, ajustează memoria, iterațiile și paralelismul; pentru bcrypt, crește factorul de cost (cost).
  3. Nu reinventa roata: Nu implementa propriul algoritm de hashing sau salt. Folosește librării standardizate și actualizate (ex: passlib în Python, bcrypt în Node.js/Java).
  4. Salvează doar hash-ul: În baza de date, stochează doar rezultatul hash-ului împreună cu salt-ul generat aleatoriu. Nu stoca niciodată parola originală sau cheia secretă separat de hash.

Exemplu

Varianta incorectă (Hash simplu, fără salt):

# PERICULOS: Atacurile rainbow table funcționează imediat
import hashlib
password_hash = hashlib.sha256(password.encode()).hexdigest()

Varianta corectă cu Argon2 (folosind librăria argon2-cffi):

from argon2 import PasswordHasher

ph = PasswordHasher()
# Generarea hash-ului
hash_value = ph.hash("parola_utilizator_scurt")

# Verificarea parolei
is_valid = ph.verify(hash_value, "parola_utilizator_scurt")

Cum verifici

  • Audit de cod: Caută funcții precum md5, sha1, sha256 aplicate direct pe parole. Acestea sunt inadecvate pentru stocarea credențialelor.
  • Teste de unitate: Verifică dacă hash-urile generate pentru aceeași parolă diferă la fiecare rulare (dovada existenței unui salt unic).
  • Scanners de securitate: Utilizează instrumente SAST (Static Application Security Testing) care detectează automat utilizarea algoritmilor slabi de hashing.

Greșeli frecvente

  • Salt-ul este public sau static: Salt-ul trebuie să fie unic per utilizator și generat aleatoriu. Dacă folosești același salt pentru toți, atacatorii pot calcula hash-uri prealabile pentru dicționare întregi.
  • Confuzia între hashing și encryptare: Encryptarea este reversibilă (necesită cheie), în timp ce hashing-ul este ireversibil. Parolele se hash-uiesc, nu se criptează.
  • Hash-uri rapide: Folosirea unor algoritmi rapizi (cum ar fi SHA-256) permite atacatorilor să încerce miliarde de combinații pe secundă, făcând brute-force-ul practic.

Resurse gratuite

Alte subiecte din „Autentificare”