32
Wachtwoordveiligh eid Hoe veilig is jouw wachtwoord? Een onderzoek naar de verschillende methodes om de veiligheid van een wachtwoord te verzekeren. 2015 Nico Ekkart, Kyana Manssens Koninklijk Atheneum Deurne 3-4-2015

De veiligheid van wachtwoorden

Embed Size (px)

DESCRIPTION

Een onderzoek naar de verschillende methodes om een wachtwoord te beveiligen

Citation preview

Wachtwoordveiligheid

Woord vooraf

Beste lezerAlvast bedankt dat u de tijd neemt om dit onderzoek te lezen. Dit is geschreven door twee zesdejaars uit het Koninklijk Atheneum Deurne, Kyana Manssens en Nico Ekkart, in het kader van de onderzoekscompetenties. Dit is een project waar een heel schooljaar aan gewerkt wordt om onderzoeksvaardigheden voor verdere studies in te oefenen. Wij hebben het gedaan voor het vak wiskunde.

Inleiding

Wachtwoordveiligheid is in deze technologische samenleving van groot belang. We vertrouwen onze wachtwoorden zomaar toe aan talloze internetbedrijven, maar zijn onze wachtwoorden wel veilig opgeslagen? In dit onderzoek, wordt een specifieke situatie onderzocht. Stel dat een hacker op een of andere manier de toegang zou krijgen tot een database van een website, is het dan mogelijk dat die hacker de wachtwoorden van de gebruikers kan bemachtigen? Bij veel websites, hebben de beheerders gewoonweg toegang tot de database. Als een van deze beheerders kwade gedachten krijgt, is deze situatie zeker denkbaar. De hoofdvraag van dit onderzoek luidt: Hoe verzekeren internetbedrijven de veiligheid van onze wachtwoorden?. Om dit beter te onderzoeken is deze hoofdvraag opgedeeld in drie deelvragen:1) Hoe werken de methodes die gebruikt worden om een wachtwoord te versleutelen?2) Hoe zouden we een versleuteld wachtwoord kunnen ontcijferen?3) Welke van de gebruikte methodes om een wachtwoord te versleutelen is het veiligst?De eerste deelvraag kan simpelweg onderzocht worden met behulp van een literatuuronderzoek. De methodes voor de tweede deelvraag kunnen eveneens onderzocht worden met een literatuuronderzoek, waarna deze methodes kunnen worden toegepast bij ons eigen onderzoek. De derde deelvraag kan door onszelf onderzocht worden, waarna de resultaten aan de literatuur gestaafd kunnen worden. We zullen dus beginnen met een literatuuronderzoek. Het doel hiervan is om methodes te vinden voor ons eigen onderzoek. Ook kunnen we op deze manier al resultaten vinden, die we aan het eigen onderzoek kunnen staven. Bij het eigen onderzoek zullen we aan een groep mensen vragen om hun wachtwoord in te vullen, welke we dan meteen coderen. Ons doel is dan om met de ontdekte methodes zoveel mogelijk wachtwoorden te decoderen. Dit lijkt misschien onethisch, maar het is mogelijk om simpelweg te kijken of het mogelijk is om de wachtwoorden te decoderen, zonder het echt te doen. Zo zullen we nooit achter de wachtwoorden komen.

InhoudsopgaveWoord vooraf3Inleiding51. Literatuuronderzoek81.1. Definities81.1.1. Deelgebieden in de wiskunde81.1.2. Grote-O-notatie81.1.3. Encryptiefuncties en hashfuncties91.2.Coderingsmethodes101.2.1. Beschikbaarheid van methodes101.2.2. De Secure Hash Algoritmes121.2.3. De Message Digest Algoritmes121.2.4. De Whirlpool functie131.2.5. Vergelijking131.3. Decoderingsmethodes (Defuse Security, 2014)131.3.1. Woordenboekaanval131.3.2. Brute force attack131.3.3 Opzoektabel141.3.4. Regenboogtabel151.3.5. Bescherming tegen een aanval151.4. Casus151.4.1. Facebook151.4.2 Bitcoin151.4.3 Smartschool161.5. Conclusies162. Eigen onderzoek162.1. Inleiding162.2. Coderen van wachtwoorden162.2.1. Methode162.2.2. Uitvoering172.2.3. Resultaten192.3. Decoderen van wachtwoorden192.3.1. Methode192.3.2. Uitvoering202.3.3. Resultaten212.4. Conclusies223. Algemene conclusies22Bibliografie24

1. Literatuuronderzoek

Voordat we startten met de uitvoering van ons eigen onderzoek, voerden we een literatuurstudie uit. Dit deden we om de huidige kennis betreffende wachtwoordbeveiliging te staven aan de resultaten van ons eigen onderzoek. Op deze manier kan men ook al een algemeen beeld krijgen over de huidige ontwikkelingen binnen de wachtwoordbeveiliging. Als bronnen voor dit literatuuronderzoek gebruikten we echter enkel internetbronnen, omdat de standaarden niet vast staan. Wachtwoordbeveiliging is een dynamisch onderwerp. Als er een boek over zou geschreven worden zou het na een jaar al verouderd zijn. Om niet volledig in het duister te tasten bij de bespreking van de methodes, zullen we eerst een paar definities overlopen. Hierna bekijken we de verschillende methodes om een wachtwoord te coderen en decoderen. We zullen eindigen met een casus waarbij wordt bekeken welke methodes worden gebruikt bij verschillende bedrijven.1.1. Definities

1.1.1. Deelgebieden in de wiskunde

In de wiskunde zijn er verschillende deelgebieden waarin ons onderzoek geplaatst zou kunnen worden. Vooral delen van de discrete wiskunde zijn van toepassing. Discrete wiskunde is de wiskunde waarin eindige structuren worden onderzocht die een zekere regelmaat hebben (Veys, 2014). Hieronder horen de algoritmiek, waar algoritmes[footnoteRef:2] worden bestudeerd, en de cryptografie en cryptoanalyse, waar geheime boodschappen worden versleuteld en ontcijferd. [2: Een algoritme is een eindige reeks stappen waarmee een bepaald probleem kan worden opgelost. ]

1.1.2. Grote-O-notatie

We zullen in het onderzoek een paar maal de snelheid van een bepaald algoritme moeten weergeven. In de informatica wordt dit gedaan door gebruik te maken van de Grote-O-notatie. Deze notatie geeft enkel het slechtste-geval weer. Het is het maximum aantal mogelijke bewerkingen dat een algoritme zou moeten uitvoeren om tot een resultaat te komen.

Informeel betekent dit dat als we een algoritme hebben, met een gegeven invoergrootte , deze functie steeds minder dan operaties zal uitvoeren, mits gegeven dat groot genoeg is. Formeel is de functie gedefinieerd als volgt:Comment by gebruiker: Waarom opeens g(n) ipv f(n)?Dit is erg abstract en ik kan geen praktisch gebruik voorstellen.Comment by Nico Ekkart: Ik zal het gewoon weg laten. Het heeft inderdaad geen nut.Vertaald betekent dit dat voor elke waarde van er een constant getal bestaat waarvoor geldt dat de constante vermenigvuldigd met de complexiteitsfunctie () groter of gelijk is aan de functie (De best mogelijke complexiteitsfunctie is Dit is de constante complexiteit, wat betekent dat de snelheid onafhankelijk is van de invoergrootte. Een slechte complexiteit die we nog gaan tegenkomen is de exponentile complexiteitsfunctie , waar . Een voorbeeld hiervan is nu misschien op zijn plaats. Laten we het voorbeeld gebruiken van het zoeken naar een getal in een verzameling getallen. We hebben bijvoorbeeld een verzameling en een getal . De lengte van A is gelijk aan . De best mogelijke manier om dit te doen is om vanaf het begin van alle elementen af te gaan tot gevonden is. Dit algoritme[footnoteRef:3] gaat in dit geval 6 stappen uitvoeren. Het begint bij het nulde[footnoteRef:4] element en merkt dat dit niet gelijk is aan . Het gaat verder naar het volgende getal en maakt dezelfde conclusie. Dit proces wordt 6 maal herhaalt, tot het bij het vijfde element komt en ziet dat het gelijk is aan . Nu kan je niet simpelweg zeggen dat het algoritme een snelheid heeft van 6, want soms is het minder, soms is het meer. Wel is het simpel om vast te stellen dat dit algoritme nooit meer dan stappen nodig zal hebben. Daarom zegt men dat dit algoritme een snelheid heeft van . [3: Genaamd lineair search] [4: In de informatica begint men te tellen vanaf 0.]

1.1.3. Encryptiefuncties en hashfuncties

Er bestaan twee verschillende soorten versleutelingsfuncties: encryptiefuncties en hashfuncties. De encryptiefunctie is een functie die een bepaalde string[footnoteRef:5] of andere datatypes omvormt in een willekeurige vorm, die later met behulp van een soort wachtwoord terug kan gevonden worden. [5: In de informatica is een string een reeks tekens of karakters. Het is een datatype.]

De hashfunctie is een functie die een string van een willekeurige lengte omvormt naar een string met een vaste lengte. De lengte van de omgevormde string kan kleiner zijn dan de lengte van de originele string. Dit betekent dus dat er meer mogelijke originele stringen zijn dan omgevormde stringen. Volgens het duivenhokprincipe van Dirichlet[footnoteRef:6] is het dus mogelijk om overlappingen te hebben. Dit zijn meerdere stringen die door de hashfunctie omgevormd worden naar dezelfde string. [6: is het aantal elementen in een eindige verzameling . Tussen twee eindige verzamelingen en bestaat er een bijectie . (Bogomolny, 2012)]

Om wachtwoorden te versleutelen wordt er gebruik gemaakt van de hashfuncties. Dit wordt gedaan omdat het zeer moeilijk, bijna onmogelijk is om een inverse functie te vinden voor een bepaalde hashfunctie. Een hashfunctie kan maar n kant op daarom is dit ideaal voor de opslag van wachtwoorden.De reden voor deze onomkeerbaarheid kan het best uitgelegd worden met behulp van een zeer simpele hashfunctie die eveneens moeilijk omkeerbaar[footnoteRef:7] is. (Epp, 2012) [7: Als het zeer moeilijk omkeerbaar wordt, dan is het praktisch onomkeerbaar. Volledige onomkeerbaarheid is moeilijk te bereiken.]

Het wachtwoord dat moet worden omgevormd bestaat uit twee getallen. Meer specifieker kiezen we hiervoor twee relatief grote priemgetallen[footnoteRef:8], en [8: Priemgetallen zijn getallen die enkel deelbaar zijn door en zichzelf.]

De simpele hashfunctie die we zullen gebruiken om dit wachtwoord om te vormen bestaat eruit dat de twee getallen worden vermenigvuldigd. De vermenigvuldiging kan door een programma verwezenlijkt worden met het primitief algoritme dat ons in de basisschool is aangeleerd. De complexiteit van dit algoritme is , waarbij het aantal cijfers en voorstelt. Het is mogelijk om een efficinter algoritme[footnoteRef:9] toe te passen, maar dit is in dit geval nodeloos werk. [9: Een voorbeeld hiervan is de Karatsuba vermenigvuldiging]

Deze waarde was simpel te verkrijgen. De ander kant op is echter moeilijker. Hiervoor zouden we het product moeten ontbinden in priemfactoren. Het snelst bekende algoritme om een getal te ontbinden is het Pollard Rho algoritme. De complexiteit van dit algoritme is:Dit is voor een grotere waarde van dichter bij een exponentile functie dan bij een kwadratische, dus is het veel trager dan de vermenigvuldiging. Het is theoretisch mogelijk om deze functie om te keren, maar het is simpelweg onrealistisch. In de praktijk wordt dit algoritme wel toegepast, maar dan met veel grotere priemgetallen. De meeste hashfuncties werken volgens hetzelfde principe en gebruiken veel van deze moeilijk omkeerbare operaties, waardoor de volledige functie praktisch onomkeerbaar wordt. 1.2.Coderingsmethodes

1.2.1. Beschikbaarheid van methodes

Voor het eigen onderzoek zullen we gebruik maken van de programmeertaal PHP. Met deze programmeertaal is het gebruikmaken van verschillende hashfuncties mogelijk. Een volledige lijst van de mogelijke functies kan gevonden worden op de officile PHP website (PHP Group, 2014): md2 md4 md5 sha1 sha224 sha256 sha384 sha512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost gost-crypto adler32 crc32 crc32b fnv132 fnv1a32 fnv164 fnv1a64 joaat haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5Uit deze lijst zullen wij er een paar onderzoeken: md2 md5 sha1 sha512 whirlpoolDeze kiezen we om verschillende redenen. We willen in ons onderzoek kijken of de lengte van een hashwaarde[footnoteRef:10] belangrijk is voor de veiligheid. Hiervoor hebben we dus ongeveer dezelfde functies nodig, met een verschillende hashwaarde. Dit was de reden voor de keuze van md2, md5, sha1 en sha512. Whirlpool werd gekozen omdat dit algoritme wordt aanbevolen door PHP group. [10: Dit is de output van een bepaalde hashfunctie, uitgedrukt in bits met een vaste lengte, je kunt het vergelijken met een digitale vingerafdruk]

1.2.2. De Secure Hash Algoritmes

De afkorting hiervan is SHA, soms ook wel de SHA-familie genoemd. Al deze hashfuncties zijn ontworpen door de Amerikaanse National Security Agency. De eerste werd ontworpen in 1993. SHA wordt voor zeer veel zaken gebruikt: het is de basis van de federale applicaties in de Verenigde Staten, Bitcoin en de Xbox-spelcomputer. SHA-1, soms ook SHA-256 genoemd, is gemaakt in 1995 en heeft een hashwaarde van 160-bits. Deze hashwaarde is een typisch hexadecimaal[footnoteRef:11] nummer. Nadat deze meerdere aanvallen heeft ondergaan, die enkele keren zijn geluk, heeft men besloten om deze Secure Hash Algoritmes te optimaliseren naar een nieuwe, betere versie die deze aanvallen wel zou kunnen ondergaan zonder problemen, namelijk SHA-2.In ons onderzoek gebruiken we SHA-512, dit maakt een deel uit van de groep SHA-2. SHA-512 heeft een hashwaarde van 512-bits. [11: Als je hexadecimaal letterlijk zou vertalen dan betekent het 16-talig. Het is een getallenstelsel met 16 cijfers i.p.v. 10 cijfers, omdat we maar tien cijfers hebben wordt dit aangevuld met het alfabet (A t.e.m.F). Je zou dit kunnen vergelijken met je vingers, in het dagelijks leven maken we gebruik van een tiendelig stelsel dit komt overeen met tien vingers. In de informatica maken we gebruik van 16 "vingers" dus een 16-delig stelsel.]

Hoe werkt deze functie?1.2.3. De Message Digest Algoritmes

De Message Digest Algoritmes worden afgekort als MD. Deze coderingsmethode bestaat uit vier verschillende methodes waarvan wij er twee onderzochten en gaan bespreken. Als eerste de md2, deze encryptiemethode is gemaakt in 1989 door Ronald Rivest, speciaal geoptimaliseerd voor 8-bit computers. met een hashwaarde van 128-bits. Hoewel deze onveilig is verklaard, blijft het toch in gebruik bij een aantal verouderde e-mailservers. Toen men in 2004 md2 aanviel waren er maar liefst 2104 toepassingen nodig om de veiligheid van md2 te verminderen.Als men een wachtwoord of zelfs niets invulde in onze site en we in onze database zouden gaan kijken zouden we vernemen dat de encryptie maar liefst 32-digit hexadecimale karakters bevat. Het Md5 is ontworpen in 1991 eveneens door Ronald Rivest, ter vervanging van zijn voorganger md4. Hoewel md5 iets trager is dan zijn voorganger, is md5 wel veel veiliger. Het wordt gebruikt als internetstandaard om de integriteit[footnoteRef:12] van documenten te bepalen. In 1996 dachten ze een schoonheidsfoutje ontdekt te hebben, later bleek het dat md5 niet meer volledig veilig was door dit schoonheidsfoutje. Vanaf dan raden sommige informatici de SHA functies aan.Het verschil tussen de twee is dat ze een ander algoritme gebruiken, welke de uitvoer bepalen. Md5 wordt als zeer veilig beschouwd maar wordt niet aangeraden voor online bankieren. Md-hashfuncties zijn wel gevoeliger voor de regenboogaanval. . [12: integriteit betekent de eerlijkheid en/of betrouwbaarheid van iets, in dit geval een bestand]

1.2.4. De Whirlpool functie

De Belg Vincent Rijmen en de Braziliaan Paulo S. L. M. Barreto hebben deze coderingsmethode gecreerd in 2000. De Whirlpool functie is gebaseerd op AES, Advanced Encryption Standard, en bestaat uit 512 bits. Het is verklaard als internationale standaard door het internationale organisatie voor standaardisering (ISO) en het internationale elektrotechnische commissie (IEC). De naam van het algoritme Whirlpool is gebaseerd op een spiraal gevonden in onze Melkweg, genaamd the Whirlpool Galaxy.Whirlpool maakt gebruik van een 8.8 matrix, zo bekomt het aan een hashwaarde van 512 bits.1.2.5. Vergelijking

Met deze gegevens kunnen we de eigenschappen van de hashfuncties, die we bij ons eigen onderzoek gaan gebruiken, vergelijken:Relatieve snelheid (Dai, 2013)Grootte (bits)

Md25128

Md54128

Sha-13160

Sha-5122512

whirlpool1512

Tabel 1: vergelijking hashfuncties literatuurBij de relatieve snelheid is het grootste getal het snelst. Bij hashfuncties is het de algemene regel dat, hoe trager het algoritme is, hoe veiliger het is. Dit komt omdat dit ook de snelheid van het herhaaldelijk omvormen van wachtwoorden, wat nodig is om een wachtwoord te decoderen.Comment by gebruiker: Sneller = veiliger, maar hiet zijn fties met grootste hashwaarde toch het snelst en het veiligst??Comment by Nico Ekkart: Trager = veiliger. In de tabel stelt de grootste relatieve snelheidm de grootste snelheid voor, dit komt voor bij de kleinste hashwaarden. Functies met een grotere hashwaarde zijn trager -> veiliger1.3. Decoderingsmethodes (Defuse Security, 2014)

1.3.1. Woordenboekaanval

Een Woordenboekaanval gebruikt een bestand dat bestaat uit woorden, zinnen en veelgebruikte wachtwoorden. Elk woord wordt omgevormd met de gebruikte hashfunctie. Deze hashwaarde wordt vergeleken met de database. Als de twee gelijk zijn, is het wachtwoord gevonden. Soms worden ook veelvoorkomende aanpassingen gedaan aan het woordenboek. Een voorbeeld hiervan is elk wachtwoord omvormen naar zijn leet speak equivalent. Leet speak is een het omvormen van letters naar cijfers. Zo wordt het woord hello omgevormd naar h3110. De snelheid van een woordenboekaanval hangt af van het aantal woorden in het woordenboek, maar ook van het aantal wachtwoorden dat je wilt vinden. Als een hashfunctie een snelheid van heeft, dan heeft een woordenboekaanval een snelheid van . Hierbij is het aantal woorden in het woordenboek en is het aantal wachtwoorden dat je wilt vinden. 1.3.2. Brute force attack

Een brute force attack, of brute kracht aanval, kan je zien als een toepassing op een woordenboekaanval. Hier is het woordenboek gelijk aan alle mogelijke tekenreeksen tot een bepaalde lengte. Als we alle mogelijke tekenreeksen met lengte 2 willen maken, kunnen we beginnen met de volgende: aa,ab,ac,a0,a1,a2, . Om te berekenen hoeveel mogelijkheden er zijn, maken we gebruik van het aantal herhalingsvariaties. Er zijn 26 mogelijke letters en 10 mogelijke cijfers, dus zijn er in totaal 36 mogelijke tekens. Er zijn ook nog hoofdletters, leestekens en andere symbolen, maar die verwaarlozen we nu, omdat zal blijken dat we met enkel deze tekens al aan een vrij groot getal komen. We moeten er 2 kiezen, dus krijgen we . Algemeen, als we een wachtwoord hebben van tekens hebben, Dit is een exponentile functie en heeft dus een snelheid van waar . Dit is traag voor langere wachtwoorden. De gemiddelde wachtwoordlengte is (Lampe, 2014)en dus wordt het aantal mogelijke wachtwoorden . De gemiddelde computer kan instructies per seconde aan (USACO, 2004), dus zal deze een wachtwoord in het slechtste geval kunnen kraken in . Dit is praktisch ondoenbaar en wordt dan ook niet vaak gebruikt. 1.3.3 Opzoektabel

Een opzoektabel is een zeer effectieve methode om veel wachtwoorden die gecodeerd zijn met dezelfde hashfunctie te decoderen. Deze tabellen maken gebruik van een wachtwoordbestand (woordenboek) waarvan elk wachtwoord wordt gecodeerd met een bepaalde functie. Dit proces[footnoteRef:13] kan even duren, maar dit is slechts eenmalig. Hierna worden alle hashes die we willen decoderen vergeleken met die die net zijn omgevormd. Als het aantal wachtwoorden dat we willen vinden gelijk is aan en het aantal wachtwoorden in ons wachtwoordbestand gelijk is aan , dan is de snelheid van het opzoeken van een wachtwoord na de precomputatie gelijk aan Een groot nadeel aan de opzoektabel is dat het veel plaats nodig heeft.Comment by gebruiker: Onduidelijk => vb?Comment by Nico Ekkart: Ik zal een voorbeeld toevoegen ter verduidelijking [13: Wordt ook wel de precomputatie genoemd]

Als we nu bijvoorbeeld volgend woordenboek en wachtwoordbestand bezitten. A is het woordenboek en B is het bestand met wachtwoorden die we willen vinden: Figuur 1: Wachtwoordbestand B (sha-1)adb0b225e3690cd3a274e3799eb19e2bd655a718ee9d0ad611162df299ca5cec19cfb61288a1050d1017dc11a6c6edddb993e5911cd6a41403b4548bWachtwoord0Wachtwoord1Wachtwoord2Wachtwoord3Wachtwoord4Wachtwoord5Wachtwoord6Wachtwoord7Wachtwoord8Wachtwoord9

Figuur 2: Woordenboekbestand ADe eerste stap is het omvormen van alle wachtwoorden in A. Hiermee krijgen we volgend bestand:Figuur 3: Opzoektabel C65afb98a6464ca3b17093952fee36272539e9e4f1b154e84cf5ffad493c7ed51df7dc9cc2ecafbf6a469ee82a73c265a75352bc8727d2f6de6b659320f4c5a0a546b24cbea6a862bbf4067ed4f935910300535d17fa156acb61e2dc218492642e5383830adb0b225e3690cd3a274e3799eb19e2bd655a718dbd10f997374aa102d016078ef3a62979cee0b5fc67f26f6c4ab45d80a4f9fa15caa03263d361a83ee9d0ad611162df299ca5cec19cfb61288a1050d4474efbac24beb7fa5b56900891fc5eb965df8bb

Nu moeten alle wachtwoorden uit B vergeleken worden met de opzoektabel C. Als een wachtwoord is gevonden, kunnen we zien op welke plaats het stond in de opzoektabel. Dan weten we dat het dezelfde plaats had in A. We kunnen nu bijvoorbeeld volgende uitvoer krijgen:Figuur 4: Resultaten opzoektabeladb0b225e3690cd3a274e3799eb19e2bd655a718 gevonden op plaats 5ee9d0ad611162df299ca5cec19cfb61288a1050d gevonden op plaats 81017dc11a6c6edddb993e5911cd6a41403b4548b niet gevonden

Deze plaatsen kunnen dan handmatig in het woordenboekbestand gevonden worden.1.3.4. Regenboogtabel

Een regenboogtabel is in veel opzichten hetzelfde als een opzoektabel. Het proces is hetzelfde, maar tijdens de precomputatie worden de hashes verkleind door gebruik te maken van een omkeerbare cryptografische functie. Op deze manier wordt er plaats bespaard, maar is het wel trager. Om vervolgens de wachtwoorden te vergelijken, worden ook de wachtwoorden die we willen vinden verkleind met hetzelfde proces. Hier kan je het verkleinen van de wachtwoordlijst ook zien als een deel van de precomputatie, waardoor de snelheid van het opzoeken gelijk blijft aan 1.3.5. Bescherming tegen een aanval

Een van de simpelste en veiligste methodes om het grotendeel van deze aanvallen tegen te gaan, is het gebruik van een zogenaamde salt. Een salt is een tekenreeks die voor het eigenlijke wachtwoord wordt geplaatst voor het wordt gecodeerd. Om veilig te zijn, moet deze verschillend zijn voor alle gebruikers. Om de wachtwoorden dan te vergelijken bij het inloggen, wordt eerst de salt uit de database gehaald, waarna het voor het wachtwoord wordt geplaatst voor het coderen. Comment by gebruiker: Extra wachtwoord gemaakt door beheerder van de toepassing?Comment by Nico Ekkart: Het wordt automatisch gecreerd met behulp van bijvoorbeeld een willekeurig getal. Verduidelijking wordt toegevoegdPraktisch wordt deze salt automatisch gecreerd bij het registreren, waarbij dan bijvoorbeeld een willekeurig getal gebruikt wordt. Met deze methode is het niet onmogelijk voor hackers om het wachtwoord te decoderen, maar het wordt zo wel moeilijker. 1.4. Casus

1.4.1. Facebook

Facebook is een veelgebruikte site, niet enkel bij jongeren, maar bij alle leeftijdsgroepen. Deze website had in juni 2014 ongeveer 1,3 miljard actieve gebruikers en dit aantal stijgt elke dag. Het gebruikt de Hardware Security Modules (HSM) methode om hun wachtwoorden te coderen. Het codeert de wachtwoorden niet voor 100% maar ze zijn toch praktisch onomkeerbaar. Dit is redelijk logisch want ze moeten honderden wachtwoorden omvormen in enkele seconden. Dit proces moet zeer snel gaan, anders zou je veel langer moeten wachten voordat je ingelogd bent in Facebook. HSM is een van de veiligste methoden en wordt bij vele sites gebruikt zoals bij onlinebankieren.1.4.2 Bitcoin

Bitcoin is voor sommigen nog iets onbekend alhoewel het al vanaf 2009 bestaat, eigenlijk is het gewoon elektronisch geld. Het wordt soms ook wel cryptografisch geld genoemd. Bitcoin maakt gebruik van de hashfunctie SHA-256. Deze hashfunctie wordt niet gebruikt om de wachtwoorden te coderen maar wel om de gegevens van de gebruikers te coderen. Naar deze informatie zijn sommige hackers ook op zoek. In de toekomst kan dit een probleem zijn als er sterkere computers worden ontwikkeld. 1.4.3 Smartschool

Smartschool wordt veel gebruikt door leerling en leerkrachten maar hoe veilig is het eigenlijk? Deze site maakt gebruik van de hashfunctie SHA-256 met een output van 160 bits. Deze hashfunctie werd verleend door de GlobalSign Organization Validation CA. deze hashfunctie is zeer veilig en staat op de derde plaats van de onderzochte hashfuncties.

1.5. Conclusies

Voor het eigen onderzoek zullen we verschillende hashfuncties onderzoeken. We onderzoeken hun snelheid en we zullen proberen om echte wachtwoorden te decoderen. Hiervoor zijn er verschillende mogelijkheden. De snelste en simpelste methode is de opzoektabel. We zouden deze kunnen verkleinen door er een regenboogtabel van maken, maar dit wordt te moeilijk. De simpelste methode werkt hier dus het meest efficint.Voor de duidelijkheid gaan we hier de resultaten van de casus in een tabel weergeven.

WebsiteHashfunctieVerleend door Hashwaarde (in bits)

Facebook.com

HSMverscheidene/

Bitcoin.orgSHA-256 (enkel voor persoonlijke gegevens)

verscheidene160

Kadeurne.smarschool.beSHA-256GlobalSign Organization Validation160

2. Eigen onderzoek2.1. Inleiding2.2. Coderen van wachtwoorden

2.2.1. Methode

Er werd een website gemaakt, waar mensen hun wachtwoord konden invoeren. Hierbij werden ze gegarandeerd dat wij hun wachtwoord nooit kunnen zien. Dit konden we garanderen, omdat de wachtwoorden meteen werden gecodeerd met behulp van verschillende hashfuncties. Deze hashwaarden werden dan opgeslagen in een beveiligde database. . Comment by gebruiker: Link website toevoegenComment by Nico Ekkart: De database blijft voor de garantie van de veiligheid verborgen. Na dit OC zal hij ook meteen verwijdert worden.Om er zeker van te zijn dat de hashfuncties correct waren, werd er gebruik gemaakt van de PHP codebibliotheek. Dit is een verzameling van functies die worden vrijgegeven onder de Creative Commons licentie[footnoteRef:14]. Al deze functies zijn getest en vaak gebruikt, waardoor ervan uitgegaan mag worden dat ze betrouwbaar zijn. De database interface die gebruikt werd was PDO (Toering, 2013). Dit is een van de veiligste methodes om met een database te verbinden. De veiligheid van de wachtwoorden werd dus door ons gegarandeerd. Comment by gebruiker: referentieComment by Nico Ekkart: Eigen kennis? Ik zal er een standaard over opzoeken [14: Deze licentie staat anderen toe om het werk te kopiren, distribueren, vertonen, op te voeren, om afgeleid materiaal te maken en te gebruiken voor commercile doeleinden maar uitsluitend als de maker vermeld wordt en de code ook onder dezelfde licentie verspreidt wordt. (Merkley, 2015)]

2.2.2. Uitvoering

We maakten gebruik van de gratis hosting-service biz.nf. Als gratis domein werd het adres www.wachtwoord-oc.co.nf gebruikt. We vroegen aan ongeveer 100 mensen om hun wachtwoord in te vullen op de website. Hierbij kregen ze de garantie dat het wachtwoord in zijn originele vorm niet teruggevonden kon worden, noch door ons, noch door anderen. De voorpagina die men kon zien bij de website zag eruit als volgt:

Figuur 5: screenshot homepaginaOm het wachtwoord in te voeren, hadden we enkel een formulierveld nodig. Dit zag er uit als volgt:

Figuur 6: screenshot formulierVertrouwde men het nog niet, konden ze ons contacteren of de veiligheidsgaranties bekijken aan de onderkant van de pagina:

Figuur 7: screenshot veiligheidsgarantieDe ingevulde wachtwoorden werden dan via PHP omgevormd naar md2, md5, sha1, sha512 en whirlpool. Deze werden dan via PDO naar een MySQL-database geschreven. Om vervolgens een wachtwoordlijst te krijgen, werd deze database gexporteerd. 2.2.3. Resultaten

In totaal vulden 109 mensen hun wachtwoord in. Dit is een goede representatieve steekproef van de populatie. Aangezien we de identiteit van de mensen niet hebben opgeslagen, kunnen we op geen enkele manier nagaan of het een gevarieerde groep mensen was. Wat we wel kunnen nagaan is waar we het hebben gevraagd. Dankzij meneer Sels werd onze website op de voorpagina van smartschool gezet. Via deze weg kan de enqute voornamelijk ingevuld zijn door jonge mensen, van de leeftijd 12-18. Ook kan het op deze manier ingevuld zijn door leerkrachten. Hierna werd het geplaatst op de Facebook-pagina van de school. Hierdoor weten we totaal niet wat voor mensen ze hebben ingevuld. De groep kan gevarieerd zijn, maar het is ook perfect mogelijk dat de resultaten de resultaten zijn van allemaal zestienjarigen. Misschien maakt het ook niet veel uit of de groep gevarieerd is of niet. Er is geen aanwijzing te vinden in de literatuur dat de sterkte van een wachtwoord afhangt van de leeftijd. Comment by gebruiker: zinsbouwBij het omvormen van deze wachtwoorden zijn er geen problemen opgedoken. Er was ook geen indicatie van een methode die veiliger was dan de andere. In PHP wordt er gewoonweg n functie gebruikt om alle wachtwoorden om te vormen, met behulp van alle mogelijke hashfuncties[footnoteRef:15]. Er is op deze manier geen verschil te merken tussen de verscheidene hashfuncties. [15: Zie 1.2.1. Beschikbaarheid van methodes]

2.3. Decoderen van wachtwoorden

2.3.1. Methode

Zoals bij het literatuuronderzoek gezien is, zijn er verschillende methodes om een wachtwoord te decoderen. Op dit moment beschikken we over een lijst van 109 wachtwoorden. Ze zijn allemaal gecodeerd naar verschillende vormen. Ons doel is om deze wachtwoorden te decoderen, we willen ze terug omvormen naar hun originele vorm. Dit zullen we met een van de methodes doen die besproken werd[footnoteRef:16]. Een brute force attack is ondoenbaar dus die zullen we al zeker niet doen. Een woordenboekaanval zou mogelijk zijn, als we een heel snelle hashfunctie gebruiken. Hier zouden we namelijk een woordenboek moeten gebruiken, waarvan we elk wachtwoord zouden omvormen en vervolgens vergelijken met de wachtwoorden uit de database. Een opzoektabel is beter mogelijk. Bij het gebruiken van een opzoektabel worden eerst alle wachtwoordenwachtwoord van het woordenboek omgevormd als een soort precomputatie. De wachtwoorden uit de database worden vervolgens vergeleken met het omgevormde woordenboek. We gaan geen regenboogtabel gebruiken, om dat dit voor te veel problemen kan zorgen, met te weinig voordelen. Het is zeer moeilijk om een goede compressiefunctie te schrijven voor de regenboogtabel. [16: 1.3. Decoderingsmethodes (Defuse Security, 2014)]

Als woordenboek wordt een woordenboek gebruikt dat online beschikbaar is (Defuse Security, 2015). Dit woordenboek bevat 1.493.677.782 wachtwoorden (15GB). Het is een verzameling van online woordenlijsten, woordenboeken (in de normale zin van woordenboek) en gelekte wachtwoorden. Bij een recente studie van 373.000 wachtwoorden, werd 49.98% procent gevonden met behulp van deze wachtwoordlijst. Nu moeten we kiezen welke hashfunctie we zullen gebruiken voor de omvorming. Hiervoor moet de snelheid van onze implementaties gemeten worden via een kleinere wachtwoordlijst. Uit deze resultaten kunnen we dan meteen concluderen welke hashfunctie het veiligst is. Dit zal echter wel afhankelijk zijn van de implementatie. Na de volledige omvorming van het woordenboek, zal voor alle wachtwoorden uit de database gecontroleerd worden of ze in de opzoektabel staan. Dit zal gedaan worden via een eenvoudig C++ programma. Dit programma zal zeer traag zijn omdat het in het slechtste geval wachtwoorden moet bekijken of vergelijken? . We zagen[footnoteRef:17] dat een computer ongeveer instructies per seconde aankan, dus zal het vinden duren. Hier is echter nog een belangrijke factor vergeten: het vergelijken van tekenreeksen. Voor het vergelijken van een tekenreeks is er geen beter algoritme dan het controleren van alle tekens in de reeks en te stoppen als je een verschil tegenkomt. Aangezien de snelheid hiervan dus afhangt van de lengte van de uitvoer van de hashfunctie, zullen we een gulden middenweg moeten vinden tussen een snelle hashfunctie, met een kleine uitvoer. De hashfunctie die hackers in het echte leven moeten gebruiken zullen afhangen van website tot website. [17: 1.3.2. Brute force attack]

2.3.2. UitvoeringVolgens plan, beginnen met het downloaden van het woordenboek. Dit brengt al de nodige problemen met zich mee: een trage internetverbinding en te weinig geheugen vrij op de centrale computer. Dit eerste probleem kan simpelweg opgelost door even te wachten, 10 uur om precies te zijn. Het tweede probleem is moeilijker op te lossen. Niet enkel het woordenboekbestand van 15GB moet opgeslagen worden, maar ook de precomputatie hiervan (GB). Hiervoor werd een computer uit de kelder gehaald met 100GB geheugen, wat normaal gezien genoeg moest zijn. Comment by gebruiker: precomp?Comment by Nico Ekkart: Inderdaad een beter woord ervoor Nu moet er beslist worden welke hashfunctie zal gebruikt worden voor de omvorming van de wachtwoorden. Hiervoor creren we een klein woordenboekbestand (10 MB10MB) waarop we alle hashfuncties laten werken. We meten hierbij de tijdsduur van de omvorming. Dit zijn de resultaten:HashfunctieTijdsduur (s)Grootte (bits)

Md230,192128

Md510,052128

Sha-114,147160

Sha-51226,588512

whirlpool16,642512

Tabel 2: vergelijking eigen hashfunctiesDeze resultaten komen niet goed overeen met de literatuur[footnoteRef:18]. Hieruit kunnen we concluderen dat onze implementaties niet zo efficint zijn. Nu zou je zeggen dat md5 de beste hashfunctie voor onze doeleinden is. Dit is theoretisch zo, maar praktisch zou het voor moeilijkheden zorgen. Dit is zo omdat we enkel een implementatie hebben in de programmeertaal C. Het is mogelijk om het hiermee te doen, maar hier ben ik (Nico) niet zo goed mee. Het is ook slechts een klein verschil in snelheid en grootte met sha-1, welke we zullen gebruiken. Nu kunnen we via de regel van drie berekenen hoe lang het omvormingsprogramma ongeveer zal duren voor een bestand van 15GB (15.000MB): . Dit was in de praktijk een beetje langer, door de uitputting van de processor. De uiteindelijke grootte van de opzoektabel was 45 GB45GB. Dit is een gigantisch bestand, wat natuurlijk nodig is voor een goed resultaat. lettertypeComment by gebruiker: Je hebt elk wachtwoord ingegeven op de website omgezet met de verschillende hashfuncties, ja? En dan de makkelijkst te krkaken functie gekozen? Als je FB wil hacken moet je natuurlijk hun hashftie gebruiken? Comment by Nico Ekkart: Ja, inderdaad, maar dan kan precies dezelfde methode gebruikt worden. Het gaat dan enkel trager duren. Ik zal hier een kleine uitbreiding over schrijven [18: Tabel 1: vergelijking hashfuncties literatuur]

Nu is al wat we nog nodig hebben, een lijst van alle wachtwoorden uit de database, omgevormd met behulp van sha-1. Dit is zeer simpel om te doen met behulp van de database-interface PHPMyAdmin. Hierbij moet je enkel op de knop exporteren drukken en je hebt al een lijst. Deze lijst van wachtwoorden wordt dan met behulp van een simpel C++ programma (en grep, een linux functie) vergeleken met de opzoektabel. Dit duurt zeer lang, omdat je een zeer grote opzoektabel hebt. We beschikken over een lijst van 109 wachtwoorden en een opzoektabel van wachtwoorden. We weten ook dat sha-1 uitvoer een grootte heeft van 160 bits. Elk teken heeft 4 bits nodig, dus heeft het een lengte van . Het aantal instructies wordt dan . Aangezien een computer instructies per seconde aankan, zal dit proces . In de werkelijkheid was het ongeveer even veel. Comment by gebruiker: Dus een programma om wwoorden te vgln met wboek?Comment by Nico Ekkart: Ja, om zo snel mogelijk alle wachtwoorden van de lijst te vergelijken met de opzoektabel. Moet dit verder uitgelegd worden?Comment by gebruiker: Hoe lang?Comment by Nico Ekkart: Dit kan ik niet zeggen, aangezien het niet gemeten was en ik niet thuis was toen het was beindigd.Nu moesten enkel alle gegevens geanalyseerd worden. Via een Excel-werkblad werden de gevonden wachtwoorden geteld en in een grafiek gezet. 2.3.3. Resultaten

Het eerste wat we hebben geleerd, is dat het met elke hashfunctie mogelijk is om hetzelfde resultaat te verkrijgen. Bij de veiligere hashfuncties zoals whirlpool en sha-512 zal het enkel langer duren en zullen er meer moeilijkheden voorkomen. De veiligheid hangt dus met deze methode niet af van de gebruikte hashfunctie. Het aantal wachtwoorden dat gevonden is, kan gezien worden op volgende grafiek:

Figuur 8: Grafiek gevonden wachtwoordenIn totaal hadden we 109 wachtwoorden. We hebben gevonden dat hiervan 8 wachtwoorden blanco waren ingevuld. Dit konden we zien door zelf een blanco tekenreeks om te vormen met sha-1, en dan te zoeken naar de hashwaarde. Deze kwam 8 maal voor. Van de overige 101 wachtwoorden hebben we in totaal 27 wachtwoorden gevonden. In totaal hebben we dus 25% van de wachtwoorden gevonden, wat best wel een groot getal is. Van deze 27, was er 1 wachtwoord dat 2 keer voorkwam, maar dit was ook het geval voor de 74. 2.4. Conclusies

Het is voor elke hashfunctie mogelijk om veel van de wachtwoorden te decoderen. Dit aantal hangt niet af van de hashfunctie, maar van het woordenboek dat gebruikt wordt. Het enige wat een veiligere methode beter doet, is dat het de hacker moeilijker maakt om de wachtwoorden te decoderen. Dus toch minder wachtwoorden in of minder wachtwoorden in een bepaalde tijd? Moeilijk is echter niet onmogelijk en het is zeker mogelijk voor een belangrijk wachtwoord, als er tijd in wordt gestoken. Het is mogelijk om, met behulp van het woordenboekbestand dat wij hebben gebruikt, ongeveer 25% van de wachtwoorden te decoderen. Dit resultaat komt echter niet zonder de nodige problemen, maar die problemen zijn allemaal met wat toewijding op te lossen. De enige manier waarmee je dit resultaat kan verhogen, is door een beter woordenboekbestand te gebruiken.3. Algemene conclusies

Met al deze informatie is het nu mogelijk om de deelvragen te beantwoorden. Ter herinnering waren deze de volgende: 1) Hoe werken de methodes die gebruikt worden om een wachtwoord te versleutelen?2) Hoe zouden we een versleuteld wachtwoord kunnen ontcijferen?3) Welke van de gebruikte methodes om een wachtwoord te versleutelen is het veiligst?De methodes om een wachtwoord te versleutelen, hashfuncties genaamd, werken met behulp van een algoritme, dat ervoor zorgt dat het wachtwoord wordt omgevormd en niet meer kan teruggevonden worden. Dit wordt gedaan door gebruik te maken van een reeks stappen, waar veel stappen moeilijk omkeerbare stappen zijn. Dit zorgt ervoor dat het geheel praktisch onomkeerbaar is.Uit het voorgaande blijkt dat het onmogelijk is om een versleuteld wachtwoord rechtstreeks terug om te vormen naar zijn oorspronkelijke vorm. De enige manier is om alle mogelijkheden te controleren. Hier bestaan echter nog verschillende methodes bij, de ene al wat sneller dan de andere. De traagste methode, die zeker niet aangeraden wordt, is de brute force attack. Deze controleert letterlijk alle tekenreeksen die mogelijk zijn (beperkt door een maximumlengte). Er zijn er veel te veel om te controleren, waardoor deze methode niet praktisch bruikbaar is. Er zijn dan ook nog methodes die gebruikmaken van een woordenboek. Om hiermee een wachtwoord te vinden is het belangrijkst dat een kwaliteitsvol woordenboek wordt gebruikt, dat het grotendeel van de gebruikte wachtwoorden bevat. Het verwerken van dit woordenboek kan op verschillende manieren gebeuren. Het kan via een woordenboekaanval gedaan worden, waar elk wachtwoord van het woordenboek wordt gecodeerd en vervolgens vergeleken met het wachtwoord waar je naar op zoek bent. Als je meerdere wachtwoorden wilt vinden, is er nog een optimalisatie, de opzoektabel, die gebruik maakt van de precomputatie van de coderingen van dit woordenboek. Deze heeft een zeer grote plaats in het geheugen nodig, waardoor het vaak voor moeilijkheden kan zorgen. Dit probleem kan verholpen worden door gebruik te maken van de regenboogtabel. Deze methode is zo goed als hetzelfde als een opzoektabel, maar verkleint deze met behulp van een compressiefunctie. Voor een hacker maakt het niet uit welke hashfunctie gebruikt werd. Hij zal met behulp van hetzelfde woordenboekbestand altijd dezelfde wachtwoorden wel en niet vinden. Het enige wat zal variren is de snelheid waarop dit zal gebeuren. Deze snelheid hangt grotendeels samen met de snelheid van de gebruikte hashfunctie: hoe trager de hashfunctie, hoe langer een hacker erover zal doen om een wachtwoord te decoderen. Hieruit kunnen we concluderen dat het veiliger is om een tragere hashfunctie te gebruiken. Volgens de literatuur was de traagste hashfunctie theoretisch de whirlpool functie, wat niet zo goed overeenkwam met onze resultaten. Bij ons was namelijk de md2 functie het traagst, welke normaal gezien het snelst moet zijn. Dit is te wijten aan een slechte implementatie. Er moet vanuit gegaan worden dat hackers altijd over de beste implementaties zullen beschikken, waardoor de snelheid zeer dicht bij de theoretische snelheid moet liggen. We mogen er dus vanuit gaan dat whirlpool de veiligste van de onderzochte hashfuncties is. De onveiligste is md2.Met de antwoorden op deze deelvragen kunnen we nu de hoofvraag beantwoorden. Deze was: Hoe verzekeren internetbedrijven de veiligheid van onze wachtwoorden?.Dit doen ze in de eerste plaats dus door het coderen van deze wachtwoorden. Het blijkt echter dat deze methode niet veilig genoeg is, aangezien het ons gelukt is om ongeveer 25% van de wachtwoorden te vinden. Er wordt vaak ook gebruik gemaakt van een salt, waardoor het veel moeilijker wordt voor de hacker om de decoderingsmethodes toe te passen. Er moet wel onthouden worden dat hier een specifieke situatie werd onderzocht, waarbij we ervan uitgingen dat we de mogelijk hadden om in de database naar de omgevormde wachtwoorden te kijken. Het belangrijkste wat internetbedrijven dus kunnen doen is het beveiligen van hun database en de interactie van hun database. Hier zijn al talloze kwaliteitsvolle boeken en papers (Murray, 2010) over geschreven. We gaan hier niet dieper over in. Als al deze technieken om een database te beveiligen gebruikt worden, dan is het heel onwaarschijnlijk dat men in een database geraakt. Het is echter wel mogelijk als dit met kwaad opzet gebeurt door een medewerker van het bedrijf die de toegang heeft tot de database. Als men er in geraakt, is er ongeveer 25% kans dat jouw wachtwoord gevonden wordt.

BibliografieBogomolny, A. (2012). Pigeonhole Principle. Opgeroepen op januari 23, 2015, van Interactive Mathematics Miscellany and Puzzles: http://www.cut-the-knot.org/do_you_know/pigeon.shtmlDai, W. (2013, februari 20). Crypto++ 5.6.0 Benchmarks. Opgeroepen op januari 25, 2015, van Crypto++: http://www.cryptopp.com/benchmarks.htmlDefuse Security. (2014, augustus 6). Salted Password Hashing - Doing it Right. Opgeroepen op januari 24, 2015, van CrackStation: https://crackstation.net/hashing-security.htmDefuse Security. (2015, januari 25). CrackStation's Password Cracking Dictionar. Opgeroepen op januari 26, 2015, van CrackStation: https://crackstation.net/buy-crackstation-wordlist-password-cracking-dictionary.htmEpp, D. (2012, februari 14). Why are hash functions one way? If I know the algorithm, why can't I calculate the input from it? (O. Daraghme, Redacteur) Opgeroepen op november 21, 2014, van StackExchange Information Security: http://security.stackexchange.com/questions/11717/why-are-hash-functions-one-way-if-i-know-the-algorithm-why-cant-i-calculate-t/11723#11723Lampe, J. (2014, januari 6). Beyond Password Length and Complexity. Opgeroepen op januari 28, 2015, van INFOSEC Institute: http://resources.infosecinstitute.com/beyond-password-length-complexity/Merkley, R. (2015, januari 23). Over de licenties. Opgeroepen op januari 24, 2015, van Creative Commons: http://creativecommons.org/licenses/Murray, M. C. (2010). Database Security: What Students Need to Know. (A. Scime, Red.) Journal of Information Technology Education, 9, 61-77.PHP Group. (2014, augustus 28). PHP: hash_algos - Manual. Opgeroepen op november 9, 2014, van PHP: Hypertext Preprocessor : http://php.net/manual/en/function.hash-algos.phpToering, W. (2013, augustus 12). PDO: A How To. Opgeroepen op maart 6, 2015, van Codular: http://codular.com/php-pdo-how-toUSACO. (2004). Crafting Winning Solutions. Opgeroepen op februari 2, 2015, van USACO Gateway: http://www.dcc.fc.up.pt/~pribeiro/estagio2008/usaco/1_3_Crafting_Winning_Solutions.htmVeys, W. (2014). Discrete wiskunde. Opgeroepen op januari 2015, 2015, van KU Leuven: https://onderwijsaanbod.kuleuven.be/syllabi/n/G0Q98AN.htm

http://www.larc.usp.br/~pbarreto/WhirlpoolPage.htmlBarreto, Paulo S.L.M. and Rijmen, Vincent (2003). "The WHIRLPOOL Hashing Function" (PDF). Retrieved 2009-08-01.http://eprint.iacr.org/2007/141.pdfhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa382459(v=vs.85).aspxhttp://en.bitcoinwiki.org/Bitcoin_weaknesses