[excel] Generare una password casuale di lunghezza arbitraria usando il calcolo matriciale

Questa soluzione si ispira ad un precedente articolo a cui rimando per chi fosse curioso di approfondire: [excel] Come creare una password casuale di lunghezza arbitraria con un’unica formula

Il risultato che voglio ottenere sarà simile a questo:

Avendo una cella in input F2 indichiamo la lunghezza della password che desideriamo ottenere, nella cella sottostante una singola formula genera una password pseudo-casuale.

Prima di procedere oltre raccomando per password importanti l’uso di software più affidabile, con algoritmi di generazione di valori casuali superiori ad Excel, come per esempio KeePass.

Anzitutto voglio creare un set di caratteri da cui estrarre quelli della password. Immaginiamo di voler scrivere automaticamente una stringa contenente tutte le lettere maiuscole.

Come illustrato nell’articolo precedente partiamo dal presupposto di voler ricavare i caratteri da una tabella ASCII come la seguente:

Le lettere maiuscole vanno dal carattere 65 al carattere 90. Per ottenere l’intervallo di numeri desiderato usiamo:

Questo produrrà una matrice come questa:

Se volessimo trasformare ciascun numero in un carattere dovremmo usare la funzione CARATT.UNI nel modo seguente:

Il risultato sarà simile a questo:

Applichiamo ora CONCAT alla matrice così ottenuta e avremo tutti i caratteri in una singola riga.

Ripetiamo l’operazione per gli intervalli 97:122 e 33:47 e concateniamo il tutto ai numeri da 0 a 9, nella seguente unica formula:

Tutto questo produrrà una riga come la seguente:

La riga ha in tutto 77 caratteri. Adesso, dopo averla unita, vogliamo spezzarla di nuovo in ogni singolo carattere, usando, come nell’esercizio precedente, la funzione STRINGA.ESTRAI:

Infine usiamo INDICE sulla matrice così creata ed estraiamo per n volte un valore a caso tra 1 e 77. Concateniamo il tutto per ottenere una unica stringa di testo contenente la password.

Affinché la funzione CASUALE.TRA ricalcoli il valore per ogni singolo carattere desiderato, utilizziamo un piccolo trucchetto, inserendo una matrice all’interno della funzione CASUALE.TRA in questo modo:

Grazie al SE sommo sempre 0, per qualunque valore generato da RIF.RIGA(INDIRETTO("1:"&F2)) che produrrà un vettore di dimensione n quanto è la lunghezza desiderata della password.

Vedi articolo

[excel] Come creare una password casuale di lunghezza arbitraria con un’unica formula

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):

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):

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:

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:

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ì:

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:

Ottengo la lettera p minuscola.

Quindi posso generare caratteri casuali mischiando questa funzione con CASUALE.TRA nel modo seguente.

Caratteri maiuscoli:

Caratteri minuscoli:

Caratteri speciali:

Per generare invece i numeri da 0 a 9 mi basta utilizzare:

Quindi usando la formula:

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:

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.

 

Vedi articolo