È un modo sicuro per generare password sulla riga di comando?

8

Occasionalmente ho bisogno di generare una password mentre lavoro sulla riga di comando di Unix. Ho il seguente alias nel mio zshrc:

alias randpass='openssl rand -base64 32 | tr -d /=+ | cut -c -30'

Questi comandi generano una stringa di 30 caratteri alfanumerici effettuando le seguenti operazioni:

  1. Utilizza OpenSSL per generare 32 byte di dati casuali.
  2. Base64: codifica il risultato.
  3. Rimuovi tutti i caratteri tranne lettere maiuscole, lettere minuscole e cifre.
  4. Troncare il risultato a 30 caratteri.

L'unico difetto che riesco a vedere è che potrebbero essere rimasti meno di 30 caratteri dopo aver rimosso le istanze di / , = e + . Ovviamente, questo richiederebbe che questi tre simboli costituiscano più di un terzo dei caratteri codificati in base64, il che è fenomenalmente improbabile.

L'output di "openssl rand" è sufficientemente casuale da essere utilizzato come base per le password? C'è qualche tipo di pregiudizio introdotto da base64 che codifica i byte casuali? (Suppongo che rimuovere / , = e + introduca un bias ma che questo sia piuttosto minimo.)

    
posta bdesham 18.02.2015 - 22:52
fonte

1 risposta

7

Potresti aumentare il numero di byte a 45. Quindi ti garantiamo che il valore non verrà troncato a meno di 30 byte perché almeno una metà (30 caratteri) dovrà essere / , = o + per eseguire il rendering di una stringa più breve di 30 caratteri.

Sì, è sufficientemente casuale.

Nessun bias viene introdotto da Base64, codificando i caratteri, poiché li converti in un altro formato base. È ancora lo stesso numero esatto. L'unico piccolo errore introdotto è la rimozione di / e + , che corrisponderebbe alla rimozione di ogni occorrenza di 111110 e 111111 nella stringa, in pratica si perderebbero solo 2 bit di entropia su una stringa che è 180 bit, ridurrebbe il random a 178 bit, che è ancora molto meglio di una stringa SHA1 (che molte password sono memorizzate come), MD5 o AES 128.

Il carattere = è solo padding e non ha alcun valore significativo in una stringa base64.

    
risposta data 19.02.2015 - 01:55
fonte

Leggi altre domande sui tag