Mi sono chiesto se ci fosse un modo, utilizzando Excel, di generare una password casuale di lunghezza arbitraria con una singola formula.
Naturalmente utilizzando VBA sarebbe semplicissimo, si potrebbe creare una propria funziona ed utilizzarla all’interno della formula. In alternativa si potrebbe creare una tabella di riferimento e generare la password a partire da essa (qui c’è un esempio interessante).
Però mi sono impuntato a voler creare una singola formula, utilizzando le funzioni disponibili nativamente in Excel, per generare una password di lunghezza arbitraria.
Soluzione veloce
Per chi non avesse voglia di proseguire nell’analisi della questione la soluzione è la seguente (per 1 singolo carattere preso tra maiuscole, minuscole, numeri e caratteri speciali):
1 |
=INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4)) |
Per generare una password di 2 caratteri basta concatenare la formula precedente per 2 volte, di 3 caratteri per 3 volte ecc (di seguito l’esempio per 2 caratteri):
1 |
=INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4)) |
Spiegazione
Anzitutto partiamo dalla seguente idea. Se avessi un vettore di 3 caratteri, potrei estrarre casualmente uno dei tre caratteri?
Per farlo mi è sufficiente scrivere:
1 |
=INDICE({10.20.30};CASUALE.TRA(1;3)) |
Ad ogni ricalcolo del foglio questa formula pescherà casualmente un valore tra 10, 20 e 30. Tra le parentesi graffe {} ho inserito una matrice (nello specifico un vettore colonna) di 3 valori. Il punto fa da separatore di riga, altrimenti il backslash farebbe da separatore di colonna.
In ogni caso la presente formula sarebbe equivalente alla seguente situazione:
In A4 in questo caso vedrei un valore casuale preso tra A1:A3.
Seconda idea. Sarebbe possibile generare, al posto dei suddetti valori, dei valori casuali che escano fuori da una funzione? Purtroppo Excel non consente di scrivere esplicitamente una matrice contenente a sua volta delle funzioni, senza passare dall’utilizzo delle celle.
Allora mi sono chiesto: ci sarà un modo per scrivere una stringa e trasformarla in un vettore mediante un separatore di stringa (una specie di str_split per intendersi nel PHP)? Se la stringa è composta di singoli caratteri che dovranno diventare elementi del vettore è effettivamente possibile.
Possiamo cioè trasformare il nome Noctis nel vettore {“N”.”o”.”c”.”t”.”i”.”s”}
Per farlo è sufficiente utilizzare:
1 |
=STRINGA.ESTRAI("Noctis";RIF.RIGA(INDIRETTO("1:6"));1) |
Faccio notare che INDIRETTO prendere le righe dalla 1 alla 6. Con RIF.RIGA generiamo un vettore di riferimenti equivalente a {1.2.3.4.5.6}. Per inciso la funzione sarebbe potuta anche essere così:
1 |
=STRINGA.ESTRAI("Noctis";{1.2.3.4.5.6};1) |
Dal momento però che mi fa fatica scrivere tutto il vettore da 1 a 6 (più che altro se fosse stato più lungo sarebbe risultato abbastanza impensabile) preferisco generarlo con questo semplice trucchetto.
A questo punto abbiamo capito che possiamo spezzare una stringa arbitraria nel vettore dei caratteri che la compongono.
Adesso prendiamo in considerazione la seguente tabella ASCII.
Grazie alla funzione CARATT.UNI posso estrarre un carattere a partire dal suo riferimento numerico nella suddetta tabella (nello specifico qualunque carattere UNI-CODE, ma non è il momento di approfondire la cosa).
Per esempio se digito:
1 |
=CARATT.UNI(112) |
Ottengo la lettera p minuscola.
Quindi posso generare caratteri casuali mischiando questa funzione con CASUALE.TRA nel modo seguente.
Caratteri maiuscoli:
1 |
=CARATT.UNI(CASUALE.TRA(65;90)) |
Caratteri minuscoli:
1 |
=CARATT.UNI(CASUALE.TRA(97;122)) |
Caratteri speciali:
1 |
=CARATT.UNI(CASUALE.TRA(33;47)) |
Per generare invece i numeri da 0 a 9 mi basta utilizzare:
1 |
=CASUALE.TRA(0;9) |
Quindi usando la formula:
1 |
=CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47)) |
Posso generare una stringa di 4 caratteri contenente un numero casuale, una maiuscola casuale, una minuscola casuale e un carattere speciale casuale.
Inserendo questa dentro la suddetta formula con STRINGA.ESTRAI posso estrarre i quattro caratteri dalla stringa in un vettore di caratteri casuali con la seguente formula:
1 |
=STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1) |
A questo punto inserendo il tutto dentro a INDICE ottengo la precedente formula e il gioco è fatto.
Per generare delle password casuali di 16 caratteri come queste:
!#lKTHLb0nx2Z(0H |
7&x(128’#L#(t6B3 |
,77YJ”lu35%LKYVm |
svkA.ur1Y””+#r*t |
15I35t1Z”(/Lz#0a |
Ci sarebbe sufficiente utilizzare la formula un po’ più lunga e ripetuta come detto all’inizio.
1 |
=INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4))&INDICE(STRINGA.ESTRAI(CASUALE.TRA(0;9)&CARATT.UNI(CASUALE.TRA(65;90))&CARATT.UNI(CASUALE.TRA(97;122))&CARATT.UNI(CASUALE.TRA(33;47));RIF.RIGA(INDIRETTO("1:4"));1);CASUALE.TRA(1;4)) |
One thought on “[excel] Come creare una password casuale di lunghezza arbitraria con un’unica formula”