torstai 10. elokuuta 2017

Salasanaohjeet uudistuvat eikä correct horse battery staple ole kovin turvallinen

Salasanojen riesa on ärsyttävä ja sitä pahentavat organisaatioiden vanhentuneet ohjeet. "Salasanat heti vaihtoon", "minimipituus vähintään 15 merkkiä", "pakko vaihtaa 90 päivän välein" ja niin edelleen.

Onneksi viime aikoina myös ohjeiden laatijat ovat havahtuneet asiaan ja uudistaneet neuvojaan. Toimittajat ovat seuranneet perässä ja väittävät, että kaikki mitä luulit tietäväsi on väärin ja että neuvojen laatija "katuu" ohjeitaan.

Salasanojen tekniikka (sana, joka on vain omassa tiedossa) sekä ohjeet (ei saa kirjoittaa paperille, vaihdettava säännöllisesti) ovat aikansa lapsia. Laatijan ei tarvitse katua, vaan päivittää ohjeet vuosikymmenten aikana tapahtuneita muutoksia vastaavaksi. Esimerkiksi salasanojen pakollisesta vaihtamisesta 2-3 kuukauden välein on yleensä enemmän haittaa kuin hyötyä.

Ainoa tehokas tapa parantaa salasanojen turvallisuutta on siirtyä kaksivaiheeseen (2FA) todennukseen, jossa salasanan lisäksi käytetään puhelimeen lähetettävää koodia. Mutta jos tekniikkaa ei ole tarjolla, on tyydyttävä vanhojen salasanojen paranteluun.

Yleinen kikka on laittaa peräkkäin useita englannin kielen sanoja. Klassinen ohje aiheesta on sarjakuvamuotoon tehty Correct horse battery staple, jossa neljän sanan yhdistelmästä saadaan huomattavasti vahvempi salasana kuin 11 merkin mittaisesta Tr0ub4dor&3. Ohje on niin tunnettu, että linkitetty uutinen sisältää sarjakuvan sellaisenaan.

Valitettavasti ohje on huono. Neljä peräkkäistä sanaa tuottaa nopeasti pitkän salasanan, mutta monissa palveluissa salasanan pituutta joko rajoitetaan tai siihen vaaditaan erikoismerkkejä tms, jotka estävät ohjeen soveltamisen sellaisenaan.

Miten vahva neljän sanan salalause todellisuudessa on? Vahvuutta mitataan entropialla, joka on 2-kantainen logaritmi kaikkien vaihtoehtojen määrästä. Jos vaihtoehtoja on 1024, entropia on 10 bittiä (koska 2^10 = 1024) eli todella vähän. Miljoonalla eri vaihtoehdolla päästään jo 20 bittiin ja niin edelleen.

Jos salasanassa käytetään isoja ja pieniä kirjaimia (a-z), numeroita 0-9 sekä viittä yleisintä erikoismerkkiä, 11 merkin salasanan entropiaksi saadaan 66,7 bittiä eli salasana on varsin vahva. Sarjakuvassa entropiaksi on laskettu vain 28 bittiä, mikä tekisi murtamisen todella helpoksi. Kuten sanottua, tähän sarjakuvaan ei kannata luottaa.

Sanat correct horse battery staple sisältävät 28 merkkiä (kirjaimia a-z ja 3 välilyöntiä) joten laskennallinen entropia on 136 bittiä. Ero on valtava, sillä entropiassa yksi uusi bitti aina kaksinkertaistaa tarvittavan brute-forcen määrän.

Mutta jos tekniikka yleistyy, hakkerit alkavat kokeilla sanoja yksittäisten merkkien sijaan. Silloin entropia kutistuu huomattavasti. Montako neljän sanan yhdistelmää voimme muodostaa? Oletetaan, että yleisiä sanoja on 5000 kappaletta, jolloin ne voidaan yhdistää 5000x5000x5000x5000 tavalla. Tämän entropia on enää 49 bittiä -- siis huomattavasti vähemmän kuin perinteisessä Tr0ub4dor&3-sanassa.

Sarjakuvaesimerkin sanoista kolme (correct, horse, battery) on erittäin yleisiä. Sivulta http://www.wordfrequency.info/free.asp löytyy lista 5000 englannin kielen yleisimmästä sanasta. Sen mukaan sijoitukset ovat 1808 (correct), 1286 (horse) ja 3221 (battery). Valitettavasti staple-sanaa ei ole ilmaisella listalla. Maksua vastaan saa ladata laajempia listoja. Jos joku selvittää staple-sanan yleisyyden, olisi kiinnostavaa tietää.

Oletetaan, että staple on listan 5001. sana. Silloin hyökkääjän on kokeiltava vain 1808x1286x3221x5001 yhdistelmää, mikä vastaa entropiassa 45,1 bittiä -- ja se on huomattavasti vähemmän kuin 11 merkin satunnaisessa salasanassa (tarkkaan ottaen Tr0ub4dor&3 ei ole likikään satunnainen, joten sen todellinen entropia on pienempi).

Sanojen yhdistämisen idea on sinällään hyvä, täytyy vain ymmärtää, mistä ohjeessa (ja entropiassa) on kyse. Sanojen on oltava aidosti satunnaisia eivätkä helposti muistettavat lauseet ("päästä minut pankkiin") ole sitä (ainakaan entropian näkökulmasta). Ohje poimia sanat satunnaisesti kirjasta on hyvä, mutta silloin niiden muistaminen voi käydä vaikeaksi eivätkä kaikki palvelut hyväksy ä- ja ö-kirjaimia. Suomen kielen sijamuodot lisäävät hienosti entropiaa, mutta vaikeuttavat kieliopillisesti virheellisen lauseen muistamista. Siksi ohjetta kannattaa vahvistaa esimerkiksi numerolla ja väliviivoilla.

Summa summarum: salasanan pituudella on väliä, mutta se ei ole kaikki kaikessa. Varmaa on vain se, että kaikki salasanaohjeet ovat yleistyksiä ja siten huonoja - tämäkin.

15 kommenttia:

Anonyymi kirjoitti...

Petteri,

Blogin pääviesti on todellakin ihan aiheellinen, mutta pitkäaikaisena Randall Munroe -fanina ihmetyttää sarjakuvassa esiintyneiden entropia-estimaattien kommentointi. "Tr0ub4dor&3" ei todellakaan ole sarjakuvassa esimerkki satunnaisesta 11-merkkisestä salasanasta, vaan yhdestä perussanasta parilla muutoksella tehdystä johdannaisesta. Ensimmäisessä ruudussa olevat pikkuneliöt arvioivat perussanaan sekä k.o. muutoksiin liittyvän entropian määrän, eivätkä arviot näytä kovinkaan kummallisilta. Lisäksi sarjakuvassa arvioitu neljän sanan vaihtoehdon entriopiamäärä näyttää myös järkevältä (sekä erittäin lähellä mitä itse arvioit).

Tämä siis mitenkään väheksymättä kirjoituksen perusargumenttia. On vain todella helppoa yliarvioida esim. mainitun 11 merkin salasanan entropia, unohtaen että normikäyttäjälle $K1&lvZ?!B! tuskin on yhtä todennäköinen vaihtoehto kuin esim. Halonen!943 (sillä mainitsemasi tapa arvioida satunnaismerkkijonojen entropiaa pätee vain mikäli kaikki vaihtoehdot ovat yhtä todennäköisiä).

Jari kirjoitti...

Salausavaimet ovat pituudeltaan jo kilobittejä. Olisi hienoa, jos sellaisen avaimen voisi luoda salalauseella, eikä tarvitsisi säilyttää sitä levyllä. Ihan päivittäin ei salalausetta tietysti kannata kirjoittaa...

Anonyymi kirjoitti...

Minä keksin epäsiveellisen, raaistavan ja maamme suhteita ulkovaltoihin vahingoittavan lauseen. Sitten otan siitä alkukirjaimet, erisnimet isolla, ja muutan jotkin sanat numeroiksi: nainti=90
ottaa suihin=87, seksi=6 jne. Helppo muistaa ja vaikea arvata.

Petteri Järvinen kirjoitti...

Tr0ub4dor&3" ei todellakaan ole sarjakuvassa esimerkki satunnaisesta 11-merkkisestä salasanasta, vaan yhdestä perussanasta parilla muutoksella tehdystä johdannaisesta

Totta, kuten suluissa itsekin totean, esimerkkisana ei ole satunnainen. Ja koska se ei ole satunnainen, sitä ei ole vaikea muistaa (toisin kuin täysin satunnainen olisi). Selvensin tekstiä tältä osin.

Sarjakuvassa on käytetty nopeutta 1000 arvausta sekunnissa, mikä on nykyoloissa pahasti alakanttiin. Miljoonakertaisella nopeudella myös esimerkin ajat putoavat miljoonasosaan, jolloin helppo Tr0ub4dor&3 murtuu alle sekunnissa ja "correct horse battery staple" viidessä tunnissa.

Anonyymi kirjoitti...

Miljardi arvausta sekunnissa ei kuitenkaan taida onnistua ihan halvalla jos salasanat talletetaan turvallisella tiivistysfunktiolla (pbkdf2, bcrypt, scrypt, ym).

https://crackstation.net/hashing-security.htm

Petteri Järvinen kirjoitti...

Ei. Ylipäätään näissä salasanan vahvuuspohdinnoissa ohitetaan aina sama peruskysymys: miten päästään murtamaan salasanoja vapaasti? Login-ikkunan kautta ei onnistu, kirjautumisyritykset kestävät aikansa ja monessa palvelussa tili menee lukkoon jo muutamasta väärästä yrityksestä.

Salasanan vahvuudella on siis merkitystä vain, jos hyökkääjä saa haltuunsa käyttäjätietokannan, kaapattua verkosta kirjautumistiivisteen tai erikoistapauksissa (kuten wlan-verkon tai salasasuojatun tiedoston murto).

Sami Lehtinen kirjoitti...

Olen jo pitkään käsitellyt salasanoja ihan kuten API key avaimia. Salasanahan on vain jaettu joukko bittejä, jolla käyttäjä tunnistetaan. Salasanoja on helppoa keksiä: QJSZkF6jAFNStYWD3EPA tai 0aaba894-37a0-49e7-a4cc-1e0d1961b96b.

Jos haluaa, voi käyttää myös esim 20 unicode merkin settiä, silloin bittejä onkin mo melkoisesti. Aina mumistaan jotain salasanavuodoista ja kaikesta muusta epäolennaisesta. Salasanat ovat tietysti palvelu kohtaisia. Joten on aivan sama jos yhden palvelun salasana vuotaa sieltä. Ei sillä mihinkään muualle pääse. Tämän lisäksi kaikissa olennaisissa palveluissa tietenkin käytetään 2FA:ta. Kuten sanottu, entropia ratkaisee ja sen lisäksi vielä aika limitetty token, niin hyvin menee.

Toisaalta, sisään avainjärjestlemiin ei kuitenkaan saa koskaan kirjautua epäluotettavasta ympäristöstä tai epäluotettavan yhteyden yli. Mutta siihen taas on omat tekniikkansa. - Niin vanha aihe, josta aina vaan tuntuu riittävän jauhettavaa.

Anonyymi kirjoitti...

Pari ajatusta aiheesta:
Niissä tapauksissa joissa hakkerit ovat onnistuneet kopioimaan itselleen koko salasanatietokannan ja salasanat on säilötty selkokielisinä (oliko älypää-tapaus tällainen, muistaako joku?) nähdään selkeästi minkälaisia salasanoja on käytössä. Salasanojen murto-ohjelmien kehittäjät huomioivat tämän omassa tuotekehityksessään. Eräs avoimen lähdekoodin salasanatiivisteiden murto-ohjelma tukee ns. "mangling rules"-toimintoa jossa ohjelma tekee valitulle sanalle määrätyt muutokset, esim kirjainten vaihtoa numeroiksi jere -> j3r3, erikoismerkki perään jere -> jere!. Tämän vuoksi Tr0ub4dor&3 -tyyppisten salasanojen murtamisen suhteellinen vaikeus on helpottunut, vaikka yksinkertainen sanakirjahyökkäys ei edelleenkään riitä (ellei sitten Tr0ub4dor&3 ole sisällytetty netistä saataviin valmiisiin listoihin):

Salasanan paperille kirjoittaminenhan on vaarallista vain jos paperilapun säilytyspaikka ei ole turvallinen. Kuinka sitten varmistaa säilytyspaikan turvallisuuden ja minkätyyppisiltä uhkakuvilta haluaa suojautua on oma lukunsa. Käytännössä esim. työpaikalla henkilökohtaisen tietokoneen salasanan kirjoittaimen post-it lapulle jota pitää monitorin alla on liian riskialtista useimpiin ympäristöihin, mutta sama lappu omassa lompakossa ilman mitään tietoa mihin ko. salasana käy voi olla ok. Lapulla olevan salasanan voi myös kirjoittaa väärin kohdista jotka vain itse tietää, tällöin muistettavaa on vähemmän ja salasanan voi uusia jos lappu menee hukkaan.

Anonyymi kirjoitti...

"Yleinen kikka on laittaa peräkkäin useita englanninkielen sanoja."

Peräkkäin vaan ei yhteen. ;-)

'Englannin kielen sanoja' vs. 'englanninkielinen'.

'Suomen kieli' vs. 'suomenkielinen'.

Petteri Järvinen kirjoitti...

Hyvä että muutkin ovat typonipoja. Korjattu.

Unknown kirjoitti...

Salasanaohjeiden ja käytäntöjen yleinen ongelma on se, ettei kunnolla ymmärretä kuinka ne toimivat. Yleinen virhe on luoda salasanoja jotka ovat vaikeita ihmisen muistaa, mutta helposti murrettavissa raa’alla laskentateholla. Tällaisia ovat kaikki lyhyet merkkiset tyyliin: 1M1d10t#

Salasanan pituuden lisääminen ja samalla sen yksinkertaistaminen sanoiksi on loistava kikka jos sen tekee oikein. Salasanoja murretaan siten, että arvataan eri vaihtoehtoja salasanan tiivistefunktiota(hash) vastaan joko raa’alla laskentateholla, erilasia salasanalistoja hyväksi käyttäen, sekä näiden yhdistelmiä.

Otetaan esimerkkinä salasana: Sir Robin op Camelot

Salasanassa on 20 merkkiä, joten sen murtaminen raa’alla teholla ei onnistu nyt eikä lähitulevaisuudessa. Lause Sir Robin of Camelot löytyy Monty Pythonista, joten se saattaa joltain salasanakirjastosta löytyäkin, mutta jos mukana on tahallinen kirjoitusvirhe, ei salasanakirjastoista ole mitään hyötyä.

Salasana Sir Robin op Camelot sisältää suuria ja pieniä kirjaimia, sekä erikoismerkkejä(välilyönnit). Se on tietokoneelle yhtä hankala kuin esim. Hgt&gvnmqpEFmf#fff%% mutta ihmiselle helpompi muistaa.

Petteri Järvinen kirjoitti...

"Sir Robin op Camelot" on murtamaton niin pitkään kuin bruteforce koskee pelkkiä merkkejä. Jos hakkeri testaa kokonaisia sanoja, lause ei olekaan enää turvallinen. Kaksi ensimmäistä sanaa ovat hyvin yleisiä, op voisi löytyä suomalaisesta sanakirjasta (pankin lyhenne).

Paras tae turvallisuudesta on se, että tekee eri tavalla kuin hyökkääjä. Juuri siksi kaikki yleistykset ovat vaarallisia.

SB kirjoitti...

Salasanalauseet on parhaimpia. Ne on helppo muistaa ja niitä voi varioida vaikka lisäämällä alkuun kohdepalvelun kaksi alkukirjainta. Salasanamurtajilla ei ole kuitenkaan kaikkien eri maiden sanakirjoja ja sanastoja käytössään joten suomenkielinen salasanalause on turvallinen.

Gmailin salasana: GMNordeaPankinOsavuosikatsaus

Anonyymi kirjoitti...

"Oletetaan, että staple on listan 5001. sana. Silloin hyökkääjän on kokeiltava vain 1808x1286x3221x5001 yhdistelmää.."

Eihän tuo nyt noin mene. Analogia: numerolukon koodin 123 murtamiseen tarvitsee kokeilla 1x2x3 yhdistelmää.

Lähempänä oikeaa olisi 1808*a^3 + 1286*a^2 + 3221*a^1 + 5001, jossa a on käytetyn frekvenssisanakirjan pituus. Ja jos käytettyä sanaa ei löydy sanakirjasta ei murtaminenkaan onnistu.

Petteri Järvinen kirjoitti...

Vähän ylempänä oli maininta, että 5000 yleisen sanan lauseet tuottavat 49 bitin edestä entropiaa. Koska emme tiedä, kuinka yleinen staple on (ei kuitenkaan 5000 joukossa), esimerkkilaskelma on minimitapaus.