Out in the wild abbiamo una tabella utenti. Una tabella utenti è in genere
ID | username | salt | encrypted_password | horridly_insecure_reset_key
===========================================================================
1 | user1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL
2 | user2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL
3 | user3 | 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 sale per utente garantisce che anche se la password per utente1 è nota, non è possibile determinare la password per user2 o user3 senza il loro sale.
Inoltre, assicurati di non riuscire a trovare il sale con una serie di password crittografate e provare alcune password crittografate.
In sostanza, in questo modo, ogni attacco contro un utente deve essere avviato da zero.
Anche se un utente malintenzionato ha un elenco di utenti e di sali, ha ancora bisogno di fare il cracking contro ogni singolo utente per vedere se hanno una corrispondenza di password. Se disponevi di un pool di sali o di un sale statico, potrei sapere che la password dell'utente1 è password e quindi trovare tutte le password crittografate corrispondenti. Quindi in questo modo almeno li rallenta un po 'di più.
Ora, quando guardiamo i 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 rottura di un utente interromperà l'altra.
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 quelli ha una password di "password", allora queste persone possono essere violate tutte allo stesso tempo. 10 account vengono hackerati contemporaneamente. Perché conosciamo i tre sali. È molto facile ottenere 30 persone attaccate contemporaneamente.
Ora se ogni sale è unico. E sappiamo che la password dell'utente1 è la password, che non ti aiuta. Hai ancora crackato solo 1 utente. Devi ancora eseguire "password + sale = password crittografata" per tutti gli altri 2999 utenti.
Una nota davvero importante.
La sicurezza attraverso l'oscurità non è sicurezza. Ciò non significa che devi pubblicare la tabella degli utenti su Google perché è sciocco. Ma quando si misura la sicurezza, si dovrebbe presumere che l'attaccante abbia tutto. Non puoi dire "Ma non conosceranno l'applicazione perché non hanno il codice sorgente". Perché potrebbero. Non significa dare via i tuoi sali, significa solo che non è una vera sicurezza. Supponiamo che abbiano il nome utente e il sale, quindi cercano di rendere più difficile per loro ottenere la password.
SUPER IMPORTANT NOTE
Il codice e la tabella utilizzati qui sono circa 9.000 volte troppo semplici per l'uso reale. La password non è crittografata, i sali sono troppo corti, il metodo è un po 'semplicistico, in breve fare qualcosa di simile in produzione non è qualcosa che dovrebbe essere considerato sicuro. Ho scelto queste cause per il semplice scopo di dimostrazione, non perché siano sicure.