Hashing vs. Crittografia: Come La Tua Password Viene Memorizzata nel Server

Immagina di aver creato un account su VerySecureWebsite.com. Inserisci il tuo indirizzo email e la password e imposti il tuo account. Poco dopo ricevi un’email che ti informa che, ironicamente, il sito web è stato violato e i nomi utente e le password di ogni utente, memorizzati in chiaro, sono ora in vendita sul dark web. Mentre inizi a cambiare la password su tutti i tuoi account (ne usi solo una, sei un mostro), ti chiedi, “ Non è una cattiva idea? La mia password non dovrebbe essere in qualche tipo di codice segreto affinché gli hacker non possano semplicemente leggerla? ”
Hai ragione. Qualsiasi app web o servizio che utilizza un sistema di login con nome utente/password dovrebbe memorizzare le password degli utenti utilizzando un hash salato, forse anche un hash lento salato, forse con un pepper. Se questo inizia a suonare più come la colazione che come la crittografia, non preoccuparti: a differenza della tua password (si spera), la memorizzazione sicura delle password non è un argomento troppo difficile da comprendere.
Leggi anche: Perché le Restrizioni sulle Password dei Siti Web Non Ti Tengono Al Sicuro
Testo chiaro e crittografia di base

| Nome utente | Password Inserita | Forma Memorizzata |
|---|---|---|
| UtenteInconsapevole | PasswordDebole | PasswordDebole |
Memorizzare password in chiaro in un database connesso a Internet è una cattiva idea: se il database viene violato, chiunque abbia riutilizzato una di quelle password è ora a rischio. Eppure un numero inquietante di siti web continua a farlo, probabilmente perché gli aggiornamenti di sicurezza sono più per il cliente che per l’azienda. Se vuoi testare se un sito fa questo, prova a selezionare l’opzione “password dimenticata”. Se ti inviano semplicemente la tua password invece di un link per reimpostare, è memorizzata in chiaro.
| Nome utente | Password Inserita | Crittografata con Chiave AES-128: ChiaveDebole |
|---|---|---|
| UtenteInconsapevole | PasswordDebole | 38MkoXVXoKe01uAOROBLpQ== |
La crittografia può sembrare un modo forte per memorizzare le password, ma è realmente solo un passo oltre il testo chiaro. Una password crittografata può generalmente essere decifrata con una chiave, e se gli hacker riescono a trovarla o indovinarla, la crittografia è inutile.
Hashing > crittografia

| Nome utente | Password Inserita | Stringa da hashare | Hashata con SHA-256 |
|---|
| UtenteInconsapevole | PasswordDebole | PasswordDebole | 252E2406732308F9A7
B378ED94E78467D14
077D19C8282443FCD
3D6190FCABFA |
Una funzione di hash è fondamentalmente solo una crittografia unidirezionale: si converte la password in chiaro in un codice segreto, ma non c’è una chiave per riportarla indietro, il che significa che non puoi mai derivare la password effettiva dalla versione hashata.
Questo è il modo in cui la maggior parte dei siti web sicuri gestisce le proprie password:
- L’utente crea un account
- La password dell’utente viene elaborata attraverso la funzione di hash e memorizzata nel database
- Ogni volta che l’utente effettua il login, il database genera l’hash della password inserita e verifica se l’hash inserito corrisponde a quello che hanno archiviato.
- Se sì, l’utente può accedere
Con un hash, l’app/sito non memorizza mai la tua password reale, e un hacker che riesce a entrare avrà solo un elenco di lettere e numeri che non possono essere decifrati. A seconda di quanto è forte l’algoritmo, questi hash possono essere piuttosto difficili da decifrare.
Tuttavia, gli hash non sono immuni agli attacchi. Tutto ciò che un attaccante deve fare è eseguire un dizionario di potenziali password attraverso la funzione di hash, quindi confrontare quegli hash con quelli nel database. Quando due hash corrispondono, l’hacker può semplicemente vedere quale password ha generato quell’hash.
Per risparmiare tempo e potenza di calcolo, molti attaccanti usano semplicemente una tabella di ricerca (o una “tabella arcobaleno”, una versione che risparmia spazio delle tabelle di ricerca), una tabella pre-generata piena di potenziali password e dei loro hash. Puoi effettivamente provare a hashare una parola in chiaro e poi usare una tabella di ricerca sull’hash tu stesso; non è troppo difficile. Essenzialmente, se la tua password è comune, l’hash di quella password è probabilmente già in una tabella di ricerca. Questo è un ottimo motivo per non usare password comuni.
Leggi anche: Crea una Password Sicura Utilizzando Questi Consigli e Strumenti
Hash salati > hash

| Nome utente | Password Inserita | Stringa da hashare | Hashata con SHA-256,
sale = XcyKn42, aggiunta in testa | | — | — | — | — | | UtenteInconsapevole | PasswordDebole | XcyKn42PasswordDebole | 13EB660FF7FBD29A728FC5
92297D78DF19AFF8797363
15FBF1F1C4B7123BD10C |
A differenza degli slug, il sale rende gli hash più forti. Poiché l’intero hash cambia anche se solo una lettera della parola in chiaro viene modificata, tutto ciò che un sito deve fare per ostacolare le tabelle di ricerca è aggiungere del testo in chiaro extra alla password prima che venga hashata. L’attaccante sarà in grado di leggere il sale in chiaro poiché è memorizzato nel database, ma questo lo costringe a ricalcolare ogni possibile combinazione di potenziali password e sale.
Naturalmente, gli hash salati possono ancora essere craccati. Gli hacker possono semplicemente aggiungere il sale alla password che stanno indovinando, hashare la combinazione e aspettare che compaiano delle corrispondenze - un attacco di dizionario standard. Poiché le GPU moderne possono fare miliardi di tentativi al secondo, questo non è affatto irrealizzabile, ma rende il processo molto più fastidioso. In caso contrario, gli attacchi di brute-force sono lenti ma molto efficaci.
Rendi gli hash ancora più forti: altre tattiche

| Nome utente | Password Inserita | Stringa da hashare | Hashata con Bcrypt,
sale = XcyKn42, aggiunto in testa,
12 giri | | — | — | — | — | | UtenteInconsapevole | PasswordDebole | XcyKn42PasswordDebole | $2y$12$6OleutQBO2iPoNvg
pyDndOU26Lqt9Y34f6PLEOx
mCELP5GoswrJT. |
Gli algoritmi di hashing lenti, come PBKDF2 o bcrypt, utilizzano una tecnica nota come “key stretching” per rallentare gli attacchi di dizionario e brute force. Questo implica fondamentalmente impostare la funzione di hash per iterare un certo numero di volte (anche se è un po’ più complesso che semplicemente eseguire la stessa cosa ripetutamente), in modo che, per raggiungere l’hash corretto, bisogna utilizzare molta potenza di calcolo. Se un sito fa tutto questo, la loro sicurezza è piuttosto buona.
| Nome utente | Password Inserita | Stringa da hashare | Hashata con Bcrypt,
sale = XcyKn42, aggiunto in testa,
12 giri,
pepper = |4|\/|@p3pp3r, aggiunto alla fine | | — | — | — | — | | UtenteInconsapevole | PasswordDebole | XcyKn42PasswordDebole|4|\/|@p3pp3r | $2y$12$njmWr5UMydCzdCE44ElW/
OIfYp2PH9sgonCATyVY.OVKSpmoSaZlu |
Per una sicurezza aggiuntiva, puoi anche “pepperare” i tuoi hash - che si spera siano già salati. Un pepper, come un sale, è un insieme di valori attaccati alla password prima che venga hashata. A differenza di un sale, tuttavia, c’è solo un valore di pepper, e viene mantenuto segreto, separato dai sale e dagli hash. Aggiunge un ulteriore strato di sicurezza all’hash salato, ma se l’attaccante riesce a trovarlo, non è più molto utile poiché l’attaccante può semplicemente usarlo per calcolare nuove tabelle di ricerca.
Non fare confusione con il tuo hash
La sicurezza delle password ha fatto importanti progressi – e anche l’arte di craccare quella sicurezza. Sfortunatamente, gli esseri umani sono ancora scarsi nella gestione delle password, e i database non aggiornano la sicurezza con la frequenza necessaria. In generale, assume che ogni volta che crei un account, la password venga memorizzata con una sicurezza relativamente debole. Se la tua password è comune o una parola di dizionario, allora è a un rischio piuttosto alto di essere craccata. Rendi le tue password lunghe, mescolando lettere, numeri e simboli, e aiuterai le funzioni hash a fare il loro miglior lavoro.
Crediti immagine: Funzione di hash