Kuinka Devise pitää Rails-sovelluksen salasanat turvassa

Devise on uskomaton autentikointiratkaisu Railsille, jolla on yli 40 miljoonaa latausta. Koska se kuitenkin tiivistää suurimman osan salaustoiminnoista, ei ole aina helppoa ymmärtää, mitä kulissien takana tapahtuu.

Yksi näistä abstraktioista huipentuu encrypted_passwordsuoraan tietokantaan pysymiseen. Joten olen aina ollut utelias siitä, mitä se todella edustaa. Tässä on esimerkki:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Mutta mitä tuo katkeruus tarkoittaa?

Devise tallentaa tietoja turvallisesti Bcryptin avulla. Sivustollaan mainitaan, että se käyttää " OpenBSD bcrypt () -salasanan hajautusalgoritmia, jonka avulla voit helposti tallentaa käyttäjien salasanojen suojatun hashin ". Mutta mikä tämä hash on? Kuinka se toimii ja miten se pitää tallennetut salasanat turvassa?

Sitä haluan näyttää sinulle tänään.

Työskentelemme taaksepäin - tietokannasi tallennetusta hashista salaukseen ja salauksen purkuun.

Se hash $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOkoostuu itse asiassa useista komponenteista:

  • Bcrypt-versio ( 2a) - tämän hash-koodin tuottamiseen käytetty bcrypt () -algoritmin versio (tallennettu ensimmäisen $merkin jälkeen)
  • Kustannukset ( 11) - hashin luomiseen käytetty kustannustekijä (tallennettu toisen $merkin jälkeen)
  • Suola ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - satunnainen merkkijono, joka yhdistettynä salasanasi tekee siitä ainutlaatuisen (ensimmäiset 29 merkkiä)
  • Tarkistussumma ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - tallennetun todellinen hajautusosa encrypted_password(jäljellä oleva merkkijono 29 merkin jälkeen)

Tutkitaan viimeisiä 3 parametria:

  • Deviseä käytettäessä Costarvo asetetaan luokan muuttujalla nimeltä venytykset ja oletusarvo on 11. Se määrittää kuinka monta kertaa salasana hajautetaan. ( Devise.rb-alustusohjelmassasi voit määrittää tämän pienemmälle arvolle testiympäristössä, jotta testipaketti toimii nopeammin. ) *
  • Suola on satunnainen merkkijono yhdistää alkuperäinen salasana. Siksi samalla salasanalla on erilaiset arvot salattuina. ( Katso lisätietoja alla miksi sillä on merkitystä ja mitkä ovat Rainbow Table Attack s.) **
  • Tarkistussumma on todellinen tiivisteen generoidun tiivisteen salasanan jälkeen yhdistetään satunnainen suola.

Kun käyttäjä rekisteröityy sovellukseesi, hänen on asetettava salasana. Ennen kuin tämä salasana tallennetaan tietokantaan, BCrypt :: Engine.generate_salt (cost) -sovelluksesta muodostetaan satunnaissoola ottaen huomioon aiemmin mainittu kustannustekijä. (Huomaa: jos pepperluokan muuttujan arvo on asetettu, se lisää arvon salasanaan ennen sen suolaamista.)

Tällä suolalla (esim. $2a$11$yMMbLgN9uY6J3LhorfU9iu, Joka sisältää kustannustekijän) se kutsuu BCrypt :: Engine.hash_secret (salasana, suola), joka laskee lopullisen tallennettavan tiivisteen käyttämällä muodostettua suolaa ja käyttäjän valitsemaa salasanaa. Tämä viimeinen hash (esimerkiksi $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) tallennetaan puolestaan encrypted_passwordtietokannan sarakkeeseen.

Mutta jos tämä hajautusarvo on peruuttamaton ja suola syntyy satunnaisesti BCrypt::Password.createpuhelusta BCrypt::Engine.generate_salt(cost), miten sitä voidaan käyttää käyttäjän kirjautumiseen?

Siellä nämä erilaiset hash-komponentit ovat hyödyllisiä. Löydetty tietue, joka vastaa käyttäjän kirjautumiseen lähettämää sähköpostiosoitetta, salattu salasana haetaan ja jaetaan edellä mainittuihin komponentteihin ( Bcrypt-versio , Kustannukset , Suola ja Tarkistussumma ).

Tämän alkuvaiheen jälkeen, mitä tapahtuu seuraavaksi:

  1. Hae salasana ( 1234)
  2. Hae tallennetun salasanan suola ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Luo hash salasanasta ja suolasta käyttämällä samaa bcrypt-versiota ja kustannustekijää ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Tarkista, onko tallennettu hash sama kuin vaiheessa 3 laskettu ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

Ja näin Devise tallentaa salasanat turvallisesti ja suojaa sinua useilta hyökkäyksiltä, ​​vaikka tietokanta olisi vaarantunut.

Ota yhteyttä Twitteriin @alvesjtiago ja ilmoita minulle, jos pidit tätä artikkelia mielenkiintoisena! Kiitos, että luit.

PS: En ole missään nimessä tietoturva- tai salausasiantuntija, joten ota yhteyttä, jos löydät jotain vikaa. Toivon, että yksinkertaistamalla joitain käsitteitä on helpompi ymmärtää, mitä tapahtuu.

Kiitos @filipepina, @ivobenedito, @jackveiga, @joao_mags ja @pedrosmmoreira arvosteluista ja ehdotuksista. Tämä artikkeli on saatavana myös osoitteesta //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Lisätietoja joistakin aiheista.

Kustannustekijä *

  • Bcrypt-oletuskustannustekijän vaarat
  • Suositeltava määrä kierroksia bcryptille

Sateenkaaripöydän hyökkäykset **

  • Sateenkaaripöytä - Wikipedia
  • Mitä sateenkaaripöydät ovat ja miten niitä käytetään?