I'm assuming that this isn't the best practice as the smart but naughty user could loop through all the possible combinations of the PIN code and wait which one will give him true as a response.
Questo è chiamato un attacco "forza bruta". In linea di principio, è impossibile prevenire attacchi di forza bruta. Semplicemente non c'è modo di impostare uno schema di password che non permetta alle persone di provare a inserire password casuali e vedere cosa succede. Ma puoi rendere incredibilmente difficile per qualcuno capire qual è la password di qualcun altro.
Questa risposta Security.SE è l'ultima introduzione su come memorizzare le password utente e questi numeri PIN sono essenzialmente password per cartella. Cercherò di fornirti un breve riepilogo dei punti chiave qui.
Quando parliamo di memorizzare le password degli utenti in un modo "crittograficamente sicuro", gli obiettivi che solitamente abbiamo in mente sono:
- Esecuzione di un attacco di forza bruta il più difficile possibile senza causare inutili inconvenienti agli utenti legittimi.
- Assicurandosi che non ci sia una "scorciatoia", ovvero nessun attacco più efficace della forza bruta.
Non so fino a che punto si vuole andare con sicurezza per i PIN per cartella, ma le misure concrete che si possono prendere in pratica sono:
- Se un utente inserisce troppi numeri PIN non validi in una riga, non consentire ulteriori tentativi per un po '. Questo è un modo molto semplice per prevenire i più semplici attacchi di forza bruta.
- Richiedi numeri PIN più lunghi. Ovviamente, se hai solo PIN a quattro cifre, semplicemente non ci sono molti numeri diversi da provare, ed è improbabile che il resto delle misure su questo elenco possa essere di grande aiuto.
- Quindi, non memorizzare i numeri PIN effettivi ovunque. Invece, ogni volta che l'utente inserisce un PIN, eseguirlo attraverso una funzione di hashing della password provata e autentica (PBKDF2, bcrypt o scrypt) sul server e memorizzare solo l'hash. Se qualcuno ottiene l'accesso al tuo database, questo assicura che non possono semplicemente cercare i numeri PIN di tutti, o facilmente ricavare i numeri PIN dagli hash del PIN.
- Quindi, configurare la funzione di hashing in modo che sia il più lento possibile senza creare problemi agli utenti. L'idea è che provare una singola password dovrebbe impiegare mezzo secondo anziché un millisecondo. Quindi, se qualcuno riesce a scaricare il tuo database e prova un attacco di forza bruta direttamente sui dati (dove non hai modo di bloccarli dopo troppi guasti), impiegherà un tempo incredibilmente lungo per provare ogni password.
- Infine, aggiungi "sali" nel processo per combattere le tavole arcobaleno. Dubito strongmente che tu voglia arrivare così lontano, quindi non mi preoccuperò di spiegarlo.
Ho il sospetto che per i numeri PIN, i primi due passaggi potrebbero essere sufficienti per te, ma il resto migliorerebbe ancora la sicurezza. E per le password degli account degli utenti reali, ti preghiamo di andare fino in fondo.
Naturalmente, questo riguarda solo le minacce più comuni a cui vogliamo proteggere le password. Per esempio, non fa nulla sull'uomo negli attacchi di mezzo o nell'ingegneria sociale. Ma probabilmente copre i casi di cui sei preoccupato.