Creare un generatore di password sicuro è abbastanza semplice, a patto di avere due componenti:
-
Un RNG protetto da crittografia. Ciò significa che l'output dell'RNG è un flusso di bit che non deve essere prevedibile in nessuna condizione. Nella maggior parte dei casi, tuttavia, puoi semplicemente utilizzare un PRNG progettato specificamente per la generazione di chiavi come / dev / urandom, / dev / random o CryptGenRandom. Regolari PRNG come Mersenne Twister non dovrebbero essere utilizzati per la generazione di chiavi. Non dovresti provare a scrivere il tuo CSPRNG a meno che tu non abbia una conoscenza approfondita della matematica CSPRNG. Questa è la parte in cui la maggior parte delle "persone normali che sviluppano generatori di password" spesso non prestano abbastanza attenzione.
-
Un algoritmo di codifica one-to-one. Questo algoritmo codifica il flusso di bit prodotto dall'RNG in qualcosa di accettabile dal sistema che deve utilizzare la password e, per la password memorizzabile, la preferenza dell'utente. Una codifica one-to-one è una funzione che non ha collisioni di output per i suoi input, quindi una funzione non perde alcuna entropia prodotta dall'RNG durante la codifica. Questa è la parte che è in realtà estremamente semplice, ma la maggior parte delle "persone normali che sviluppano generatori di password" spesso si complicano eccessivamente e finiscono per indebolire il loro metodo di generazione della password.
Esempio di algoritmo di codifica one-to-one: Diceware, base64, codifica esadecimale, qualsiasi funzione di hash perfetta . Esempio di algoritmo di trasformazione non adatto alla generazione di password: algoritmo hash più normale.
Una volta che hai questi due componenti, tutto ciò che devi fare è chiedere al CSPRNG un po 'di lunghezza n, dove n è la forza richiesta della tua password, e codificare quel flusso di bit usando l'algoritmo di codifica selezionato.
Pitfall: è necessario parametrizzare l'algoritmo di codifica in modo che non possa mai produrre una password che verrebbe rifiutata dalla politica della password del sistema di destinazione. Se si rifiuta semplicemente una password e la si genera nuovamente utilizzando un valore casuale diverso, si riduce l'entropia. In teoria, ciò significa che è necessario conoscere i dettagli della politica della password esatta di ciascun sistema che è necessario generare per calcolare correttamente la forza della password. In pratica, spesso è sufficiente aggiungere un po 'di forza in più per compensare la perdita di entropia dovuta a una politica di password troppo complicata.
Trappola: per le password memorizzabili, l'utente deve essere addestrato a non rifiutare alcuna password che finisce per trovare difficile da memorizzare in quanto ciò riduce anche l'entropia. Ciò significa che il codificatore di password memorizzabile dovrebbe essere progettato il più possibile in modo da produrre password / parafrasi che è più probabile che vengano accettate dall'utente al primo tentativo. Esistono pochi algoritmi di codifica che lo cercano, ad esempio elenco di parole Diceware o grammaticale Diceware.