GAP
GAP on tiedon julkaisijoiden ja hakijoiden anonymiteetin turvaamiseen tähtäävä protokolla, jota käytetään tietoliikennepakettien reititykseen P2P-teknologian päällä toimivissa virtuaalisissa tietoverkoissa. GNUnet on vapaista ohjelmistoista koostuvan GNU-käyttöjärjestelmän täyshajautettu, anonymisoiva ja sensuuria ehkäisevä P2P-runkojärjestelmä. Kirjoitushetkellä (2006) GNUnetin GAP-toteutusta käyttää ainakin järjestelmän päälle toteutettu tiedostonjakopalvelusovellus.
Perinteiset anonymisointijärjestelmät ovat olleet keskitettyjä. Niitä vastaan on kuitenkin helppo hyökätä, koska niiden ylläpitäjä voidaan pakottaa paljastamaan palvelun käyttäjien toimet. Lisäksi esimerkiksi palveluun menevät ja sieltä lähtevät pyynnöt voidaan yhdistää analysoimalla pyyntöjen tulo- ja lähtöaikoja. Yleensä tällaiset palvelut todella tarjoavat anonymiteettiä vain palvelun ylläpitäjälle, joka saa oman liikenteensä naamioitua palvelun käyttäjien liikenteeksi.
GAP-reitityksessä jokainen tietoa julkaiseva ja hakeva taho ylläpitää solmua, joka toimii anonymisointipalveluna. Anonymiteettiä tahtovat tiedonhakijat ja julkaisijat osallistuvat GAP-reititykseen, lisäävät lähetettävät viestinsä verkon muiden viestien välittämisestä aiheutuvaan kohinaan ja vastaavasti poimivat haluamansa viestit kohinan seasta. Kohina koostuu muille solmuille toimitettavasta hyötyliikenteestä, verkonylläpitoviesteistä ja satunnaislukugeneraattorilla luodusta roskadatasta. Ylläpitoviestejä käytetään mm. verkon solmujen mainostamiseen ja havaitsemiseen.
GAP-reitityksen toimimisen edellytyksenä on useita ulkoisia tekijöitä. Anonymiteettiä ei voi syntyä, jos hyökkääjä valvoo fyysisesti jokaista solmua. Järjestelmän käyttäjiä ja/tai operaattoreita voidaan uhkailla tai rangaista heitä järjestelmän
käytöstä, mikä alentaa käyttöastetta ja täten heikentää anonymiteettiä. Lakijärjestelmän on oltava sellainen, että todistustaakka on hyökkääjällä, kun väitetään jonkin käyttäjän olleen osallisena jossakin transaktiossa. Anonymiteettiä ei ole mahdollista taata oloissa, joissa yksilön on kyettävä todistamaan, ettei hän ole ollut osallisena jossain tietyssä transaktiossa. Lisäksi hyökkääjä, jolla on tarpeeksi kone- ja verkkokapasiteettia, on aina uhka anonymisoivalle reititykselle.
Osa käytön edellytyksistä taas kohdistuu tekniseen ympäristöön, jossa GAP-reititystä käytetään. Solmujen väliset yhteydet on salattava, etteivät sivulliset saa selville solmujen välisen liikenteen sisältöä. Myös välitettävä data on salattava siten, etteivät välittäjät saa selville sen sisältöä. Välitettäviä viestejä täytyy viivyttää, jottei saapuvia ja lähteviä
viestejä voida yhdistää toisiinsa. Lisäksi kaikista ulosmenevistä viesteistä on tehtävä samankokoisia, jottei niiden kokoa voi käyttää hyväksi niiden sisällön arvaamisessa. On myös pidettävä vahtia haitallisten solmujen varalta. Julkisten P2P-verkkojen tapauksessa solmut eivät voi luottaa toisten solmujen oikeelliseen toimintaan. Muut solmut voivat olla rikkinäisiä toteutukseltaan tai hyökkääjiä, jotka yrittävät löytää järjestelmästä ominaisuuksia, joilla anonymiteetin saa
murrettua.
Itse reititys toimii pääasiassa siten, että tiedon tarvitsija lähettää pyyntöviestin jollekin naapureistaan. Naapuri välittää viestin eteenpäin jollekin naapureistaan. Näin jatketaan, kunnes viesti löytää jonkin solmun, jolla haluttu tieto on. Tieto lähetetään takaisin samaa polkua pitkin, jota pyyntö tuli. Jokainen solmu matkan varrella pitää kirjaa siitä, mistä pyyntö hänelle tuli. Yksikään solmuista ei siis tiedä, oliko se solmu, joka tietoa häneltä pyysi, alkuperäinen pyytäjä vai ainoastaan toinen välittäjä. Vastaavasti ei voida tietää, oliko pyyntöön vastaava solmu alkuperäinen vastaaja vai ainoastaan toinen välittäjä. Välitettävillä pyynnöillä on elinaika (TTL), jonka perusteella vanhempia viestejä pudotetaan
verkosta pois uudempien tieltä. Elinaika asetetaan uusiin pyyntöihin arpomalla.
Reititystä pyritään tehostamaan monin tavoin. Tiedon saatavuuden parantamiseksi ja hakujen nopeuttamiseksi solmuissa voi olla välimuisti, johon välitettävää tietoa tallennetaan. Tallennettava tieto priorisoidaan sen perusteella, kuinka haluttua tieto on. Naapurit, joille pyynnöt lähetetään, valitaan satunnaisesti mutta painotetusti siten, että hakuja suunnataan solmuille, joilta on viime aikoina tullut vastauksia pyyntöihin, ja solmuille, joiden tunniste on lähempänä pyydettävän tiedon tunnistetta. Välimuistin toiminta tehostuu, kun samaa tietoa pyydetään usein samalta suunnalta. Tiedon hakuaika voi vaihdella paljon. Parhaimmillaan haettava tieto löytyy pyytävän solmun välimuistista, jolloin pyyntöä ei tarvitse lainkaan lähettää verkkoon. Pahimmassa tapauksessa tietoa ei ole verkossa lainkaan.
Jokainen solmu siis käyttää muiden solmujen liikennettä oman liikenteensä naamiointiin. Jos solmu välittää paljon liikennettä siten, että solmulle alkaa olla viestien välittämisestä enemmän haittaa kuin hyötyä, solmu voi itsenäisesti pudottaa itsensä jostain välitysketjusta. Tämän tehdäkseen solmu jättää pyyntöä välittäessään oman osoitteensa merkitsemättä pyynnön vastaus osoiteeksi. Näin tapahtuessa ketjun seuraava solmu vastaa siis pyyntöön suoraan pudottautunutta solmua edeltävälle solmulle. Tästä seuraa, että pyyntöketjut lyhenevät, mikä saattaa johtaa jopa siihen, että pyytävä solmu pyytää tietoa suoraan kohdesolmulta. Tämä ei silti heikennä anonymiteettiä, sillä kumpikaan solmuista ei edelleenkään tiedä, onko toinen solmu alkuperäinen pyytäjä tai lähettäjä.