Let’s work IT out 01a — Password, parte A

Cosa è una password, come funziona, e quali sono i suoi problemi (e i rimedi).

Antonio Antonino
Let’s work IT out
11 min readFeb 5, 2021

--

Primo vero articolo di questa pubblicazione. L’articolo precedente, in cui mi presento, è consultabile qui.

Le usiamo tutti i giorni, e a molti basta semplicemente ricordarne solo una (ahimè). Ma cosa è esattamente una password?

Una password è, secondo Wikipedia:

una sequenza di caratteri alfanumerici (lettere, cifre, simboli) utilizzata per accedere in modo esclusivo a una risorsa informatica (per esempio account Facebook, banca online, o Amazon) […]

In genere, una password da sola non ha molta utilità se non è associata ad una identità, come per esempio un nome utente o un indirizzo email. E dato che la quasi totalità dei servizi che utilizziamo sono utilizzabili anche in via digitale, le password compaiono ormai dappertutto.

In linea generale, le password rientrano in uno dei tre cosiddetti fattori di autenticazione, ovvero strumenti che gli utenti (cioè noi) hanno a disposizione per provare la loro identità ad un sistema digitale e ottenere il giusto livello di accesso alle informazioni. Questi tre fattori sono composti da:

  • Cose che l’utente sa (nel cui gruppo rientrano le password e il PIN per sbloccare una SIM)
  • Cose che l’utente ha (ad esempio il badge per aprire la porta dell’ufficio)
  • Cose che l’utente è (ad esempio l’impronta digitale o il volto)

In genere, la combinazione di almeno due fattori rende un sistema più sicuro, in quanto il possesso di solo uno dei tre (per esempio una password o un badge) non è sufficiente per accedere al sistema. Ecco quindi che da un po’ di anni molti dei servizi più comunemente utilizzati hanno iniziato ad offrire ai propri utenti la possibilità (alcuni l’obbligo, che è cosa buona e giusta) di scegliere un secondo fattore di autenticazione in aggiunta alla semplice password, come per esempio la scelta di un’app per l’autenticazione a due fattori. Mentre i sistemi basati su password beneficiano in maniera particolare di un secondo fattore di autenticazione, vista la semplicità con cui è possibile “regalare” la propria password a gente non proprio ben intenzionata, i sistemi che utilizzano un processo di autenticazione basato esclusivamente su tratti biometrici come impronte digitali o volti sono considerati più sicuri, anche se non offrono sicurezza totale: configurare un secondo fattore di autenticazione come una password è sempre raccomandato, laddove possibile.

Come funziona l’autenticazione tramite password

Quando ci si registra su un nuovo servizio e si crea un profilo (a meno che non si effettui l’accesso con Facebook, Google, o servizi simili), in genere bisogna scegliere una password che rispetti alcuni requisiti, a seconda del servizio. Una volta scelto un nome utente univoco e una password adeguata, la piattaforma salva la password in modo da permetterci di poter usare la stessa in futuro e dimostrare di essere a conoscenza del segreto che noi stessi abbiamo scelto. Tuttavia, la password non viene salvata nel sistema in forma originale (per lo meno non nei sistemi “fatti bene”), ma viene prima trasformata in una sequenza apparentemente casuale di caratteri. Il processo di trasformazione, da qui in poi chiamato per semplicità funzione di hash, ha alcune proprietà che la rendono adatta per le password (e non solo):

  • Deterministica: se la funzione viene applicata più volte alla stessa password, produce lo stesso risultato tutte le volte. Come esempio, si pensi all’addizione, in cui il risultato di 3+2 è sempre 5, sia in America che in Australia (credo).
  • Irreversibile: è impossibile (o per lo meno molto molto difficile) risalire alla password originale a partire dal risultato della trasformazione. Nel caso di 3+2 = 5, per esempio, è impossibile sapere con certezza se 5 sia il risultato di 5+0, 4+1, 3+2, 2+3, 1+4 o 0+5. Se invece di 5 utilizzassimo un numero sufficientemente grande, diventerebbe molto più difficile capire quali fossero gli addendi iniziali utilizzati.
  • Lunghezza definita: a prescindere dalla password scelta, il risultato ha sempre la stessa lunghezza, a seconda della funzione di hash scelta.
  • Resistente alle collisioni: è statisticamente improbabile che due password differenti producano lo stesso risultato se trasformate con la stessa funzione di hash.

Per esempio, consideriamo una funzione di hash realmente utilizzata, chiamata SHA-256 (acronimo di Secure Hash Algorithm v2). Se utilizzassimo questa funzione di hash per trasformare una ipotetica password ciao, il risultato sarebbe il seguente (da vedersi come una lunga lista di lettere e cifre casuali): b133a0c0e9bee3be20163d2ad31d6248db292aa6dcb1ee087a2aa50e0fc75ae2. Se, invece, usassimo la stessa funzione per trasformare un’altra ipotetica password ciao2 molto simile alla precedente, il risultato sarebbe il seguente: 21d19e923ae21043fa5810704eab55bda682dc9e036bbf4c50eb732febdff835. È chiaro quindi che password anche molto simili come ciao e ciao2 producano risultati completamente diversi, ma tutti della stessa lunghezza (64 caratteri, nel caso della funzione di hash considerata in questo caso). Per gli interessati, ci sono diversi siti come ad esempio questo che permettono di sperimentare online con le funzioni di hash.

Il fatto che una funzione di hash sia deterministica (vedere definizione sopra) significa che se due utenti scegliessero per caso la stessa password (per esempio 12345678 o asdfghjkl, ehm…), il sistema genererebbe la stessa password trasformata, e sarebbe possibile capire che i due utenti hanno scelto la stessa password. Per risolvere questo problema, un sistema informatico di solito genera un’altra sequenza casuale di caratteri chiamata salt, e unisce questo salt alla fine della password scelta dall’utente prima di eseguire la trasformazione con la funzione di hash utilizzata dal sistema. Per esempio, se due utenti scegliessero la stessa password ciao, essa verrebbe trasformata dalla funzione di hash SHA-256 in b133a0c0e9bee3be20163d2ad31d6248db292aa6dcb1ee087a2aa50e0fc75ae2, come spiegato sopra. Ma se il sistema genera un salt (casuale) aek1o22 per la prima password e un altro salt l103ndd per la seconda password, il risultato della trasformazione della prima sarebbe e5e870820fc698854e7219c0351d25f0b74a958385f56355388911e2966a19f5, mentre il risultato della seconda sarebbe 3fe8755a456b1d0976abeeefedff640bdd62e75c6311086be938404b28118350. Da notare, ancora una volta, che i risultati sono sempre formati da 64 caratteri e sono molto diversi tra loro: questo perché la funzione di hash in questione, SHA-256, è frutto di un’intensa attività di ricerca ed è stata sottoposta all’analisi di numerosi esperti per verificarne la correttezza e la sicurezza.

Per cui adesso possiamo capire cosa succede in genere quando un nuovo utente si registra (ovvero crea un nuovo account) su una piattaforma:

  • L’utente sceglie un nome utente che non esiste già e una password che rispetti i requisiti imposti dal sistema in questione.
  • Il sistema genera un salt casuale e unisce il salt generato alla fine della password scelta dall’utente (password ciao e salt afjadsd -> ciaoafjadsd).
  • Il sistema trasforma l’unione della password con il salt (ciaoafjadsd nell’esempio precedente) utilizzando una funzione di hash.
  • Il sistema salva internamente il risultato della trasformazione (che sarà una sequenza apparentemente casuale di caratteri) e il salt generato in precedenza. Per cui, il risultato della registrazione di un nuovo utente sarà (ipoteticamente) composto da nome utente, password trasformata, e salt generato.

Quando, successivamente, un utente vuole effettuare un login nella stessa piattaforma:

  • L’utente inserisce il nome utente e la password scelti in fase di registrazione.
  • Il sistema cerca internamente se l’utente esiste (visto che il nome utente è stato salvato in precedenza alla fine della procedura di registrazione), e in caso affermativo recupera la password trasformata e il relativo salt.
  • Il sistema unisce la password fornita dall’utente al momento del login con il salt recuperato al punto precedente (unito alla fine della password), e trasforma questa unione utilizzando una funzione di hash (che deve essere la stessa utilizzata al momento della registrazione di quell’utente, chiaramente).
  • Se il risultato della funzione di hash, ovvero la password trasformata, corrisponde al valore precedentemente salvato all’interno del sistema, significa che l’utente ha inserito la password esatta, per cui è correttamente autenticato 🎉🍾🥳. Questo perché il salt utilizzato è lo stesso, per cui il risultato può essere lo stesso solo se anche la password è la stessa. Per cui, il sistema può verificare la correttezza della password inserita senza conoscere quale sia la password 🤯🤯🤯🤯🤯.

Qualcuno potrebbe chiedersi perché utilizzare questo meccanismo complesso quando sarebbe più veloce e comodo salvare direttamente la password? La risposta è che le password vengono salvate nel sistema in questione (Facebook, per esempio) per l’intera vita dell’ account di un utente, e ciò significa che esse sono potenzialmente accessibili dai dipendenti dell’azienda stessa (ad esempio un ex-fidanzato geloso che lavora in Facebook), o da utenti malintenzionati (leggasi hacker) nel caso in cui questi ultimi riuscissero ad accedere alle password salvate da Facebook. Una volta ottenuta una determinata password, questi utenti malintenzionati possono impersonare l’account compromesso ed effettuare le azioni più disparate. Nel caso di Facebook, magari ciò può portare l’hacker a postare immagini di gattini sulla tua bacheca (con danni più o meno limitati), ma se pensiamo ad una banca o a un qualche altro ente finanziario, beh… potrebbero farsi un bel bonifico a proprio favore 😎💰😎💰😎.

Al contrario, l’utilizzo della procedura, descritta sopra, di trasformare una password prima di salvarla utilizzando una funzione di hash e un salt casuale permette al sistema di salvare le password solo nella loro versione trasformata e, data la proprietà di irreversibilità delle funzioni di hash (vedi definizione sopra), è impossibile risalire alla password originaria se non tramite meccanismi di bruteforcing, ovvero generando una alla volta tutte le possibili password che possano esistere e sperare di trovarne una che, trasformata, sia uguale a quella salvata nel sistema. In quel caso, l’utente malintenzionato avrebbe ottenuto accesso ad un singolo account, mediante un lavoro che richiede uno sforzo notevole (l’immagine sotto fornisce un’idea sul tempo teorico necessario per trovare una password, in base alla sua lunghezza). In più, grazie all’utilizzo di un salt casuale diverso per ogni utente (come spiegato sopra), non è possibile per un hacker utilizzare rainbow tables, ovvero valori pre-calcolati delle password più utilizzate, dato che ogni hash contiene una componente casuale, ovvero il salt, ed è molto improbabile che esso appaia in una di queste combinazioni pre-calcolate. Per esempio, in assenza di salt casuali, ogni volta che un hacker trovasse in un qualsiasi sistema un valore di hash uguale a b133a0c0e9bee3be20163d2ad31d6248db292aa6dcb1ee087a2aa50e0fc75ae2, saprebbe immediatamente che la password sarebbe ciao. Al contrario, se ogni volta che la password ciao viene utilizzata fosse trasformata utilizzando un salt casuale, sarebbe difficile ottenere la stessa password trasformata, a meno che le due password e anche i due salt casuali generati non siano uguali tra loro (abbastanza improbabile).

I tempi per “hackerare” una password (ovvero per trovare la password originaria che genera un determinato hash) aumentano esponenzialmente con l’aumentare della lunghezza e della complessità.

Il problema delle password, e le soluzioni disponibili

Anche se le password rappresentano un sistema alquanto efficiente di autenticazione digitale (cioè un processo di autenticazione in cui l’entità che verifica l’identità di un utente è un sistema digitale, e non un altro utente), sono oggettivamente poco user-friendly, cioè non si prestano molto bene all’uso da parte di esseri umani, che non sono fatti per ricordare sequenze arbitrariamente lunghe e casuali di lettere e cifre. Per cui qual è la soluzione adottata da molti? La propria data di nascita, il nome del cane, o i vari 12345678 e asdfghjkl. Non solo, ma spesso queste combinazioni molto elementari sono utilizzate per accedere a più siti! Per cui se un hacker dovesse essere in grado di trovare o anche solo indovinare la password utilizzata da un utente per un sito (che nel caso di 12345678 non è nemmeno difficile da fare), avrebbe potenzialmente accesso a tutti gli altri siti in cui la stessa password è utilizzata, rendendogli il lavoro molto molto più semplice. Per chi vuole farsi due risate, qui c’è un breve video di stand-up comedy a riguardo (in inglese) 😊.

Password come letmein e iloveyou sono pura poesia.

Quali sono allora gli strumenti utili a ridurre le possibilità per i propri account di essere compromessi?

L’utilizzo di un password manager è forse l’azione più importante da intraprendere per aumentare la propria sicurezza digitale. Un password manager è un programma in grado di salvare le password di tutti gli account che creiamo durante la nostra “vita digitale”. Molti password manager offrono anche la possibilità di generare e automaticamente salvare password lunghe e casuali, che potremo utilizzare durante la registrazione a nuovi siti e piattaforme. Tipicamente, i password manager sono gestiti da una master password, praticamente una password per le password. In questa maniera, un utente dovrà sforzarsi di ricordare solo una password complessa, mentre tutte le altre relative ai suoi account saranno salvati in maniera sicura all’interno del password manager. I migliori password manager sono anche disponibili su più piattaforme (desktop e smartphone), sincronizzano le nuove password automaticamente, e si integrato molto bene con i vari browser (ad esempio Google Chrome o Safari) e nelle app dello smartphone, offrendosi in genere di riempire i campi di nome utente e password automaticamente. Per chi ha già molti account, scaricare e configurare un password manager sicuramente porta via un po’ di tempo. Ma una volta superato questo step, il suo l’utilizzo rende la creazione e l’uso di un gran numero di account digitali sicuri e veloci. Io personalmente utilizzo BitWarden, un password manager il cui codice è open source (pubblico e accessibile a tutti), gratuito, e che si integra perfettamente con tutti i miei dispositivi. Altri servizi validi, per quello che ne so, sono 1Password, LastPass o lo stesso servizio di Keychain che Apple offre per i suoi prodotti (che però non è compatibile con dispositivi che non fanno parte dell’ecosistema Apple).

Secondo, ma non meno importante, è l’utilizzo dell’autenticazione a due fattori (2FA, 2-factor authentication). Non tutte le piattaforme la supportano ancora (ahimè), e un numero ancora inferiore l’ha resa obbligatoria. Sebbene ci siano soluzioni hardware, come le chiavette USB Yubico, che offrono standard di sicurezza più elevati ad un costo maggiore, la maggior parte degli utenti medi può ritenersi più che contenta di utilizzare un’app di autenticazione a due fattori come Google Authenticator, Authy, o Microsoft Authenticator. Queste app permettono di configurare ogni sito separatamente con un PIN dinamico che cambia ogni 30 secondi, chiamato OTP o One-time Password. Magari il funzionamento in dettaglio di come queste app funzionino potrebbe essere un argomento interessante per uno degli articoli successivi 😁😁😁. Qualora possibile, è da preferire l’utilizzo di un’app 2FA all’utilizzo di SMS, considerati un’alternativa meno sicura date le loro vulnerabilità (è possibile per un hacker ottenere una SIM con il numero di telefono di un’altra persona, di fatto ricevendo gli SMS, anche personali, e i codici OTP destinati a quella persona). In genere, è sempre buona norma, appena iscritti ad un nuovo sito o una nuova piattaforma, di navigare tra le impostazioni, specialmente quelle relative alla privacy e alla sicurezza, dove è possibile, tra le altre cose, configurare un’app per l’autenticazione a due fattori. Set it and forget it 😎.

Ricapitolando, la configurazione e l’utilizzo corretto di un password manager (scegliendo una master password lunga e complessa, ovviamente conservandola in un luogo sicuro, e generando password complesse e diverse per ogni sito) insieme all’utilizzo di un’app per smartphone per l’autenticazione a due fattori (laddove possibile) sono decisamente un bel passo avanti per la protezione delle nostre identità digitali 😎!

Una nota per i più curiosi: per chi volesse scoprire se e quante volte la propria email o la propria password siano stati compromessi, potete visitare Have I been pwned che consente, tra le altre cose, di impostare notifiche email qualora (io direi più quando) uno dei vostri account dovesse venir compromesso in futuro.

Screenshot del sito Have I been pwned, che mostra come la password 12345678 sia stata compromessa “solamente” 3 milioni di volte fino ad ora.

Le alternative alle password e cosa potrebbe riservarci il futuro

A breve scriverò un secondo articolo, più una continuazione di questo, in cui discuterò su quali sono le alternative all’utilizzo delle password oggi, e quali sono i trend più interessanti per il futuro. Per cui, stay tuned 😎! Per ora, se ci sono domande o osservazioni, potete commentare qui sotto o anche scrivermi in privato, se siete timidi.

Come sempre, potete trovarmi su LinkedIn e su Twitter.

Saluti,

Antonio

References

--

--

Antonio Antonino
Let’s work IT out

Security-focused software engineer, passionate about privacy and distributed systems.