Kuidas Devise teie Railsi rakenduse paroole turvaliselt hoiab

Devise on Railsile uskumatu autentimislahendus, millel on rohkem kui 40 miljonit allalaadimist. Kuid kuna see abstrakteerib suurema osa krüptograafilistest toimingutest, ei ole alati lihtne aru saada, mis kulisside taga toimub.

Üks neist abstraktsioonidest lõpeb encrypted_passwordotse andmebaasis püsimisega . Nii et olen alati olnud uudishimulik, mida see tegelikult esindab. Siin on näide:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Aga mida see sohkimine tähendab?

Devise kasutab teabe turvaliseks salvestamiseks Bcrypt'i. Oma veebisaidil mainib ta, et kasutab „ OpenBSD bcrypt () parooli räsimise algoritmi, mis võimaldab teil hõlpsalt oma kasutajate paroolide turvalist räsi salvestada “. Aga mis see räsi täpsemalt on? Kuidas see töötab ja kuidas hoiab salvestatud paroole turvalisena?

Seda tahan teile täna näidata.

Töötame tagasi - alates teie andmebaasi salvestatud räsist kuni krüpteerimise ja dekrüpteerimise protsessini.

See räsi $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOkoosneb tegelikult mitmest komponendist:

  • Bcrypt version ( 2a) - selle räsi tootmiseks kasutatud algoritmi bcrypt ( ) versioon (salvestatud pärast esimest $märki)
  • Kulu ( 11) - räsi loomiseks kasutatud kulutegur (salvestatakse pärast teist $märki)
  • Sool ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - juhuslik string, mis koos teie parooliga muudab selle ainulaadseks (esimesed 29 tähemärki)
  • Kontrollsumma ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - salvestatud tegelik räsiosa encrypted_password(järelejäänud string pärast 29 tähemärki)

Uurime kolme viimast parameetrit:

  • Devise'i kasutamisel määrab Costväärtuse klassi muutuja nimega venitused ja vaikeväärtus on 11. See määrab parooli räsimise kordade arvu. ( Oma devise.rb initsialisaatoril saate selle konfigureerida testkeskkonna jaoks väiksema väärtusega, et testikomplekt töötaks kiiremini. ) *
  • Soola on juhuslik string kasutatakse ühendada algse parooli. See muudab sama parooli krüptituna salvestamisel erinevateks väärtusteks. ( Lisateavet selle kohta, miks see oluline on, ja mis on Rainbow Table Attack s.) **
  • Kontrollsumma on tegelik genereeritud räsialgoritmist parooli olles koos juhusliku soola.

Kui kasutaja registreerib teie rakenduse, peab ta määrama parooli. Enne selle parooli andmebaasi salvestamist luuakse BCrypt :: Engine.generate_salt (cost) kaudu juhuslik sool, võttes arvesse eelnevalt mainitud kulutegurit. (Märkus: kui pepperklassi muutuja väärtus on määratud, lisab see enne soolamist selle paroolile.)

Selle soolaga (nt. $2a$11$yMMbLgN9uY6J3LhorfU9iu, Mis sisaldab ka kulutegurit) kutsub see BCrypt :: Engine.hash_secret (parool, sool), mis arvutab lõpliku salvestatava räsi, kasutades loodud soola ja kasutaja valitud parooli. See viimane räsi (näiteks $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) salvestatakse omakorda encrypted_passwordandmebaasi veergu.

Aga kui see räsi pole pöördumatu ja BCrypt::Password.createkõne korral tekib sool juhuslikult BCrypt::Engine.generate_salt(cost), siis kuidas saab seda kasutaja sisse logimiseks kasutada?

Seal on need erinevad räsikomponendid kasulikud. Pärast kirje leidmist, mis vastab kasutaja sisselogimiseks sisestatud e-posti aadressile, leitakse krüptitud parool ja jagatakse see eespool nimetatud erinevateks komponentideks ( Bcrypti versioon , Kulu , Sool ja Kontrollsumma ).

Pärast seda esialgset ettevalmistust toimub järgmine:

  1. Sisestage parool ( 1234)
  2. Too salvestatud parooli sool ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Looge räsi paroolist ja soolast, kasutades sama bcrypt versiooni ja kulutegurit ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Kontrollige, kas salvestatud räsi on sama, mis arvutatud etapis 3 ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

Nii hoiab Devise paroole turvaliselt ja kaitseb teid mitmesuguste rünnakute eest, isegi kui teie andmebaas on rikutud.

Võtke ühendust Twitteris @alvesjtiago ja andke mulle teada, kui see artikkel tundus teile huvitav! Täname lugemast.

PS: Ma pole mingil juhul turva- ega krüptograafiaekspert, nii et palun võtke ühendust, kui leiate midagi valesti. Loodan, et mõningate mõistete lihtsustamisega on toimuvast lihtsam aru saada.

Täname arvustuste ja ettepanekute eest @filipepina, @ivobenedito, @jackveiga, @joao_mags ja @pedrosmmoreira. See artikkel on saadaval ka aadressil //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Lisateave mõnede teemade kohta.

Kulutegur *

  • Bcrypt vaikekuluteguri ohud
  • Bcryptile soovitatav voorude arv

Vikerkaare rünnakud **

  • Vikerkaarelaud - Vikipeedia
  • Mis on vikerkaarelauad ja kuidas neid kasutatakse?