Tietovuodoista ja salasanojen murtamisesta

19.11.11 21:23 | ohjelmointi | Ei kommentteja

Herään vähän jälkijunassa näihin tietovuotoihin, joita on ollut lukuisia muutaman viime viikon aikana. Kiinnostuin etenkin siitä eräästä noin 500 000 sähköpostin listasta, jonka sisältämiin sähköposteihin kerrottiin olevan olemassa myös salasanat. Osa niistä jopa julkaistiin, tosin kukaan ei tiedä, olivatko ne aitoja vai eivät ja mistä palvelusta tiedot oli hankittu. Suurella todennäköisyydellä ne eivät olleet itse sähköpostien salasanoja, mutta sähköpostitilit kuitenkin olivat ja ovat edelleen vaarassa, koska ihmiset tuppaavat käyttämään samoja salasanoja ympäri nettiä.

Ajattelin hiukan selventää sitä, kuinka kirjautuminen erilaisiin palveluihin tapahtuu ja miten salasana sekä käyttäjänimiyhdistelmä todellisuudessa toimivat palvelun kulissien takana. Tämä kirjoitus on ohjelmointialueella, koska koodasin Pythonilla MD5 crackerin, jonka toimintaa tämä kirjoitus tulee selventämään huomattavasti.

Kuinka salasanat toimivat?

Kun käyttäjä rekisteröityy johonkin palveluun, on rekisteröitymisvaiheessa annettava jokin salasana, jota tulevaisuudessa käytetään käyttäjänimen kera käyttäjän tunnistamiseen. Kun käyttäjä lähettää rekisteröintilomakkeen, salasana säilötään usein tietokantaan käyttäjänimen kera. Tärkeää on kuitenkin ymmärtää, että salasanaa ei koskaan tallenneta tietokantaan selväkielisenä tekstinä.

Mitä sille sitten tehdään? Salasanasta muodostetaan usein niin kutsuttu MD5-tiiviste, joka on 32 merkkinen sekamelska erilaisia merkkejä. MD5-algoritmi kuuluu kryptografisiin tiivistealgoritmeihin, joiden tehtävä on tuottaa tiettyä merkkisarjaa vastaava tiiviste, josta ei pysty päättelemään mitenkään, mikä alkuperäinen sana on ollut. Muita vastaavia algoritmeja ovat muun muassa SHA-1 ja SHA-2, jotka ovat uudempia kuin MD5, josta on löydetty jo puutteita.

On myös havaittu, että jotkut järjestelmät ovat säilyttäneet salasanoja selväkielisenä tekstinä tietokannassa. Kannattaa siis miettiä, mihin tietonsa syöttää.

Murtaminen

Koska alkuperäisen sanan murtaminen tiivisteestä raa’alla voimalla on melkoisen hankalaa, käytetään salasanojen murtamiseen usein sanakirjahyökkäyksiä (dictionary attack) tai rainbow tableja. MD5:n suosion vuoksi netti on täynnä tietokantoja, joissa on lukematon määrä valmiiksi laskettuja tiivisteitä erilaisista kirjain- ja sanayhdistelmistä.

Kun tietomurto tapahtuu, murtautujalla on käsissään lista käyttäjänimiä ja lista MD5-tiivisteitä. Näin ollen MD5-tiivisteet täytyy murtaa, jotta itse murtautumisesta olisi jotain hyötyä. Tiivisteiden murtaminen on suhteellisen helppoa ja nopeaa nykymenetelmillä, josta todisteena on muun muassa BozoCrack sekä sen pohjalta koodaamani, hiukan jatkokehitetty PyCrack.

Käytännössä ohjelmat googlettavat MD5-tiivistettä, ja toivovat, että ensimmäisellä tulossivulla esiintyvistä sanoista joku täsmää MD5-tiivisteen kanssa, kun kyseessä oleva sana tiivistetään ja sitä verrataan hakusanana toimineeseen tiivisteeseen.

Ongelmana on se, että nuo ohjelmat toimivat hyvin; paremmin kuin niiden olisi koskaan pitänyt toimia.

Suojautuminen

Kirjautumisjärjestelmiä koodaavat tuntevat ongelman, ja siksi salasanoja tiivistettäessä käytetään niin sanottua suolausta. Salasanojen perään lisätään jokin salainen merkkijono, ja vasta niiden yhdistelmä tiivistetään. Suolaus tekee yllä olevien kaltaiset ohjelmat melko turhiksi, mutta myös suolattu tiiviste voidaan murtaa. Siitä en kuitenkaan kirjoita, koska murtaminen muuttuu jo melko hankalaksi. Itse käyttäjähän ei voi sille mitään, jos järjestelmä on huonosti tehty. Tällöin on vain syytä pitää huoli siitä, että salasana on mahdollisimman pitkä, koska se estää jo todella tehokkaasti sen murtamisen.

PyCrack

Tällä hetkellä minun ja incidencen koodaama PyCrack käyttää murtamiseen ensin Googlea, jonka jälkeen se kokeilee muutamaa tietokantaa, jos Googlesta ei löydy tiivistettä vastaavaa sanaa. Ohjelma todella toimii, olkoot siitä todisteena tämä kuva (suoritusaika noin 2 sekuntia):

pycrack


Kommentti
WWW-osoitteet muutetaan linkeiksi automaattisesti. Toimivat tagit: [b][/b], [i][/i] ja [quote=kirjoittajan_nimi] lainaus [/quote]

Paluuviitteet ja kommentit

Ei paluuviitteitä.
Ei kommentteja.