In natura abbiamo una tabella degli utenti. Una tabella utenti è solitamente
ID | nome utente | sale | password_crittografata | horridly_insecure_reset_key ================================================= ========================== 1 | utente1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL2 | utente2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL3 | utente3 | baz | 09b6d39aa22fcb8698687e1af09a3af9 | reset
Quindi un metodo di autenticazione sarà simile a
def authenticate (user, password) u = User.find (user: user) return u. encrypted_password == encrypt (password + u.salt) end
Avendo un salt per utente assicura che anche se la password per utente1 è nota non puoi capire la password per utente2 o user3 senza il loro sale.
Ti assicuri anche di non poter capire il sale disponendo di una serie di password crittografate e provando alcune password crittografate.
In sostanza, in questo modo, ogni attacco contro un l'utente deve essere avviato da zero.
Anche se un utente malintenzionato ha un elenco di utenti e sali, deve comunque eseguire il cracking contro ogni utente per vedere se ha una password corrispondente. Se avessi un pool di sali o un sale statico, potrei sapere che la password dell'utente1 è password e quindi trovare tutte le password crittografate che corrispondono. Quindi in questo modo li rallenta almeno un po 'di più.
Ora, quando guardiamo ai sali, vogliamo ridurre il riutilizzo del sale. Due sali identici renderanno più facile agli attaccanti. Se due persone condividono lo stesso sale e la stessa password, la violazione di un utente interromperà l'altro.
Quindi diciamo che usiamo solo questi tre sali. E abbiamo 3000 utenti. ciò significa che 1000 persone hanno lo stesso sale. Se l'1% di questi ha una password di "password", allora quelle persone possono essere violate tutte allo stesso tempo. 10 account vengono violati contemporaneamente. Perché conosciamo i tre sali. È molto facile far attaccare 30 persone contemporaneamente.
Ora se ogni sale è unico. E sappiamo che la password di user1 è password, questo non ti serve a niente. Hai ancora solo crackato 1 utente. Devi ancora fare "does password + salt = encrypted password" per tutti gli altri 2999 utenti.
Una nota davvero importante.
La sicurezza attraverso l'oscurità non è sicurezza. Ciò non significa che dovresti pubblicare la tabella degli utenti su Google perché è sciocco. Ma quando si misura la sicurezza, si dovrebbe presumere che l'attaccante abbia tutto. Non si può dire: "Ma non conosceranno il sale dell'applicazione perché non hanno il codice sorgente". Perché potrebbero. Non significa dare via i tuoi sali, significa solo che non è vera sicurezza. Supponi che abbiano il nome utente e il sale, quindi cerca di rendere più difficile per loro ottenere la password.
NOTA SUPER IMPORTANTE
il codice e la tabella utilizzati qui sono circa 9.000 volte troppo semplici per un uso reale. Le password non sono criptate, i sali sono troppo corti, il metodo è un po 'semplicistico, insomma fare qualcosa del genere in produzione non è niente che debba essere considerato sicuro. Ho scelto questi perché lì semplici per il punto di dimostrazione, non perché sono sicuri.