de Tiago Alves

Cum vă păstrează Devise parolele aplicației Rails în siguranță

Cum va pastreaza Devise parolele aplicatiei Rails in siguranta
Fotografie de James Sutton pe Unsplash

Înțelegeți este o soluție de autentificare incredibilă pentru Rails cu peste 40 de milioane de descărcări. Cu toate acestea, deoarece abstractizează majoritatea operațiunilor criptografice, nu este întotdeauna ușor să înțelegeți ce se întâmplă în culise.

Una dintre aceste abstracții culminează cu persistența unui encrypted_password direct pe baza de date. Așa că am fost mereu curios despre ceea ce reprezintă de fapt. Iată un exemplu:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Dar ce înseamnă ticăloșia asta?

Utilizări imaginate Bcrypt pentru a stoca în siguranță informații. Pe site-ul său web menționează că folosește „OpenBSD bcrypt () algoritm de hash de parolă, permițându-vă să stocați cu ușurință un hash securizat din parolele utilizatorilor dvs.”. Dar ce anume este acest hash? Cum funcționează și cum păstrează parolele stocate în siguranță?

Asta vreau să vă arăt astăzi.

Să lucrăm înapoi – de la hash-ul stocat în baza de date până la procesul de criptare și decriptare.

Acel hash $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO este de fapt compus din mai multe componente:

  • Versiunea Bcrypt (2a) – versiunea algoritmului bcrypt () folosit pentru a produce acest hash (stocat după primul $ semn)
  • Cost (11) – factorul de cost utilizat pentru a crea hash-ul (stocat după al doilea $ semn)
  • Sare ($2a$11$yMMbLgN9uY6J3LhorfU9iu) – un șir aleatoriu care atunci când este combinat cu parola dvs. îl face unic (primele 29 de caractere)
  • Suma de control (LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) – porțiunea de hash reală a stocatului encrypted_password (șir rămas după cele 29 de caractere)
Cum va pastreaza Devise parolele aplicatiei Rails in siguranta

Să explorăm ultimii 3 parametri:

  • Când utilizați Devise, Cost valoarea este setată de o variabilă de clasă numită se întinde iar valoarea implicită este 11. Acesta specifică de câte ori este hashată parola. (Pe dumneavoastră inițializator devise.rb, puteți configura acest lucru la o valoare mai mică pentru mediul de testare pentru ca suita de testare să ruleze mai rapid.) *
  • sare este șirul aleatoriu utilizat pentru a se combina cu parola originală. Aceasta face ca aceeași parolă să aibă valori diferite atunci când este stocată criptată. (Vedeți mai jos mai jos despre ce contează și ce sunt Rainbow Table Attacks.) **
  • suma de control este hash-ul generat efectiv al parolei după ce a fost combinat cu sarea aleatorie.

Când un utilizator se înregistrează în aplicația dvs., trebuie să seteze o parolă. Înainte ca această parolă să fie stocată în baza de date, se generează o sare aleatorie prin BCrypt :: Engine.generate_salt (cost) ținând cont de factorul de cost menționat anterior. (Notă: dacă pepper valoare variabilă de clasă este setat va adăugați valoarea acesteia la parolă înainte de a-l săra.)

Cu acea sare (ex. $2a$11$yMMbLgN9uY6J3LhorfU9iu, care include factorul de cost) pe care îl va apela BCrypt :: Engine.hash_secret (parolă, sare) care calculează hash-ul final pentru a fi stocat folosind sarea generată și parola selectată de utilizator. Acest hash final (de exemplu, $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) va fi la rândul său stocat în encrypted_password coloana bazei de date.

1611237185 584 Cum va pastreaza Devise parolele aplicatiei Rails in siguranta

Dar dacă acest hash nu este reversibil și sarea este generată aleator pe BCrypt::Password.create sunați de BCrypt::Engine.generate_salt(cost), cum poate fi folosit pentru a vă conecta la utilizator?

Acolo sunt utile acele componente de hash diferite. După găsirea înregistrării care se potrivește cu e-mailul furnizat de utilizator pentru conectare, parola criptată este recuperată și împărțită în diferitele componente menționate mai sus (Versiunea Bcrypt, Cost, Sare și Suma de control).

După această pregătire inițială, iată ce se întâmplă în continuare:

  1. Aduceți Introduceti parola (1234)
  2. Aduceți sare a parolei stocate ($2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Generați hash din parolă și sare folosind aceeași versiune bcrypt și factor de cost (BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Verificați dacă hash stocat este același cu cel calculat la pasul 3 ($2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)
1611237185 52 Cum va pastreaza Devise parolele aplicatiei Rails in siguranta

Și acesta este modul în care Devise stochează parolele în siguranță și vă protejează de o serie de atacuri, chiar dacă baza de date este compromisă.

Luați legătura pe Twitter @alvesjtiago și anunță-mă dacă ți s-a părut interesant acest articol! Mulțumesc că ai citit.

1611237185 456 Cum va pastreaza Devise parolele aplicatiei Rails in siguranta

PS: Nu sunt în niciun caz un expert în securitate sau criptografie, așa că vă rugăm să contactați dacă găsiți ceva în neregulă. Sper că simplificând unele dintre concepte va fi mai ușor să înțelegeți ce se întâmplă.

Mulțumesc @filipepina, @ivobenedito, @jackveiga, @joao_mags și @pedrosmmoreira pentru recenzii și sugestii. Acest articol este disponibil și la adresa http://blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Mai multe informații despre unele subiecte.

Factor de cost *

Atacuri de masă curcubeu **