Kako Devise čuva lozinke vaših aplikacija Rails na sigurnom

Devise je nevjerojatno rješenje za provjeru autentičnosti za Rails s više od 40 milijuna preuzimanja. Međutim, budući da apstrahira većinu kriptografskih operacija, nije uvijek lako razumjeti što se događa iza kulisa.

Jedna od tih apstrakcija kulminira postojanjem encrypted_passwordizravno u bazi podataka. Stoga sam uvijek bio znatiželjan što to zapravo predstavlja. Evo primjera:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Ali što znači ta nerazumljivost?

Devise koristi Bcrypt za sigurno spremanje podataka. Na svojoj web stranici spominje da koristi " OpenBSD bcrypt () algoritam za raspršivanje lozinke, omogućavajući vam lako spremanje sigurnog raspršivanja lozinki vaših korisnika ". Ali što je točno ovo hash? Kako to funkcionira i kako čuva sačuvane lozinke?

To vam želim pokazati danas.

Radimo unatrag - od pohranjenog hasha na vašoj bazi podataka do postupka šifriranja i dešifriranja.

Taj se hash $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOsastoji od nekoliko komponenata:

  • Bcrypt version ( 2a) - verzija bcrypt () algoritma koji se koristi za stvaranje ovog hasha (pohranjen nakon prvog $znaka)
  • Cost ( 11) - faktor troškova koji se koristi za stvaranje hasha (pohranjuje se nakon drugog $znaka)
  • Salt ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - slučajni niz koji je u kombinaciji s vašom lozinkom čini jedinstvenom (prvih 29 znakova)
  • Kontrolna suma ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - stvarni pohranjeni dio pohranjenog encrypted_password(preostali niz nakon 29 znakova)

Istražimo posljednja 3 parametra:

  • Kada se koristi Devise, Costvrijednost postavlja varijabla klase koja se naziva proteže, a zadana vrijednost je 11. Određuje koliko se puta lozinka hashira. ( Na inicijalizatoru devise.rb možete to konfigurirati na nižu vrijednost za testno okruženje kako bi vaš testni paket brže radio. ) *
  • Sol je slučajni niz koristi za kombiniranje s izvornim lozinkom. To je ono što čini da jedna i ista lozinka ima različite vrijednosti kad je pohranjena šifrirano. ( Pogledajte više o tome zašto je to važno i koji su Rainbow Table Attack s.) **
  • Kontrolna suma je stvarno generirano raspršivanje lozinke nakon kombiniranja sa slučajnom soli.

Kada se korisnik registrira u vašoj aplikaciji, mora postaviti lozinku. Prije nego što se ova lozinka pohrani u bazu podataka, slučajna se sol generira putem BCrypt :: Engine.generate_salt (trošak) uzimajući u obzir prethodno spomenuti faktor troškova. (Napomena: ako pepperje postavljena vrijednost varijable klase, dodat će svoju vrijednost lozinci prije nego što je posoli.)

S tom soli (npr. $2a$11$yMMbLgN9uY6J3LhorfU9iu, Koja uključuje faktor troškova) pozvat će BCrypt :: Engine.hash_secret (lozinka, sol) koja izračunava konačno heširanje koje treba pohraniti pomoću generirane soli i lozinke koju je korisnik odabrao. Ovo posljednje hash (na primjer, $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) će se pak pohraniti u encrypted_passwordstupac baze podataka.

Ali ako je to hash nepovratno i sol se nasumično generira na BCrypt::Password.createpozivu BCrypt::Engine.generate_salt(cost), kako se može koristiti za prijavu korisnika?

Tu su korisne te različite hash komponente. Nakon pronalaska zapis koji odgovara e-mail isporučeni od strane korisnika za prijavu, kodiran lozinka popravljanje i oborio na različite komponente gore navedenih ( Bcrypt verzija , troškova , sol i zbroja ).

Nakon ove početne pripreme, slijedi sljedeće:

  1. Dohvati ulaznu lozinku ( 1234)
  2. Dohvati sol pohranjene lozinke ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Generirajte hash iz lozinke i soli koristeći istu verziju bcrypt i faktor cijene ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Provjerite je li pohranjeni hash isti kao i izračunati u koraku 3 ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

I tako Devise sigurno sprema lozinke i štiti vas od niza napada, čak i ako je vaša baza podataka ugrožena.

Stupite u kontakt na Twitteru @alvesjtiago i javite mi ako vam je ovaj članak bio zanimljiv! Hvala na čitanju.

PS: Ni u kojem slučaju nisam stručnjak za sigurnost ili kriptografiju, pa vas molim da se obratite ako nađete nešto pogrešno. Nadam se da će pojednostavljivanjem nekih koncepata biti lakše razumjeti što se događa.

Hvala @filipepina, @ivobenedito, @jackveiga, @joao_mags i @pedrosmmoreira na recenzijama i prijedlozima. Ovaj je članak također dostupan na //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Više informacija o nekim temama.

Faktor troškova *

  • Opasnosti od zadanog faktora troškova bcrypt
  • Preporučeni broj rundi za bcrypt

Napadi na Rainbow Table **

  • Dugin stol - Wikipedia
  • Što su dugini stolovi i kako se koriste?