Domanda cos'è un Hash?

Stato
Discussione chiusa ad ulteriori risposte.

Sauron9

Utente Silver
10 Agosto 2016
91
9
30
56
Salve a tutti utenti di Inforge, che navigano in Hacker per Principianti, vorrei chiedervi:
1) Cosa sono o cos' è un hash?
2) Relativo ad esso(hash), ho sentito dire paroloni come MD5 e altre, mi sapreste dire cosa sono a loro volta?
 

Ecco, ne ero sicuro al 95%, che qualc' uno l' avrebbe fatto, secondo te non lo so fare? Semplicemente da ignorante come sono, vorrei esser spiegato l' argomento in modo semplice e da persone che lo hanno già imparato a dovere. Seno a cosa serve un forum...
(rifletti, quello che mi hai detto si potrebbe fare a ogni domanda nei forum, tranne per quelle personali, come non mi funziona questo codice, pertanto non ci sarebbe bisogno del forum stesso)
 
Un hash è in pratica una soluzione matematica nel trasformare un elemento in un hash (appunto) non reversibile.

La spiegazione teorica la trovi sul wiki in alto, per quella pratica ti faccio un esempio:

Tu ti registri su Inforge.net, quindi inserirai una password che il database di Inforge memorizza in formato SHA256.

Diciamo che la tua password è ciao, quindi lo SHA256 di ciao sarà b133a0c0e9bee3be20163d2ad31d6248db292aa6dcb1ee087a2aa50e0fc75ae2.

Nel database di Inforge in teoria viene salvato b133a0c0e9bee3be20163d2ad31d6248db292aa6dcb1ee087a2aa50e0fc75ae2 e NON ciao. In pratica, su Inforge alla password ciao viene associato un salt, ovvero un codice alfanumerico che complica la password.

Mettiamo che il salt sia fk3%4'3103! . Quando effettuerai la registrazione verrà effettuato l'hash 256 di ciaofk3%4'3103!, quindi l'hash sarà ora 6d8db1d75dcc1769a6c8589f3ef333aa2a407f88c4e5a787216f0d1ce8c1e59d (che come vedi è diverso).

Perfetto, è il momento di fare il login.
Quando tu logghi la funzione di login verifica lo SHA256 di ciaofk3%4'3103! con quello presente nel database.

In questo modo nel database di Inforge la password non è in chiaro ma puoi comunque verificare se la password inserita dall'utente sia la stessa che ha scelto in fase di registrazione.

Tutto ciò è possibile perché un hash non può essere reversato da una funzione matematica (essendo l'hash appunto una funzione non reversibile) ma al massimo può essere confrontata con una Rainbow Table.

Le Rainbow Tables sono dei database che contengono gli hash di dizionari, ad esempio:
111111 => bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a
111112 => 2e399d0704eb40aeb3e2321017a4e42f400841c3dc54113e1dea6f46a69f9037
e via dicendo.

Confrontando le Rainbow Tables con le password memorizzate in un database è possibile decriptarle, chiaramente però se queste sono lunghe e complesse è più difficile arrivare al risultato.

Ipotizzando che una password sia lunga 8 caratteri e venga "saltata" (quindi aggiunta) di altri 8 caratteri speciali, il risultato sarà di circa 16 caratteri. Per quanto possa essere fattibile la cosa, i tempi di confronto (calculating o confronto degli hash) potrebbe impiegarci centinaia di migliaia di anni per raggiungere i 16 caratteri prima di poter dire: "Ehi, questa hash corrisponde a questa password!".

E fu così che l'uomo inventò un metodo per memorizzare il contenuto di un dato in una chiave univoca per confrontare l'uguaglianza di due valori senza che se ne conosca il contenuto.
Ci sono domande?
 
Wow! Grazie mille! Tutto chiaro, ma un domanda te la voglio fare lo stesso... come metto il mi piace ad un messaggio? XD
 
Ci sono domande?
Come hai detto, Il salt è una sequenza casuale che viene aggiunta alla password inserita dall'utente prima di effettuare l'hash. Ma nel momento in cui l'utente effettua il login, come fa il sistema a capire che a quella password di quell'utente è stato assegnato quel salt?

Mi spiego meglio con un esempio

la mia passw è: 123456 la sequenza casuale di salt aggiunta alla passw è: &%ttyu/( quindi nel Database verrà salvato l'hash della passw: 123456&%ttyu/.

Nel momento di effettuare il login, io inserisco la passw: 123456, come fa il sistema a capire che deve aggiungere il salt: &%ttyu/ e poi fare l'hash per confrontare le due stringhe?

Spero di essere stato chiaro, buon pomeriggio :)
 
Le funzioni di hash sono delle funzioni che mappano una stringa binaria di lunghezza arbitraria ad una stringa binaria (tanti 1 e 0) a lunghezza fissa (eg. 256 bit). Come ben sappiamo, tutto (immagini, messaggi, programmi, ecc...) può essere rappresentato con una stringa binaria, i computer capiscono solo quello. Quindi una funzione di hash ci permettere di prendere qualsiasi cosa e di rappresentarlo con una stringa a di lunghezza fissa (eg. 256 bit corrispondono a 256/8=32 caratteri ASCII).

Chiaramente le stringhe di lunghezza arbitraria sono infinite, mentre le stringhe con una certa lunghezza sono finite. Questo vuol dire che ci sono tante (infinite) stringhe che vengono mappate sullo stesso hash. Se troviamo due stringhe che vengono mappate sullo stesso hash, diciamo di aver trovato una collisione.

Una funzione di hash usata in crittografia deve avere le seguenti proprietà:
  • dev'essere generabile velocemente: se voglio hashare un file di 4GB in una stringa a 128 bit, voglio metterci pochi secondi;
  • dev'essere one-way: è facile calcolare un hash a partire da una stringa, è difficile (computazionalmente intrattabile) ritrovare la stringa a partire da un hash;
  • ogni piccola modifica deve incidere molto sull'hash generato: l'hash di "aaaa" è totalmente diverso dall'hash di "aaab".
Hanno diversi usi in crittografia: firma digitale, verifiche di integrità, algoritmi di encryption, ecc...
Ovviamente, se vogliamo usare una funzione di hash per firmare o per criptare, non possiamo semplicemente applicare la funzione di hash. È possibile usare una funzione di hash per fare queste cose, ma l'applicazione della funzione è solo uno step per arrivare al risultato finale.

MD5, SHA, Whirlpool, BLAKE (ecc...) sono semplicemente alcuni algoritmi per calcolare degli hash. Come faccio a trasformare una stringa qualsiasi ad una stringa a lunghezza fissa con le proprietà che ho descritto prima? Applico uno di questi algoritmi.

Se vogliamo utilizzare una funzione di hash per memorizzare una password in un database. Se salvassimo direttamente le password, nel momento in cui qualcuno mi frega il database le credenziali di tutti gli utenti sarebbero compromesse.
Quindi decidiamo di memorizzare nel database solo l'hash della password: quando qualcuno prova a connettersi, io prendo l'hash della password che mi inviano e controllo se corrisponde all'hash che ho memorizzato. Visto che trovare una collisione (that is: un'altra password che viene mappata sullo stesso hash) è molto difficile, assumo che se gli hash corrispondono la password è esatta.

Abbiamo un altro problema: se pippo e pluto hanno la stessa password, nel database avrò memorizzato due hash identici. Se pippo mi frega il database, vede che pluto ha un hash uguale al suo e capisce la password. Per ovviare a questo problema su usa il salt (@giupardeb), ho spiegato il suo funzionamento in questo post: Criptare bene una password

Ne approfitto anche per spammare un po' la mia guida, dove (tra le altre cose) c'è spiegato come usare RSA e le funzioni di hash per effettuare la firma digitale: [GUIDA] Cosa è l'algoritmo RSA
 
  • Mi piace
Reazioni: Heisenberg420
Stato
Discussione chiusa ad ulteriori risposte.