Script bash per generare password da dizionario per un di elenco utenti
A volte si ha l'esigenza, avendo un elenco di persone, di generare in automatico un elenco di utenti con relative password.
Per quanto riguarda le password, si vuole fare in modo che siano facilmente ricordabili ma allo stesso tempo abbastanza sicure e difficilmente attaccabili da un eventuale attacco brute force.
Affinchè siano facilmente ricordabili è comodo che siano parole da dizionario, mentre per renderle abbastanza sicure è bene che siano formate da almeno 2 o 3 parole che aumenta enormemente le combinazioni possibili.
Per avere un idea della validità della password esistono molti siti online che danno una stima di tempo per scoprirla, uno di questi è quello di Kaspersky.
Ad esempio, se la password è piovere, è veramente facile da scoprire con un attacco brute force, all'incirca 8 secondi con un normale PC:
se aggiungiamo una seconda parola, piovere svagava, aumenta di molto il tempo portandolo a secoli per un normale PC e, stando a quanto dice Kaspersky, circa 7 giorni per il supercomputer più potente del mondo, il cinese Tianhe-2:
siccome non ci va che i cinesi (ne nessun altro abbia un supercomputer) scoprano la nostra password, aggiungiamo un ulteriore parola: piovere svagava esportai.
Ora possiamo dire di avere una password facile da ricordare ma anche abbastanza sicura perfino da un attacco brute force fatto con Tianhe-2:
A questo punto non resta che farci uno script per generare password casuali da dizionario. Su Linux sono già presenti dei dizionari nel percorso /usr/share/dict/ ma se ne possono trovare molti altri in internet.
Supponendo di avere un file dictionary.txt contenente 60453 parole, possiamo creare uno script chiamato generate_random_password con il seguente codice:
#!/bin/bash generate_random() { RANDOM_NUMBER=`/usr/bin/perl -e 'print int(rand(60453));'` } generate_random randomWord1=`head -$RANDOM_NUMBER ./dictionary.txt | tail -1` generate_random randomWord2=`head -$RANDOM_NUMBER ./dictionary.txt | tail -1` generate_random randomWord3=`head -$RANDOM_NUMBER ./dictionary.txt | tail -1` echo "$randomWord1 $randomWord2 $randomWord3"
Provando ad eseguirlo nel seguente modo
./generate_random_password
si dovrebbe ottenere come output un elenco casuale di 3 parole.
Ora non resta che creare il file degli utenti che volevamo all'inizio.
Supponiamo di avere il seguente elenco di persone in un file CSV:
FINARDI;PAOLO GARIBALDI;GIUSEPPE MAZZINI;GIUSEPPE PAPERINO;PAOLINO CHE GUEVARA;ERNESTO WASHINGTON;GEORGE LINCOLN;ABRAHAM TSE TUNG;MAO D'ALESSANDRO;MARCO
vorremmo ottenere un file CSV in output con le seguente struttura:
- UserName: composto dalla prima lettera del nome (FirstName) e dall'intero cognome (LastName) senza spazi od apostrofi, tutto minuscolo
- Cognome (LastName)
- Nome (FirstName)
- Gruppo di dominio: fisso "domusers"
- Password: formata da 3 parole casuali da dizionario
Lo script, che chiameremo generate_users, avrà il seguente codice:
#!/bin/bash # Eseguibile che genera password random PwdGen="./generate_random_password" # definisco il separatore del CSV IFS=";" while read LastName FirstName do # Genera una password random Pwd=$($PwdGen) # converto nome e cognome in minuscolo FirstNameLC=${FirstName,,} LastNameLC=${LastName,,} # elimino spazi e apostrofi (') dal cognome LastNameLC="$(echo -e "$LastNameLC" | tr -d '[[:space:]]')" LastNameLC="$(echo -e "$LastNameLC" | tr -d \')" # ...altre info UserName=${FirstNameLC:0:1}$LastNameLC Group=domusers # output dati utente nel file user_out.csv echo $UserName,$LastName,$FirstName,$Group,$Pwd done < users_in.csv > users_out.csv
Eseguendo lo script nel seguente modo:
./generate_users
otterremo il file users_out.csv con il seguente contenuto:
pfinardi,FINARDI,PAOLO,domusers,biasimi frequento affettavi ggaribaldi,GARIBALDI,GIUSEPPE,domusers,affiaterai universi vesti gmazzini,MAZZINI,GIUSEPPE,domusers,avvicini sognerebbe barassi ppaperino,PAPERINO,PAOLINO,domusers,spill danzaste schedario echeguevara,CHE GUEVARA,ERNESTO,domusers,cercando crollava ammireremo gwashington,WASHINGTON,GEORGE,domusers,durereste slittare insacchera alincoln,LINCOLN,ABRAHAM,domusers,bruscolo fiaccati truccano mtsetung,TSE TUNG,MAO,domusers,spezzerete fascerete alterno mdalessandro,D'ALESSANDRO,MARCO,domusers,badano stillando sboccia
ovviamente, ad ogni esecuzione le password cambierebbero.
Spero possa essere utile come lo è stato per me 😉