{"id":1701,"date":"2013-02-07T06:30:58","date_gmt":"2013-02-07T05:30:58","guid":{"rendered":"http:\/\/www.manuelmarangoni.it\/sir-bit\/?p=1701"},"modified":"2017-02-27T10:25:50","modified_gmt":"2017-02-27T09:25:50","slug":"php-le-funzioni-piu-sicure-per-criptare-una-password","status":"publish","type":"post","link":"https:\/\/www.manuelmarangoni.it\/sir-bit\/1701\/php-le-funzioni-piu-sicure-per-criptare-una-password\/","title":{"rendered":"PHP &#8211; Le funzioni pi\u00f9 sicure per criptare una password"},"content":{"rendered":"<div id=\"attachment_1705\" style=\"width: 460px\" class=\"wp-caption aligncenter\"><a class=\"lightbox\" title=\"Un minimo di sicurezza per blindare le nostre password \u00e8 essenziale. Il php ci mette a disposizione alcune funzioni per la criptazione di una stringa\" href=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/02\/Lucchetti-amanti-in-Germania.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1705\" class=\"size-medium wp-image-1705 \" style=\"margin-bottom: 5px;\" title=\"Lucchetti amanti in Germania\" src=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/02\/Lucchetti-amanti-in-Germania-450x300.jpg\" alt=\"Lucchetti amanti in Germania\" width=\"450\" height=\"300\" srcset=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/02\/Lucchetti-amanti-in-Germania-450x300.jpg 450w, https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/02\/Lucchetti-amanti-in-Germania-1024x682.jpg 1024w, https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/02\/Lucchetti-amanti-in-Germania.jpg 1600w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><\/a><p id=\"caption-attachment-1705\" class=\"wp-caption-text\">Un minimo di sicurezza per blindare le nostre password \u00e8 essenziale. Il php ci mette a disposizione alcune funzioni per la criptazione di una stringa (1)<\/p><\/div>\n<p>Il problema della sicurezza delle password \u00e8 il pi\u00f9 spinoso &#8211; e affascinante &#8211; all\u2019interno della programmazione. Su questo tema sono stati fatti, e continuano a essere fatti, innumerevoli studi, visto che il mondo della \u201cviolazione informatica\u201d si fa sempre pi\u00f9 sofisticata.<\/p>\n<p>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,<strong> non avr\u00e0 alcun modo di risalire alla vera password inserita<\/strong> (questo significa che se quella stessa password l\u2019abbiamo usata per altri siti, il cracker non riuscir\u00e0 comunque entrare: \u00e8 chiaro comunque che la cosa migliore \u00e8 utilizzare sempre password diverse per ogni login).<br \/>\nI sistemi di criptazione pi\u00f9 efficaci, infatti, prendono una stringa e la convertono in <strong>un\u2019altra stringa indecifrabile dall\u2019uomo<\/strong>. E\u2019 un procedimento complesso e irreversibile: una stringa criptata non pu\u00f2 tornare al suo stato originario.<\/p>\n<p>Ci sono delle eccezioni \u201cmeno sicure\u201d di criptografia (come la funzione <a title=\"La funzione crc32 per la criptazione di password\" href=\"http:\/\/www.php.net\/manual\/it\/function.crc32.php\" target=\"_blank\">CRC32<\/a> che restituisce sempre e comunque un intero di 32 bit), ma in questo articolo non le tratteremo. Vedremo invece i due sistemi pi\u00f9 usati per crittografare una stringa (password) in php: <strong>l\u2019uso delle funzioni md5() e sha1()<\/strong>.<br \/>\nSia chiaro che non rappresentano gli algoritmi pi\u00f9 sicuri sul campo: soprattutto con l&#8217;avanzare delle capacit\u00e0 computazionali dei computer, questi algoritmi stanno diventando sempre pi\u00f9 obsoleti e se il sito richiede particolari sistemi di protezione \u00e8 utile, anzi necessario, affidarsi ad algoritmi pi\u00f9 sicuri, per esempio all&#8217;SHA512, o a sistemi di crittografia ancora pi\u00f9 avanzati la cui trattazione richiederebbe un articolo a parte.<br \/>\nIn linea di massima, comunque, per le criptazioni di base l&#8217;SHA1 \u00e8 sufficiente: nell&#8217;articolo intendo soltanto evidenziare il procedimento standard per criptare una password. La cosa assolutamente da evitare, infatti, \u00e8 di salvare la password degli utenti in chiaro (cio\u00e8 cos\u00ec come viene inviata): permette di recuperarla senza problemi in caso di smarrimento, visto che \u00e8 visibile nel database, ma un qualsiasi cracker che riesca ad avere accesso nel database avr\u00e0 a disposizione una lista subito fruibile.<\/p>\n<p>Se siete interessati ad approfondire il tema delle password o della login, vi segnalo <strong>alcuni degli articoli che ho gi\u00e0 trattato<\/strong>:<br \/>\n&#8211; uno script in php da scaricare, spiegato nei dettagli, per il <a title=\"PHP \u2013 Creare uno strumento sicuro per il recupero della password dell\u2019utente \u2013 Esempio completo\" href=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/?p=678\">recupero della password<\/a> dimenticata dall\u2019utente<br \/>\n&#8211; uno script da scaricare per <a title=\"PHP \u2013 Creare una login sicura e funzionale usando i cookies | Sir Bit\" href=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/?p=343\">creare una login<\/a> in php tramite l\u2019uso di cookies<br \/>\n&#8211; generare una <a title=\"Javascript \u2013 Generare automaticamente una password casuale | Sir Bit\" href=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/?p=1402\">password random<\/a> con javascript<br \/>\n<!--more--><\/p>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">MD5 o SHA1?<\/h3>\n<p>L\u2019utilizzo delle funzioni di criptazioni offerte da php \u00e8 semplicissimo:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #990000;\">md5<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$stringa<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #990000;\">sha1<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$stringa<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\r\n<span style=\"color: #666666; font-style: italic;\">\/\/funzioni usati per i file<\/span>\r\n<span style=\"color: #990000;\">md5_file<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$file<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #990000;\">sha1_file<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$file<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Le ultime due funzioni sono le corrispondenti per <a title=\"La funzione md5_file per php per criptare un file\" href=\"http:\/\/www.php.net\/manual\/it\/function.md5-file.php\" target=\"_blank\">criptare il file<\/a> passato (naturalmente in questo caso la conversione pu\u00f2 essere pi\u00f9 lunga, dipendentemente dalle dimensioni del file).<\/p>\n<p>Quali sono <strong>le differenze tra le due funzioni<\/strong> e quale \u00e8 preferibile usare?<br \/>\nIn entrambi il procedimento \u00e8 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&#8217;algoritmo \u00e8 cos\u00ec complicato che pu\u00f2 portare addirittura a perdite di informazioni). L&#8217;MD5 restituisce una stringa criptata di 32 caratteri esadecimale (o, inserendo &#8220;true&#8221; come secondo parametro, di 16 caratteri in binario), mentre l&#8217;SHA1 restituisce una stringa di 40 caratteri esadecimale (o 20 caratteri in binario).<br \/>\nLa conseguenza \u00e8 chiara: l&#8217;SHA1 \u00e8 di certo pi\u00f9 sicuro dell&#8217;MD5. Tecnicamente, visto che \u00e8 pi\u00f9 lungo, con l&#8217;SHA1 c&#8217;\u00e8 meno rischio di collisioni (ovvero di trovare la stessa stringa associata a due password diverse).<\/p>\n<p>Detto questo, \u00e8 da specificare che dal punto di vista delle collisioni <strong>l&#8217;MD5 \u00e8 pi\u00f9 che sufficiente per criptare la password<\/strong> di un sito, perch\u00e9 per trovare una corrispondenza con una stringa da 32 caratteri bisogna essere davvero sfortunati. Di fatto, l&#8217;md5() \u00e8 la funzione pi\u00f9 utilizzata dagli sviluppatori.<\/p>\n\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">Questi algoritmi sono assolutamente sicuri?<\/h3>\n<p>No. Come gi\u00e0 accennato, MD5 e SHA1 sono gli algoritmi di criptazione pi\u00f9 usati ma non di certo i pi\u00f9 efficienti. I siti che richiedono particolari protezioni e che trattano dati sensibili in modo massiccio dovrebbero dotarsi di sistemi di criptazione pi\u00f9 moderni. A fondo pagina trovare il link per la pagina della documentazione di PHP in cui si parla degli hash.<\/p>\n<p>Hacker e cracker di tutto il mondo insegnano che non esiste nessun database e nessuna password assolutamente inviolabile: su questo dobbiamo farcene una ragione.<br \/>\n\u00c8 chiaro, comunque, che dobbiamo rendere la vita difficile agli intrusori e <strong>l&#8217;uso di funzioni di criptazione \u00e8 essenziale<\/strong>. In mancanza di queste, come detto sopra, sar\u00e0 sufficiente entrare nel database per recuperare le password in chiaro. Facendone uso, invece, l&#8217;intrusore dovr\u00e0 armarsi di pazienza e aggirare l&#8217;ostacolo con mezzi pi\u00f9 subdoli o attuando il sempre in voga <em>brute force<\/em> (ridotto ai minimi termini, consiste nel tentare ripetutatamente le password di accesso fino a ottenere un successo: ecco perch\u00e9 \u00e8 consigliato usare sempre password lunghe e complesse).<\/p>\n<p>Per <strong>aumentare il livello di sicurezza<\/strong>, si potrebbe attuare una doppia applicazione della funzione, ovvero:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #990000;\">md5<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #990000;\">md5<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$stringa<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div style=\"margin-top: 100px; margin-bottom: 20px;\"><strong><em>Fonti esterne<\/em><\/strong><\/div>\n<p><a title=\"Tutte le funzioni di hash del php\" href=\"http:\/\/at.php.net\/manual\/en\/function.hash.php\" target=\"_blank\">Tutte le funzioni di hash del php<\/a>. In uno dei commenti potete vedere anche la lunghezza dei risultati dei vari hash.<\/p>\n<div style=\"margin-top: 100px; margin-bottom: 20px;\"><strong><em>Copyright immagini<\/em><\/strong><\/div>\n<p>(1) http:\/\/viarigattieri.blogspot.it\/2010\/04\/liebesschlosser-auf-hohenzollernbrucke.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il php ci mette a disposizione alcune funzioni per criptare una stringa passata, in modo che non sia recuperabile (nemmeno da noi). Qual \u00e8 la migliore da usare?<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78],"tags":[4,30],"class_list":["post-1701","post","type-post","status-publish","format-standard","hentry","category-php-mysql","tag-php","tag-sicurezza","cat-78-id"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1701"}],"collection":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/comments?post=1701"}],"version-history":[{"count":13,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1701\/revisions"}],"predecessor-version":[{"id":2445,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1701\/revisions\/2445"}],"wp:attachment":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/media?parent=1701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/categories?post=1701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/tags?post=1701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}