Kā Devise uztur jūsu Rails lietotņu paroles drošībā

Devise ir neticami autentifikācijas risinājums Rails ar vairāk nekā 40 miljoniem lejupielāžu. Tomēr, tā kā tajā tiek apkopota lielākā daļa kriptogrāfisko darbību, ne vienmēr ir viegli saprast, kas notiek aiz ainas.

Viena no šīm abstrakcijām beidzas ar to, ka pastāv encrypted_passwordtieši datu bāze. Tāpēc man vienmēr ir bijusi interese par to, ko tas patiesībā pārstāv. Lūk, piemērs:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Bet ko nozīmē šī ņurdēšana?

Lai droši uzglabātu informāciju, Devise izmanto Bcrypt. Savā vietnē tā min, ka izmanto “ OpenBSD bcrypt () paroļu jaukšanas algoritmu, kas ļauj viegli saglabāt drošu lietotāju paroļu jaukšanu ”. Bet kas īsti ir šis hash? Kā tas darbojas un kā glabā saglabātās paroles drošībā?

To es gribu jums šodien parādīt.

Strādāsim atpakaļ - sākot no jūsu datu bāzē saglabātā hash līdz šifrēšanas un atšifrēšanas procesam.

Šis jaucējkrāns $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOfaktiski sastāv no vairākiem komponentiem:

  • Bcrypt version ( 2a) - šīs hash izveidošanai izmantotā algoritma bcrypt ( ) versija (saglabāta pēc pirmās $zīmes)
  • Izmaksas ( 11) - izmaksu faktors, ko izmanto, lai izveidotu jaukšanu (saglabāts pēc otrās $zīmes)
  • Sāls ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - nejauša virkne, kas, apvienojot to ar jūsu paroli, padara to unikālu (pirmās 29 rakstzīmes)
  • Kontrolsumma ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - faktiskā glabātās jaukšanas daļa encrypted_password(atlikusī virkne pēc 29 rakstzīmēm)

Izpētīsim pēdējos 3 parametrus:

  • Izmantojot Devise, Costvērtību nosaka klases mainīgais, ko sauc par stiepšanos, un noklusējuma vērtība ir 11. Tas norāda paroles jaukšanas reižu skaitu. ( Devise.rb inicializatorā varat to konfigurēt zemākai testa vides vērtībai, lai jūsu testu komplekts darbotos ātrāk. ) *
  • Sāls ir nejauši string izmanto, lai apvienotu ar sākotnējo paroli. Tas padara to pašu paroli atšķirīgas vērtības, ja tā tiek glabāta šifrēta. ( Tālāk skatiet vairāk par to, kāpēc tas ir svarīgi un kas ir Rainbow Table Attack s.) **
  • Kontrolsumma ir faktiskais radīts jaucējalgoritms paroli pēc apvienojumā ar nejaušu sāli.

Kad lietotājs reģistrējas jūsu lietotnē, viņam jāiestata parole. Pirms šī parole tiek saglabāta datu bāzē, izmantojot BCrypt :: Engine.generate_salt (izmaksas) tiek izveidots nejaušs sāls, ņemot vērā iepriekš minēto izmaksu faktoru. (Piezīme: ja pepperir iestatīta klases mainīgā vērtība, tā pirms sālīšanas pievienos tās vērtību parolei.)

Ar šo sāli (piemēram $2a$11$yMMbLgN9uY6J3LhorfU9iu, kas ietver izmaksu koeficientu) tas izsauks BCrypt :: Engine.hash_secret (parole, sāls), kas aprēķina galīgo jaukumu, kas jāsaglabā, izmantojot ģenerēto sāli un lietotāja izvēlēto paroli. Šis pēdējais jaukums (piemēram, $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) savukārt tiks saglabāts encrypted_passworddatu bāzes kolonnā.

Bet, ja šī jaucēja nav atgriezeniska un sāls pēc nejaušības principa tiek ģenerēts pēc BCrypt::Password.createzvana BCrypt::Engine.generate_salt(cost), kā to var izmantot, lai pierakstītos lietotājā?

Tieši tur šie dažādie hash komponenti ir noderīgi. Pēc tam, kad ir atrasts ieraksts, kas atbilst lietotāja iesniegtajam e-pastam, lai pierakstītos, šifrētā parole tiek izgūta un sadalīta dažādos iepriekš minētajos komponentos ( Bcrypt versija , Izmaksas , Sāls un Kontrolsumma ).

Pēc šīs sākotnējās sagatavošanās sekojošais notiek tālāk:

  1. Ielādēt ievades paroli ( 1234)
  2. Ielādēt saglabātās paroles sāli ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Ģenerējiet jaucējkrānu no paroles un sāls, izmantojot to pašu bcrypt versiju un izmaksu koeficientu ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Pārbaudiet, vai saglabātā jaukšana ir tāda pati kā aprēķinātā 3. darbībā ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

Un tā Devise droši uzglabā paroles un pasargā jūs no dažādiem uzbrukumiem, pat ja jūsu datu bāze ir apdraudēta.

Sazinieties ar Twitter @alvesjtiago un paziņojiet man, ja jums šis raksts šķita interesants! Paldies par lasīšanu.

PS: Es nekādā ziņā neesmu drošības vai kriptogrāfijas eksperts, tāpēc, lūdzu, sazinieties, ja atrodat kaut ko nepareizu. Es ceru, ka, vienkāršojot dažus jēdzienus, būs vieglāk saprast, kas notiek.

Paldies @filipepina, @ivobenedito, @jackveiga, @joao_mags un @pedrosmmoreira par atsauksmēm un ieteikumiem. Šis raksts ir pieejams arī vietnē //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Plašāka informācija par dažām tēmām.

Izmaksu faktors *

  • Noklusējuma bcrypt izmaksu faktora kaitējums
  • Bcrypt ieteicamais kārtu skaits

Varavīksnes galda uzbrukumi **

  • Varavīksnes galds - Wikipedia
  • Kas ir varavīksnes galdi un kā tos izmanto?