
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_password
izravno 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/yO
sastoji 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 pohranjenogencrypted_password
(preostali niz nakon 29 znakova)

Istražimo posljednja 3 parametra:
- Kada se koristi Devise,
Cost
vrijednost postavlja varijabla klase koja se naziva proteže, a zadana vrijednost je11
. 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 pepper
je 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_password
stupac baze podataka.

Ali ako je to hash nepovratno i sol se nasumično generira na BCrypt::Password.create
pozivu 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:
- Dohvati ulaznu lozinku (
1234
) - Dohvati sol pohranjene lozinke (
$2a$11$yMMbLgN9uY6J3LhorfU9iu
) - Generirajte hash iz lozinke i soli koristeći istu verziju bcrypt i faktor cijene (
BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”)
) - 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.

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?