Ut i naturen har vi en brukertabell. En brukertabell er vanligvis
ID | brukernavn | salt | kryptert_passord | horridly_insecure_reset_key ===================================================== ============================ 1 | bruker1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL2 | bruker2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL3 | bruker3 | baz | 09b6d39aa22fcb8698687e1af09a3af9 | reset
Da vil en autentiseringsmetode se ut som
def authenticate (user, password) u = User.find (user: user) return u. encrypted_password == kryptere (passord + u.salt) slutt
Ved å ha salt per bruker sørger det for at selv om passordet for bruker1 er kjent, kan du ikke finne ut passordet for bruker2 eller bruker3 uten salt.
Du sørger også for at du ikke kan finne ut saltet ved å ha et sett med krypterte passord og prøve noen få krypterte passord.
I utgangspunktet, alle angrep mot en brukeren må startes fra bunnen av.
Selv om en angriper har en liste over brukere og salter, må de fremdeles knekke mot hver bruker for å se om de har et passord. Hvis du hadde en saltsamling, eller ett statisk salt, kunne jeg vite at bruker1s passord er passord og så bare finne alle de krypterte passordene som samsvarer. Så denne måten reduserer dem i det minste litt mer.
Nå når vi ser på salter, vil vi redusere saltbruk. To identiske salter vil gjøre det lettere for angripere. Hvis to personer deler det samme saltet og det samme passordet, bryter den ene brukeren den andre.
Så la oss si at vi bare bruker disse tre saltene. Og vi har 3000 brukere. det betyr at 1000 mennesker har samme salt. Hvis 1% av dem har passordet "passord", kan disse menneskene knekkes samtidig. 10 kontoer blir hacket samtidig. Fordi vi kjenner de tre saltene. Det er en veldig enkel strekning for å få angrepet 30 personer samtidig.
Nå, hvis hvert salt er unikt. Og vi vet at bruker1 passord er passord, det gjør ikke noe bra for deg. Du har fortsatt bare knekt 1 bruker. Du må fremdeles gjøre "gjør passord + salt = kryptert passord" for alle andre 2999 brukere.
En veldig viktig merknad.
Sikkerhet gjennom uklarhet er ikke sikkerhet. Det betyr ikke at du bør legge ut brukerbordet ditt på google fordi det er dumt. Men når du måler sikkerhet, bør du anta at angriperen har alt. Du kan ikke si, "Men de vet ikke applikasjonssaltet, fordi de ikke har kildekoden". Fordi de kunne. Betyr ikke å gi bort saltene dine, det betyr bare at det ikke er reell sikkerhet. Anta at de har brukernavnet og saltet, og prøv å gjøre det vanskeligere for dem å få passordet.
SUPER VIKTIG MERKNAD
kode og tabell som brukes her er omtrent 9 000 ganger for enkle til reell bruk. Passordet er ikke kryptert, saltene er for korte, metoden er litt forenklet, kort sagt å gjøre noe som dette i produksjonen er ikke noe som skal betraktes som sikkert. Jeg valgte disse sakene der for demonstrasjonspoenget, ikke fordi de er sikre.