{"id":2571,"date":"2013-03-11T17:15:06","date_gmt":"2013-03-11T16:15:06","guid":{"rendered":"https:\/\/xmau.com\/wp\/ilpost\/?p=2571"},"modified":"2022-10-11T11:52:55","modified_gmt":"2022-10-11T09:52:55","slug":"hash-e-salting","status":"publish","type":"post","link":"https:\/\/xmau.com\/ilpost\/2013\/03\/11\/hash-e-salting\/","title":{"rendered":"Hash e salting"},"content":{"rendered":"<p>Oggi faccio una digressione non propriamente matematica quanto informatica: spero che la cosa non vi infastidisca troppo, soprattutto considerando che il tema \u00e8 comunque teorico e non pratico ma non lo tratter\u00f2 in maniera troppo teorica. D&#8217;altra parte se nessuno mi fa richieste io continuo a scrivere quello che interessa a me&#8230;<\/p>\n<p>Lo spunto per il post, a parte <a href=\"http:\/\/scientopia.org\/blogs\/goodmath\/2013\/03\/02\/passwords-hashing-and-salt\/\">quanto scritto da MarkCC<\/a>, sono stati gli attacchi informatici di questi mesi, col furto dei file con le password &#8211; prima a Twitter, e ci sono passato in mezzo anch&#8217;io, poi su Evernote. In entrambi i casi, a parte la richiesta di cambiare password (ma non solo per la ragione a cui probabilmente pensare!), le aziende hanno assicurato gli utenti: le password non erano scritte in chiaro, ma crittate con hash e salt. No, non sono paroloni messi l\u00ec per far credere chiss\u00e0 quale inesistente finezza nelle tecniche di crittografia: sono dei concetti assolutamente standard e utili per aumentare la sicurezza. Ma vediamo pi\u00f9 nel dettaglio a che cosa servono.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.ilpost.it\/wp-content\/uploads\/bloggers\/2013\/03\/trapdoor1.png?ssl=1\" title=\"Niente paura, \u00e8 gi\u00e0 pronta la nuova versione del software. Ora, quando si digita una password, il sistema grida &quot;aiuto! aiuto! \u00e8 una trappola!&quot;\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.ilpost.it\/wp-content\/uploads\/bloggers\/2013\/03\/trapdoor1.png?resize=345%2C330&#038;ssl=1\" alt=\"\" width=\"345\" height=\"330\" class=\"aligncenter size-full wp-image-2807\" \/><\/a><\/p>\n<p><!--more-->Iniziamo a dare per assodato di avere un sistema multiutente, che vogliamo che ciascun utente sia distinguibile dagli altri e che nessuno possa impersonare un altro utente. Come fare? Semplice: si chiede a ogni utente di scegliere una password. Questo per\u00f2 significa che il sistema deve verificare che la coppia (utente,password) che \u00e8 stata inserita coincida con quella definita in precedenza: quindi le informazioni devono essere salvate in qualche modo. Il primo passo \u00e8 di creare un file con tutte queste coppie, come nell&#8217;esempio qui sotto.<\/p>\n<p><tt>alice:123456<br \/>\nbob:password00<br \/>\nguest:ospite<br \/>\nilpost:123456<br \/>\nmau:pippo<\/tt><\/p>\n<p>Credo che siate tutti d&#8217;accordo: non \u00e8 una grande idea. Anche ammettendo che il file sia protetto e non direttamente recuperabile dall&#8217;esterno, se qualcuno riesce a ottenerlo ha immediatamente accesso a tutti i dati. Peggio ancora: chi gestisce il sistema ha la possibilit\u00e0 di leggere direttamente i dati di accesso, in barba alla privacy. Fidarsi \u00e8 bene ma non fidarsi \u00e8 meglio: quindi forse \u00e8 opportuno cercare un sistema migliore.<\/p>\n<p>L&#8217;idea successiva potrebbe essere quella di crittografare tutto il file, in modo che il nostro malintenzionato &#8211; chiamiamolo Moriarty, anche se <a href=\"http:\/\/en.wikipedia.org\/wiki\/Alice_and_Bob\">nella letteratura<\/a> si preferisce Craig o Mallory &#8211; anche se riuscisse a metterci le mani su, non potrebbe farci molto. Bravi furbi: se il sistema deve poter verificare che l&#8217;utente ha inserito la password corretta ha anche bisogno di sapere quale sia la password per decodificare quel file. Il nostro malintenzionato quindi dovr\u00e0 recuperare due informazioni (file e password) invece che una, ma in linea di principio le cose non gli cambieranno molto. A tutto questo aggiungo un&#8217;altra considerazione che non avevo fatto in precedenza: se il file viene compromesso, il malintenzionato conoscer\u00e0 in un colpo solo le password di tutti gli utenti. Sarebbe molto meglio riuscire a compartimentare le cose: fare insomma in modo che anche se Moriarty riuscisse a scoprire la password di uno o pi\u00f9 utenti non avrebbe informazioni complete. Ah, una nota per chi sta cercando di scoprire se io sto semplicemente traducendo il post di MarkCC: non \u00e8 affatto vero che <em>\u00abany password can be cracked given enough time and power\u00bb<\/em>. Se faccio uno XOR di tutti i byte del file con un altro file composto di byte veramente casuali, \u00e8 impossibile decrittare il risultato senza avere il &#8220;file casuale&#8221;. Questo \u00e8 il principio dello <a href=\"http:\/\/it.wikipedia.org\/wiki\/Cifrario_di_Vernam\">One-Time Pad<\/a>; non si applica al nostro caso semplicemente perch\u00e9 immaginiamo di poter ottenere anche il pad e non solo il file crittato.<\/p>\n<p>Il nuovo passo \u00e8 quindi quello di crittografare le password dei singoli utenti, in modo che ciascuno di essi abbia un risultato diverso. Qui entra finalmente in gioco il concetto di <b>hash<\/b>. La parola hash, oltre che essere usata per il simbolo del cancelletto #, in inglese ha come significato principale quello di &#8220;polpettone&#8221;, cio\u00e8 qualcosa che prende del materiale &#8211; di solito avanzi &#8211; e lo mischia in maniera tale che non sia pi\u00f9 riconoscibile. Lo stesso si pu\u00f2 fare per le nostre password: si applica una certa qual funzione, e si salva il risultato. Fin qui non sembra ci siano chiss\u00e0 quali differenze con il metodo precedente: ma ora entra in gioco una caratteristica della funzione hash da usare: non abbiamo alcun bisogno di doverla decrittare! Tecnicamente si dice che si usa una funzione one-way, che un po&#8217; come le uscite di sicurezza ha la maniglia solo da un lato, per fare appunto uscire ma non entrare la gente (in questo caso l&#8217;affermazione di MarkCC di cui sopra \u00e8 vera: potrebbe semplicemente essere molto pi\u00f9 difficile invertire la funzione che applicarla, ma dato abbastanza tempo e potenza di calcolo lo si pu\u00f2 fare). Che deve fare il sistema, quando io cerco di entrare? Semplice: legge la password che inserisco, applica la funzione hash, e verifica se il risultato \u00e8 identico a quello memorizzato. Il nostro file di password diventa pertanto qualcosa tipo <\/p>\n<p><tt>alice:b108732f<br \/>\nbob:8dfec231<br \/>\nguest:657fcc10<br \/>\nilpost:b108732f<br \/>\nmau:ed1129a4<\/tt><\/p>\n<p>Gi\u00e0 che ci siete, notate che formalmente non \u00e8 importante che due password diverse abbiano due valori hash distinti. Certo, la funzione hash deve avere un numero di possibili output molto elevato, in genere almeno 2<sup>32<\/sup>, e deve garantire una certa quale uniformit\u00e0 nella distribuzione dei valori ottenuti: altrimenti per paradosso anche la funzione che ritorna sempre 42 \u00e8 un hash, ma non ce ne facciamo molto dal punto di vista della sicurezza. Notate anche come abbiamo anche risolto il problema del guardone interno al sistema: adesso \u00e8 nella stessa situazione di Moriarty, nel senso che pu\u00f2 al pi\u00f9 conoscere la funzione hash usata ma non le password originali.<\/p>\n<p>Siamo gi\u00e0 abbastanza vicini a quello che si usa in pratica; a questo punto Moriarty deve gi\u00e0 cambiare strategia, ammesso che abbia recuperato questo file e conosca la <em>funzione hash crittografica<\/em>, come la si definisce di solito. Non pensate di fare i furbi e usare una funzione hash crittografica non standard! Ci sono almeno due buoni motivi per non farlo: il primo \u00e8 che la &#8220;security by obscurity&#8221; non \u00e8 mai funzionata in pratica, il secondo \u00e8 che con ogni probabilit\u00e0 la funzione scelta \u00e8 meno sicura di quelle standard, e quindi semplifica la vita dell&#8217;attaccante serio. La tecnica pi\u00f9 semplice che si usa per cercare di decrittare le password \u00e8 banale: si prepara una lista di password standard, si applica loro la funzione hash e si vede se qualcuno dei risultati coincide con una password nel file. Ecco perch\u00e9 si dice sempre che la password deve avere al suo interno lettere, numeri e magari segni di interpunzione: la probabilit\u00e0 che in questo modo si usi una &#8220;password standard&#8221; diminuisce, anche se sono sicuro che in tanti si limitano a scrivere &#8220;pippo1&#8221; invece che &#8220;pippo&#8221;, e quindi Moriarty si \u00e8 limitato ad aggiungere &#8220;pippo1&#8221; al suo file &#8211; che ricordo deve compilare una volta per tutte.<\/p>\n<p>Per complicare ancora un po&#8217; la vita al malintenzionato si pu\u00f2 allora usare il <b>salting<\/b>, aggiungendo un granello di sale &#8211; in italiano avrei detto &#8220;un pizzico di pepe&#8221;, ma la cucina non \u00e8 un&#8217;opinione &#8211; alla password. Si continua a usare la funzione hashing crittografica, ma non la si applica alla password di partenza, ma alla password con aggiunti alcuni caratteri casuali, detti appunto &#8220;salt&#8221;. In questo modo gli hash degli utenti alice e ilpost nell&#8217;esempio qui sopra non sarebbero gli stessi, e anche se Moriarty avesse craccato in qualche altro modo la password di alice non potrebbe sapere che ilpost ha usato la stessa password. Questo sistema, tra l&#8217;altro, \u00e8 quello usato inizialmente nel file \/etc\/password di Unix. Quando l&#8217;ho saputo, la mia prima domanda \u00e8 stata &#8220;e come fa il sistema a sapere qual \u00e8 il salt?&#8221; La risposta \u00e8 stata &#8220;semplice, lo si scrive nella password stessa&#8221;. Facciamo un esempio pratico: la password dell&#8217;utente mau \u00e8 <tt>pippo<\/tt>, e le viene associato il salt <tt>xy<\/tt>, dove i due caratteri sono stati scelti a caso. Per prima cosa si calcola l&#8217;hash crittografico non pi\u00f9 di <tt>pippo<\/tt> ma di <tt>pippoxy<\/tt>: supponiamo che il risultato sia <tt>jwerh23dq<\/tt>. A questo punto nel file di password verr\u00e0 salvata la stringa <tt>jwerh23dqxy<\/tt>. Quando cercher\u00f2 di connettermi, il sistema prender\u00e0 gli ultimi due caratteri della password codificata, li attaccher\u00e0 alla password che ho fornito, calcoler\u00e0 l&#8217;hash, riattaccher\u00e0 i due caratteri finali e verificher\u00e0 se il tutto coincide. <\/p>\n<p>Quello che non avevo capito al tempo \u00e8 che il salt non serve affatto per <i>complicare<\/i> la password! Ecco perch\u00e9 lo si pu\u00f2 tranquillamente lasciare scritto in chiaro. Il suo scopo \u00e8 solo il rendere diverse le codifiche di password identiche, sempre che i salt siano effettivamente diversi. La tabella di Moriarty non serve pi\u00f9 se aggiungiamo i salt, o perlomeno dovrebbe comprendere tutte le password comuni moltiplicate per tutti i salt possibili; il lavoro diventa insomma pi\u00f9 proibitivo.<\/p>\n<p>Chiaramente ho solo toccato la punta dell&#8217;iceberg, e le cose in pratica sono molto pi\u00f9 complicate: spero per\u00f2 di avervi dato almeno un punto di partenza!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Due termini informatici che hanno per\u00f2 un qualche aggancio con la matematica<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-2571","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/phh2yP-Ft","jetpack-related-posts":[{"id":2606,"url":"https:\/\/xmau.com\/ilpost\/2013\/05\/13\/siamo-tutti-pedagoghi\/","url_meta":{"origin":2571,"position":0},"title":"Siamo tutti pedagoghi","author":".mau.","date":"13\/05\/2013","format":false,"excerpt":"Visto che anche quest'anno ci sono state le solite polemiche sulle prove Invalsi di matematica - trovate qua una lunga lettera di Giorgio Israel che \u00e8 storicamente contrario a questi test per ragioni di principio da lui bene argomentate - ho pensato che posso anch'io buttarmi nella polemica, prendendo come\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.ilpost.it\/wp-content\/uploads\/bloggers\/2013\/05\/invalsi2013.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":2634,"url":"https:\/\/xmau.com\/ilpost\/2013\/09\/06\/quanto-e-irragionevolmente-efficace-la-matematica\/","url_meta":{"origin":2571,"position":1},"title":"Quanto \u00e8 &#8220;irragionevolmente efficace&#8221; la matematica?","author":".mau.","date":"06\/09\/2013","format":false,"excerpt":"Ogni tanto la banda dei matematici non-platonisti si risveglia. Solo che il matematico tipico di filosofia ne sa ben poca","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2658,"url":"https:\/\/xmau.com\/ilpost\/2017\/06\/30\/4-chilometri-cubi-di-rifiuti\/","url_meta":{"origin":2571,"position":2},"title":"4 chilometri cubi di rifiuti","author":".mau.","date":"30\/06\/2017","format":false,"excerpt":"Roberto Zanasi (che abita a Modena) ha trovato questo titolo su un giornale locale, ed \u00e8 metaforicamente balzato sulla sedia. Riuscite a vedere al volo cosa c'\u00e8 di strano nell'affermazione \"Vasco, previsti 4 km cubi di rifiuti\"? No, il problema non sono le battute sulle attuali qualit\u00e0 musicali del cantante\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"4km3","src":"https:\/\/i0.wp.com\/www.ilpost.it\/wp-content\/uploads\/2017\/06\/4km3.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":381,"url":"https:\/\/xmau.com\/ilpost\/2014\/08\/06\/divulgare-e-barare\/","url_meta":{"origin":2571,"position":3},"title":"Divulgare \u00e8 barare?","author":".mau.","date":"06\/08\/2014","format":false,"excerpt":"Non \u00e8 facile trovare la giusta via tra semplificazione e correttezza","rel":"","context":"In \"divulgazione\"","block_context":{"text":"divulgazione","link":"https:\/\/xmau.com\/ilpost\/tag\/divulgazione\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":580,"url":"https:\/\/xmau.com\/ilpost\/2015\/06\/19\/maturita-2015-luci-e-ombre\/","url_meta":{"origin":2571,"position":4},"title":"Maturit\u00e0 2015, luci e ombre","author":".mau.","date":"19\/06\/2015","format":false,"excerpt":"Ottima l'idea di avere un esempio pratico, meno buona quella di un quesito \"facile\" troppo generico","rel":"","context":"In \"dematematizzazione\"","block_context":{"text":"dematematizzazione","link":"https:\/\/xmau.com\/ilpost\/tag\/dematematizzazione\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2444,"url":"https:\/\/xmau.com\/ilpost\/2011\/10\/14\/carnevale-della-matematica-42\/","url_meta":{"origin":2571,"position":5},"title":"Carnevale della Matematica #42","author":".mau.","date":"14\/10\/2011","format":false,"excerpt":"La nuova edizione del Carnevale della Matematica ha come ordinale un numero indubbiamente interessante!","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/posts\/2571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/comments?post=2571"}],"version-history":[{"count":1,"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/posts\/2571\/revisions"}],"predecessor-version":[{"id":2572,"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/posts\/2571\/revisions\/2572"}],"wp:attachment":[{"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/media?parent=2571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/categories?post=2571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xmau.com\/ilpost\/wp-json\/wp\/v2\/tags?post=2571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}