Hogyan őrzi a Devise a Rails alkalmazás jelszavait

A Devise hihetetlen hitelesítési megoldás a Rails számára, több mint 40 millió letöltéssel. Mivel azonban a kriptográfiai műveletek nagy részét kivonja, nem mindig könnyű megérteni, mi történik a kulisszák mögött.

Az ilyen absztrakciók egyike encrypted_passwordközvetlenül az adatbázisban fennmarad . Tehát mindig kíváncsi voltam, hogy mit is képvisel valójában. Íme egy példa:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

De mit jelent ez a hamisítás?

A Devise a Bcrypt használatával biztonságosan tárolja az információkat. Weboldalán megemlíti, hogy az „ OpenBSD bcrypt () jelszó-elosztó algoritmust használja, amely lehetővé teszi a felhasználók jelszavainak biztonságos kivonatának tárolását ”. De mi is ez a hash? Hogyan működik és hogyan tartja biztonságban a tárolt jelszavakat?

Ezt szeretném ma megmutatni neked.

Dolgozzunk hátra - az adatbázisban tárolt hash-tól a titkosítási és visszafejtési folyamatig.

Ez a hash $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOvalójában több összetevőből áll:

  • Bcrypt version ( 2a) - a bcrypt () algoritmusnak a kivonat előállításához használt verziója (az első $jel után tárolva )
  • Költség ( 11) - a kivonat létrehozásához használt költségtényező (a második $jel után tárolva )
  • Salt ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - véletlenszerű karakterlánc, amely a jelszavával kombinálva egyedivé teszi (az első 29 karakter)
  • Ellenőrző összeg ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - a tárolt tényleges kivonatrész encrypted_password(a 29 karakter után megmaradt karakterlánc)

Fedezzük fel az utolsó 3 paramétert:

  • A Devise használatakor az Costértéket a stretch nevű osztályváltozó állítja be, az alapértelmezett érték pedig 11. Megadja a jelszó kivonatolásának számát. ( A devise.rb inicializálón ezt beállíthatja alacsonyabb értékre a tesztkörnyezet számára, hogy a tesztcsomag gyorsabban fusson. ) *
  • A az a véletlenszerű karakterlánc, amelyet az eredeti jelszóval kombinálnak. Ez teszi ugyanazt a jelszót eltérő értékűvé titkosítva tárolva. (Az alábbiakban többet megtudhat arról, hogy ez miért számít és mi a Rainbow Table Attack s.) **
  • Az ellenőrző összeg a jelszó tényleges generált kivonata, miután a véletlenszerű sóval kombinálták.

Amikor egy felhasználó regisztrál az alkalmazásában, be kell állítania egy jelszót. Mielőtt ezt a jelszót az adatbázisban tárolnák, egy véletlenszerű sót generálunk a BCrypt :: Engine.generate_salt (költség) segítségével a korábban említett költségtényező figyelembe vételével. (Megjegyzés: ha az pepperosztályváltozó értéke be van állítva, akkor az sózása előtt hozzáfűzi az értéket a jelszóhoz.)

Ezzel a sóval (pl. $2a$11$yMMbLgN9uY6J3LhorfU9iu, Amely tartalmazza a költségtényezőt is) meghívja a BCrypt :: Engine.hash_secret (jelszó, só) nevet, amely kiszámítja a tárolni kívánt végső kivonatot a létrehozott só és a felhasználó által kiválasztott jelszó felhasználásával. Ez a végső kivonat (például $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) viszont encrypted_passwordaz adatbázis oszlopában lesz tárolva .

De ha ez a kivonat nem visszafordítható, és a sót véletlenszerűen generálja a BCrypt::Password.createhívás BCrypt::Engine.generate_salt(cost), akkor hogyan lehet felhasználni a felhasználó bejelentkezéséhez?

Itt hasznosak azok a különböző hash-összetevők. Miután megtalálta azt a rekordot, amely megegyezik a felhasználó által a bejelentkezéshez megadott e-mail címmel, a titkosított jelszó beolvasásra kerül, és a fent említett különböző összetevőkre ( Bcrypt verzió , Költség , és Ellenőrző összeg ) oszlik fel .

A kezdeti előkészítés után a következők történnek:

  1. A bemeneti jelszó ( 1234) lekérése
  2. Hozza le a tárolt jelszó sóját ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Hozza létre a kivonatot a jelszóból és a sóból ugyanazzal a bcrypt verzióval és költségtényezővel ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Ellenőrizze, hogy a tárolt kivonat megegyezik-e a 3. lépésben kiszámítottal ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

És így tárolja a Devise a jelszavakat biztonságosan, és megvédi Önt egy sor támadástól, még akkor is, ha az adatbázisa sérül.

Vegye fel a kapcsolatot a Twitter @alvesjtiago oldalon, és tudassa velem, ha érdekesnek találta ezt a cikket! Köszönöm, hogy elolvasta.

PS: Korántsem vagyok biztonsági vagy titkosítási szakértő, ezért kérjük, forduljon hozzá, ha valami hibát talál. Remélem, hogy egyes fogalmak egyszerűsítésével könnyebb megérteni, mi történik.

Köszönöm @filipepina, @ivobenedito, @jackveiga, @joao_mags és @pedrosmmoreira a véleményeket és javaslatokat. Ez a cikk a //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe címen is elérhető.

További információk néhány témáról.

Költségtényező *

  • Az alapértelmezett bcrypt költségtényező veszélyei
  • A bcrypt számára ajánlott körök száma

Szivárványasztal támadások **

  • Szivárvány asztal - Wikipédia
  • Mik azok a szivárványos asztalok és hogyan használják őket?