Salvataggio delle password in un sistema informativo gestito com Php e MySql

Salvataggio delle password

Nei casi in cui viene gestito correttamente l’input dell’utente e l’esecuzione delle query ad un database, un attaccante necessita di altri metodi per accedere agli account degli utenti. Generalmente si cercherebbe di ottenere le credenziali di accesso di qualche utente.
Un modo per ottenere le credenziali sarebbe quello di violare il database usato dalla applicazione. A seconda del database usato, dalla sua versione, di come è configurato ecc, esistono diversi modi per comprometterlo. Questo esula dagli obbiettivi di questa tesi, quindi dobbiamo assumere che un attaccante sia riuscito ad accedere al database. L’obbiettivo è cercare di minimizzare i danni.
Avendo accesso al database, un attaccante potrebbe utilizzare le credenziali degli utenti per fare qualsiasi cosa. Il fatto diventa più grave se si pensa che la maggior parte delle persone usa le stesse credenziali per accedere a tutti i siti.
Per minimizzare i danni, le password non andrebbero mai salvate in chiaro sul database, ma piuttosto dovrebbero essere salvate modificate in qualche maniera, in modo da non permettere ad un attaccante di risalire alla password originale. La soluzione più usata è quella di usare uno degli algoritmi di hashing per ottenere una stringa di caratteri, chiamata hash, a partire dalla password originale. Sul database viene salvato l’hash della password, invece della password. Per la verifica della password, si usa lo stesso algoritmo per creare l’hash della password fornita, si recupera l’hash salvato sul database e i due hash vengono confrontati. Se combaciano, allora siamo abbastanza sicuri che l’utente abbia fornito la password corretta.
Fino a poco tempo fa, l’algoritmo più usato era MD5, che permetteva di ottenere una stringa di 32 byte a partire da una stringa di qualsiasi lunghezza. Recentemente tale algoritmo è stato “violato” e tramite l’utilizzo di diversi metodi, ad esempio le cosiddette tabelle rainbow, si riesce a risalire alla stringa originale.
Per ottenere un buon hash, PHP ci viene in aiuto fornendo molto algoritmi di hashing come ad esempio SHA256, SHA512, WHIRPOOL ecc. Per quanto sia sicuro un algoritmo di hashing, non servirebbe a niente se l’utente usa una password debole. Uno studio recente ha scoperto che la password più usata attualmente è 123456, seguita da password. È ovvio che il punto debole del sistema è l’essere umano. Per aumentare la sicurezza delle password, si potrebbero fare dei controlli in fase di registrazione e forzare l’utente a inserire delle password che soddisfano alcuni criteri, come ad esempio usare numeri e segni di interpunzione in aggiunta a caratteri maiuscoli e minuscoli.
Per rendere più difficile per un attaccante trarre vantaggio dallo username e dall’hash della vittima, si fanno delle modifiche all’algoritmo di hashing in modo da rendere necessario il codice sorgente per scoprire la modifica. Tale modifica si chiama salting e consiste nell’aggiunta di una stringa (chiamata salt, ovvero sale) alla password dell’utente prima che venga generato l’hash. Grazie a questa modifica, diventa molto più difficile usare tecniche come i dizionari o le tabelle rainbow per risalire alla password originale. Per usa sicurezza maggiore, non si dovrebbe usare lo stesso sale per tutte le password, ma bisognerebbe generare uno nuovo per ogni password, e più e complesso il sale utilizzato, più sarà difficile risalire alla password dell’utente. Un buon metodo per generare il sale in PHP viene offerto dalla funzione mcrypt_create_iv() che passandole come parametri un intero e la costante MCRYPT_DEV_URANDOM creerà il sale della lunghezza specificata leggendo in modo casuale dei dati prodotti dal “rumore” dei driver del sistema operativo, quindi praticamente impossibili da indovinare.
Un'altra tecnica utilizzata per diminuire la possibilità di risalire alla password originale è quella di applicare più volte uno o più algoritmi di hashing. Questa tecnica si chiama password stretching.
Per la massima sicurezza possibile si dovrebbero usare in modo congiunto una buon algoritmo di hashing, un buon sale e applicare lo stretching della password. Un algoritmo che offre tutte queste funzionalità si chiama PBKDF2 (Password-Based Key Derivation Function 2) e fa parte degli standard PKCS (Public-Key Cryptography standards) concepiti e pubblicati da RSA Security Inc, a partire dagli anni 1990 [1]. L’algoritmo usa una funzione pseudocasuale, come ad esempio un hash crittografico, alla password data in input insieme al valore del sale e ripete il processo diverse volte per produrre una chiave derivata che potrà essere utilizzata come chiave crittografica nelle operazioni desiderate. L’algoritmo PBKDF2 viene considerato sicuro, anche se non perfetto, e viene utilizzato in diversi sistemi, come ad esempio nei protocolli WPA e WPA2 per proteggere le reti Wi-Fi, nei sistemi Mac OS X Mountain Lion per proteggere le password degli utenti, in Cisco IOS per generare gli hash delle password ecc.

PBKDF2 è stato implementato in PHP a partire dalla versione 5.5. Per permettere l’utilizzo di questo algoritmo anche dalle versioni precedenti di PHP, è stato scelto di usare una libreria open source che implementa questo algoritmo. La libreria è stata implementata in PHP puro da Taylor Hornby reperibile all’indirizzo https://crackstation.net/source/password-hashing/PasswordHash.php in modo gratuito ed è libera da utilizzare e modificare. 

da: http://amslaurea.unibo.it/6651/4/pina_elvis_tesi.pdf

Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)