Quindi, quando si parla di sicurezza, quando ho un'idea che sembra buona, ma sembra che nessun altro stia facendo, cerco di presumere che sto trascurando qualcosa di ovvio o comunque significativo. Questo è uno di questi casi ...
Il contesto di questa domanda è un sistema di autenticazione su cui sto lavorando. Ho implementato sistemi simili in passato, e generalmente ho la testa intorno alla cosa "sale e hashing", ma non sono affatto un esperto in sicurezza crittografica.
Mentre stavo definendo l'archiviazione per 16 byte casuali di sale sui miei record utente, mi è venuto in mente che potrebbe esserci un modo per ridurre la superficie di attacco nel caso in cui qualcuno mi abbia rubato o in altro modo dati utente. Sto operando al di fuori delle seguenti ipotesi:
- Se un hacker ruba i miei dati utente, hanno accesso a una rappresentazione salata + (ripetutamente) con hash della password dell'utente, e il valore salt stesso.
- Se l'hacker vuole determinare il valore in testo semplice di quella password, hanno un po 'di bruteforce di fronte a loro.
- Tuttavia, dato il sale, lo spazio di ricerca di quell'attacco di forza bruta è notevolmente ridotto. *
* Non sono sicuro al 100% che il punto tre sia corretto, ma ha senso che se un algoritmo di forza bruta può assumere che il valore pre-hash sia composto da <8-or-so-bytes-of-password> + <16-bytes-from-stolen-salt>
(o una combinazione simile di password e sali), quindi abbiamo ridotto lo spazio di ricerca per quantità algoritmicamente significative.
< scuse obbligatorie a metà domanda per la lunghezza di questa domanda qui >
Quindi, considerando quanto sopra è la mia attuale linea di pensiero, la soluzione che sto considerando essenzialmente si riduce all'utilizzo di valori costanti e conosciuti su un utente per generare dinamicamente un sale da utilizzare durante la fase di hashing.
Dato che i valori di sale non hanno davvero bisogno di essere crittograficamente "nulla", a patto che non siano guidabili fino al punto di richiedere la scoperta di bruteforce, è sufficiente prendere essenzialmente alcune trasformazioni, ad esempio, del nome utente e della password forniti (ad esempio, applicare alcuni valori di SHA-2 e crittografi proprietari) e utilizzarli nel passaggio di hashing?
Naturalmente se qualcuno dovesse rubare il codice, la generazione di sale "segreta" è inutile. L'unica sicurezza aggiunta che sto cercando di raggiungere è costringere l'hacker a rubare i miei dati e il mio codice se vogliono la praticità dello spazio di ricerca ridotto descritto sopra al punto 3.
Spero di aver adeguatamente (e non troppo in modo verboso) descritto la mia domanda e il mio ragionamento. La domanda specifica a cui spero di avere una risposta è se questo sia o meno un metodo crittografico (o altrimenti) sicuro per archiviare e confrontare le password degli utenti.
Modifica: Sembra che i punti chiave della mia domanda potrebbero essersi persi nel rumore sopra. Lasciatemi provare ad essere più esplicito:- L'accesso al sale utilizzato nella generazione di un valore hash aiuta sostanzialmente un attacco di forza bruta alla scoperta della password effettiva?
- In tal caso, è quindi logico che l'hacker debba rubare il mio codice oltre ai dati stessi?
- L'approccio generale di generare dinamicamente il sale (usando mezzi riproducibili, non casuali, ma non guidabili) è sconsigliato?