Kaip „Devise“ saugo jūsų „Rails“ programos slaptažodžius

„Devise“ yra neįtikėtinas „Rails“ autentifikavimo sprendimas, kurį galima atsisiųsti daugiau nei 40 mln. Vis dėlto, kadangi tai apibendrina daugumą kriptografinių operacijų, ne visada lengva suprasti, kas vyksta užkulisiuose.

Viena iš tų abstrakcijų baigiasi tiesios encrypted_passwordduomenų bazėje išlikimu . Taigi man visada buvo įdomu, ką tai iš tikrųjų reiškia. Štai pavyzdys:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Bet ką reiškia tas niekinimas?

„Devise“ saugiai saugo informaciją naudodama „Bcrypt“. Savo svetainėje ji mini, kad naudoja „ OpenBSD bcrypt () slaptažodžių maišos algoritmą, leidžiantį jums lengvai saugiai saugoti savo vartotojų slaptažodžių maišos “. Bet kas tai yra maišos? Kaip tai veikia ir kaip saugomi saugomi slaptažodžiai?

Tai aš noriu jums šiandien parodyti.

Dirbkime atgal - nuo saugomos maišos jūsų duomenų bazėje iki šifravimo ir iššifravimo proceso.

Šį maišos $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOiš tikrųjų sudaro keli komponentai:

  • Bcrypt versija ( 2a) - iš bcrypt () algoritmo versija naudojama gaminti šį maišos (saugomi po pirmojo $ženklu)
  • Kaina ( 11) - išlaidų koeficientas, naudojamas kuriant maišų (saugomas po antrojo $ženklo)
  • „Druska“ ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - atsitiktinė eilutė, kurią sujungus su slaptažodžiu ji tampa unikali (pirmieji 29 simboliai)
  • Kontrolinė suma ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - faktinė saugomos maišos dalis encrypted_password(likusi eilutė po 29 simbolių)

Panagrinėkime paskutinius 3 parametrus:

  • Naudojant „Devise“, Costvertę nustato klasės kintamasis, vadinamas tempimais, o numatytoji reikšmė yra 11. Jame nurodomas slaptažodžio maišos kartų skaičius. ( „Devise.rb“ inicializatoriuje galite sukonfigūruoti mažesnę bandomosios aplinkos vertę, kad bandymo rinkinys veiktų greičiau. ) *
  • Druskos yra atsitiktinė seka naudojama sujungti su pirminiu slaptažodžiu. Tai lemia, kad tas pats slaptažodis turi skirtingas reikšmes, kai jis saugomas užšifruotas. ( Žr. Toliau žemiau apie tai, kodėl tai svarbu ir kas yra „Rainbow Table Attack“ s.) **
  • Kontrolinė suma yra faktinė sugeneruota slaptažodžio maiša, sujungus ją su atsitiktine druska.

Kai vartotojas užsiregistruoja jūsų programoje, jis turi nustatyti slaptažodį. Prieš saugant šį slaptažodį duomenų bazėje, naudojant „BCrypt :: Engine.generate_salt (cost)“ sukuriama atsitiktinė druska, atsižvelgiant į anksčiau minėtą sąnaudų faktorių. (Pastaba: jei nustatyta pepperklasės kintamojo vertė, ji prieš sūdydama pridės savo vertę prie slaptažodžio.)

Su ta druska (pvz. $2a$11$yMMbLgN9uY6J3LhorfU9iu, Į kurią įeina sąnaudų faktorius), ji iškvies BCrypt :: Engine.hash_secret (slaptažodis, druska), kuri apskaičiuos galutinį maišos įrašą naudodama sukurtą druską ir vartotojo pasirinktą slaptažodį. Šis galutinis maišas (pvz., $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) Savo ruožtu bus saugomas encrypted_passwordduomenų bazės stulpelyje.

Bet jei ši maiša yra negrįžtama ir druska atsitiktinai susidaro BCrypt::Password.createskambinant BCrypt::Engine.generate_salt(cost), kaip ją naudoti prisijungiant prie vartotojo?

Štai kur tie skirtingi maišos komponentai yra naudingi. Radus įrašą, kuris atitinka vartotojo pateiktą prisijungimo el. Laišką, užšifruotas slaptažodis gaunamas ir suskirstomas į skirtingus aukščiau minėtus komponentus („ Bcrypt“ versija , kaina , druska ir kontrolinė suma ).

Po šio pirminio pasirengimo, kas atsitiks toliau:

  1. Gauti įvesties slaptažodį ( 1234)
  2. Gaukite saugomos slaptažodžio druską ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Generuokite maišos iš slaptažodžio ir druskos naudodami tą pačią „bcrypt“ versiją ir išlaidų faktorių ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Patikrinkite, ar saugoma maiša yra tokia pati kaip apskaičiuota atlikus 3 veiksmą ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

„Devise“ saugiai saugo slaptažodžius ir apsaugo jus nuo įvairių atakų, net jei jūsų duomenų bazė yra pažeista.

Susisiekite su „Twitter“ @ alvesjtiago ir praneškite man, jei šis straipsnis jums pasirodė įdomus! Ačiū, kad skaitėte.

PS: Aš jokiu būdu nesu saugumo ar kriptografijos ekspertas, todėl susisiekite, jei radote ką nors negero. Tikiuosi, kad supaprastinus kai kurias sąvokas bus lengviau suprasti, kas vyksta.

Ačiū @filipepina, @ivobenedito, @jackveiga, @joao_mags ir @pedrosmmoreira už atsiliepimus ir pasiūlymus. Šis straipsnis taip pat pasiekiamas adresu //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Daugiau informacijos apie kai kurias temas.

Sąnaudų faktorius *

  • Numatytojo bcrypt sąnaudų faktoriaus pavojai
  • Rekomenduojamas bcrypt raundų skaičius

Vaivorykštės stalo atakos **

  • Vaivorykštės stalas - Vikipedija
  • Kas yra vaivorykštės stalai ir kaip jie naudojami?