L'ultimo articolo scritto su Sir Bit risale a marzo 2014. La versione che state visitando è un archivio: le pagine sono accessibili come sempre e gli autori potrebbero rispondere ai commenti, ma non saranno inseriti dei nuovi articoli. Visita questa pagina per i dettagli.

PHP – Le funzioni più sicure per criptare una password

Lucchetti amanti in Germania

Un minimo di sicurezza per blindare le nostre password è essenziale. Il php ci mette a disposizione alcune funzioni per la criptazione di una stringa (1)

Il problema della sicurezza delle password è il più spinoso – e affascinante – all’interno della programmazione. Su questo tema sono stati fatti, e continuano a essere fatti, innumerevoli studi, visto che il mondo della “violazione informatica” si fa sempre più sofisticata.

Poniamo il caso che il nostro sito sia costruito con un codice poco sicuro: un cracker anche inesperto potrebbe entrare ed estrapolare i nostri dati. Ma se le password che abbiamo salvato nel database sono criptate, non avrà alcun modo di risalire alla vera password inserita (questo significa che se quella stessa password l’abbiamo usata per altri siti, il cracker non riuscirà comunque entrare: è chiaro comunque che la cosa migliore è utilizzare sempre password diverse per ogni login).
I sistemi di criptazione più efficaci, infatti, prendono una stringa e la convertono in un’altra stringa indecifrabile dall’uomo. E’ un procedimento complesso e irreversibile: una stringa criptata non può tornare al suo stato originario.

Ci sono delle eccezioni “meno sicure” di criptografia (come la funzione CRC32 che restituisce sempre e comunque un intero di 32 bit), ma in questo articolo non le tratteremo. Vedremo invece i due sistemi più usati per crittografare una stringa (password) in php: l’uso delle funzioni md5() e sha1().
Sia chiaro che non rappresentano gli algoritmi più sicuri sul campo: soprattutto con l’avanzare delle capacità computazionali dei computer, questi algoritmi stanno diventando sempre più obsoleti e se il sito richiede particolari sistemi di protezione è utile, anzi necessario, affidarsi ad algoritmi più sicuri, per esempio all’SHA512, o a sistemi di crittografia ancora più avanzati la cui trattazione richiederebbe un articolo a parte.
In linea di massima, comunque, per le criptazioni di base l’SHA1 è sufficiente: nell’articolo intendo soltanto evidenziare il procedimento standard per criptare una password. La cosa assolutamente da evitare, infatti, è di salvare la password degli utenti in chiaro (cioè così come viene inviata): permette di recuperarla senza problemi in caso di smarrimento, visto che è visibile nel database, ma un qualsiasi cracker che riesca ad avere accesso nel database avrà a disposizione una lista subito fruibile.

Se siete interessati ad approfondire il tema delle password o della login, vi segnalo alcuni degli articoli che ho già trattato:
– uno script in php da scaricare, spiegato nei dettagli, per il recupero della password dimenticata dall’utente
– uno script da scaricare per creare una login in php tramite l’uso di cookies
– generare una password random con javascript

MD5 o SHA1?

L’utilizzo delle funzioni di criptazioni offerte da php è semplicissimo:

1
2
3
4
5
6
md5($stringa);
sha1($stringa);

//funzioni usati per i file
md5_file($file);
sha1_file($file);

Le ultime due funzioni sono le corrispondenti per criptare il file passato (naturalmente in questo caso la conversione può essere più lunga, dipendentemente dalle dimensioni del file).

Quali sono le differenze tra le due funzioni e quale è preferibile usare?
In entrambi il procedimento è irreversibile: non esiste nessuna funzione che possa trasformare una stringa passata in MD5 alla sua forma originaria (per meglio precisare, il modo esiste sempre ma l’algoritmo è così complicato che può portare addirittura a perdite di informazioni). L’MD5 restituisce una stringa criptata di 32 caratteri esadecimale (o, inserendo “true” come secondo parametro, di 16 caratteri in binario), mentre l’SHA1 restituisce una stringa di 40 caratteri esadecimale (o 20 caratteri in binario).
La conseguenza è chiara: l’SHA1 è di certo più sicuro dell’MD5. Tecnicamente, visto che è più lungo, con l’SHA1 c’è meno rischio di collisioni (ovvero di trovare la stessa stringa associata a due password diverse).

Detto questo, è da specificare che dal punto di vista delle collisioni l’MD5 è più che sufficiente per criptare la password di un sito, perché per trovare una corrispondenza con una stringa da 32 caratteri bisogna essere davvero sfortunati. Di fatto, l’md5() è la funzione più utilizzata dagli sviluppatori.

Questi algoritmi sono assolutamente sicuri?

No. Come già accennato, MD5 e SHA1 sono gli algoritmi di criptazione più usati ma non di certo i più efficienti. I siti che richiedono particolari protezioni e che trattano dati sensibili in modo massiccio dovrebbero dotarsi di sistemi di criptazione più moderni. A fondo pagina trovare il link per la pagina della documentazione di PHP in cui si parla degli hash.

Hacker e cracker di tutto il mondo insegnano che non esiste nessun database e nessuna password assolutamente inviolabile: su questo dobbiamo farcene una ragione.
È chiaro, comunque, che dobbiamo rendere la vita difficile agli intrusori e l’uso di funzioni di criptazione è essenziale. In mancanza di queste, come detto sopra, sarà sufficiente entrare nel database per recuperare le password in chiaro. Facendone uso, invece, l’intrusore dovrà armarsi di pazienza e aggirare l’ostacolo con mezzi più subdoli o attuando il sempre in voga brute force (ridotto ai minimi termini, consiste nel tentare ripetutatamente le password di accesso fino a ottenere un successo: ecco perché è consigliato usare sempre password lunghe e complesse).

Per aumentare il livello di sicurezza, si potrebbe attuare una doppia applicazione della funzione, ovvero:

1
md5(md5($stringa));
Fonti esterne

Tutte le funzioni di hash del php. In uno dei commenti potete vedere anche la lunghezza dei risultati dei vari hash.

Copyright immagini

(1) http://viarigattieri.blogspot.it/2010/04/liebesschlosser-auf-hohenzollernbrucke.html

Etichette
Etichette:,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.