Le funzioni di hashing mappano il testo in chiaro in hash così che tu possa riconoscere un hash univoco per ogni testo in chiaro (da ora in poi: 'plaintext')
In questo modo puoi controllare gli hash della chain, che non sono evidentemente immagazzinati da nessuna parte del disco, attraverso l'iterazione colonna per colonna per mezzo della table di chains, muovendosi indietro dall'ultima colonna della catena, fino al plaintext originario. Volendo controllare se l'hash esista nella quarta colonna dall'ultima in tutte le chains bisogna ridurre e hashare il dato hash per 4 volte, e controllare l'hash generato rispetto agli hash finali. Le collisioni sono l'unico problema delle RT. Ironicamente le collisioni sono viste come una brutta cosa per gli algoritmi di hashing, ma nel caso delle RT un algoritmo di hashing che genera collisioni con una certa regolarità sarà molto più sicuro. Un hash può essere generato da plaintext diversi (questa è ciò che si chiama collisione), ed è un grosso problema per le chains perchè ciò obbliga le chains che partono diversamente a convergersi in una. Inoltre si ottengono dei loop, che sono causati quando un hash è ridotto a plaintext che era già stato hashato in un punto precedente della catena. A causa di questi problemi di collisioni non c'è garanzia che ci sarà sempre un hash di un plaintext che verrà ridotto sino ad un altro plaintext dato. Se hai una semplice lista di hash ed i corrispondenti plaintext, qualora non trovassi un dato hash, sarai sicuro che l'hash non è presente nel set di quei plaintext. Se hai una tavola di chains, dove la funzione di riduzione riduce gli hash in un set di plaintext, tu potresti avere trilioni di chain generate ma potresti non aver generato ogni singolo plaintext del set che si intende verificare. Puoi solamente dire quanto sia probabile che una table di chains contenga un certo plaintext; una percentuale molto prossima al 100%, ma che probabilmente non raggiungerà mai il 100%. Se tu hai una rainbow table con 10 chains di lunghezza 100, tu hai hashato 1000 plaintext, ma anche se ci sono solo 100 plaintext nel set dei plaintext desiderati, i 1000 hash che hai nelle chain potrebbero non contenere tutti gli hash desiderati. Il modo in cui le collisioni vengono gestite è ciò che rende le Rainbow Table differenti dal loro predecessore, sviluppato nel 1980. Il predecessore risolveva i problemi di alcuni plaintext che non erano mai stati ridotti usando piccole tavole. Ogni piccola tavola usava una diversa funzione di riduzione. Questo non risolveva il problema completamente, ma sicuramente aiutava. Per risolvere la fusione di chain e i loop ogni chain finiva con un "distinct point" (punto di distinzione); un hash che era in qualche modo unico, es. hash dove i primi 4 caratteri fossero 0. Le chain continuavano ad andare fino a raggiungere il distinct point. Se due chain finivano allo stesso distinct point allora c'era stata una collisione da qualche parte nella catena, e una delle catene veniva scartata. Se una catena viene generata per un lungo periodo senza arrivare ad un distinct point, si sospetta un loop (dove una chain di hash termina riducendo e hashando un hash precedente della stessa catena). Il problema con questo è che se c'è una collisione ci sarà potenzialmente un intero ramo che deve essere tagliato senza essere inserito nelle chain, e un loop causerebbe la perdita di tutti gli hash che sono stati generati prima del loop. Inoltre, tutto il tempo speso nel generare quella chain sarebbe stato inutile, e fermandosi solo al distinct point si avrebbero chain di lunghezza variabile. Questo significa che tu potresti dover continuare a cercare un hash, specialmente all'interno di chain molto lunghe, dopo che le altre chain sono terminate. Le RainbowTable differiscono da questo, nella misura in cui non usano tabelle multiple per le funzioni di riduzione, usando solo una table. Comunque, nelle RT una diversa funzione di riduzione è usata per ogni colonna. In questo modo non c'è bisogno di tavole differenti con differenti metodi di riduzione, perchè le diverse riduzioni sono usate dentro la stessa tavola. In questo modo le collisioni e le fusioni di chain sono molto, molto più rare dato che dovrebbero avvenire sulla stessa colonna. Per una chain di lunghezza L la possibilità di collisione causante una fusione è ridotta a 1/L. I loop anche sono risolti, dato che se un hash in una chain è lo stesso di un hash precedente, questo non si ridurrà allo stesso plaintext. La ragione per cui sono chiamate Rainbow Tables è perchè ogni colonna usa una differente funzione di riduzione. Se ogni funzione di riduzione avesse un diverso colore, e si iniziasse con i plaintext in cima e si finisse con gli hash finali alla base, il tutto assomiglierebbe ad un arcobaleno (un arcobaleno molto lungo verticalmente e stretto). Usando le RT, l'unico problema che rimane è che non si può mai essere sicuri che le chain contengano tutti gli hash desiderati; per assicurare un maggiore grado di successo da parte di una RT, si dovrebbe generare molte più catene, ed ottenere dei ritorni in diminuzione. Spero che spiegando le Rainbow Table io non le abbia rese meno meravigliose. Enjoy your RT'ing RedLion. |