Quali considerazioni sulla sicurezza ci sono quando si sviluppa un generatore di password casuali?

6

Vorrei implementare un programma per la creazione di password, simile a quelli forniti da Symantec e LastPass. Questo programma consentirà all'utente di specificare semplicemente diverse lunghezze e opzioni della password.

Ci sono delle considerazioni sulla sicurezza che dovrebbero essere fatte oltre all'uso di un generatore di numeri pseudo-casuali crittograficamente sicuro negli algoritmi? Il mio piano era quello di utilizzare qualcosa come RNGCryptoServiceProvider. "Generatore di password casuali sicuro" indica uno che non sia almeno a corto di finestre o suscettibile di difetti futili dovuti a un'implementazione impropria. Questa non è un'applicazione in rete.

Nota: non ho intenzione di "rolling my own" crypto o hashing.

    
posta the_endian 13.03.2017 - 18:29
fonte

2 risposte

5

Creare un generatore di password sicuro è abbastanza semplice, a patto di avere due componenti:

  1. 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.

  2. 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.

    
risposta data 15.03.2017 - 03:13
fonte
2

La considerazione principale per un generatore di password è che non produce output prevedibili. Il punto delle password casuali è che il miglior attacco contro di loro è la forza bruta, ma se c'è un pregiudizio, un attaccante può avvantaggiarsi per ridurre il loro spazio di ricerca.

Lungo linee simili, spesso le persone vogliono ulteriori restrizioni, come "pronunciante". Questo può essere un vantaggio per la sicurezza (puoi ricordare le password invece di memorizzarle) e uno svantaggio (introducendo pregiudizi, vedi sopra). Se sei interessato a questo, è importante stare molto attenti a non introdurre ulteriori errori nell'algoritmo, poiché si tratta di un problema più complesso della semplice generazione di caratteri casuali.

    
risposta data 14.03.2017 - 06:23
fonte

Leggi altre domande sui tag