Saugumas, slaptažodžiai ir MD5
Vakar kalbėjau apie išorinius dalykus, nuo kurių priklauso jūsų saugumas. Šiandien norėčiau pakalbėti apie vidinius dalykus, nuo kurių priklauso jūsų saugumas. Tai daugiau techninė tema, bet aš pasistengsiu paaiškinti taip, kad ją galėtų suprasti visi mirtingieji.
Programuotojams, kurie nekoduoja slaptažodžių reikia nukirsti pirštus
Jeigu jūs užsiregistruojate į kokią nors svetainę ir įvedate slaptažodį, su juo gali atsitikti vienas iš trijų dalykų, nuo kurių labai priklauso jūsų saugumas.
Pirmas variantas. Slaptažodis yra užkoduojamas vienkrypčiu algoritmu. Vienkryptis algoritmas reiškia, kad užkodavus slaptažodį, jo niekas nežino ir negali atkoduoti. Toks slaptažodžių saugojimo būdas yra pats saugiausias. Yra daug vienkrypčių algoritmų MD5, SHA-1, SHA-256, SHA-512 ir t.t. Kadangi dažniausiai naudojamas MD5, tai vėliau apie jį pakalbėsim plačiau.
Antras variantas. Slaptažodis yra užkoduojamas dvikrypčiu algoritmu. Dvikryptis algoritmas reiškia, kad jūsų slaptažodis yra saugomas užkoduotas, bet jį galima atkoduoti ir sužinoti jūsų slaptažodį, tačiau norint atkoduoti reikia žinoti specialų atkodavimo raktą. Yra daugybė dvikrypčių algoritmų RSA, DES, Blowfish ir t.t Bėda, ta kad nežinau nei vienos lietuviškos svetainės, kuri naudoti mokslinį algoritmą. Jeigu naudojamas dvikryptis algoritmas, tai dažniausiai jis būna „rankų darbo“. Aš savo draugo „rankų darbo“ algoritmą nulaužiau per 15 minučių. Kitaip sakant visi „rankų darbo“ dvikrypčiai algoritmai yra lengvai nulaužiami. Ką tai reiškia jums? Jeigu hakeriai nulauš kokią nors svetainę tokiu atveju jūsų slaptažodis bus gana greitai sužinotas.
Trečiasis variantas. Pats žiauriausias variantas, kai slaptažodis yra saugomas nekoduotas. Tokiu atveju slaptažodį gali matyti visi programuotojai dirbantys prie projekto, visi administratoriai, sekretorės ir jų kačiukai. Žodžiu, bet kas, kas tik gali prieiti prie puslapio, jau nekalbant apie hakerius. Tokiu atveju slaptažodis 1234 yra saugesnis už Lietuvos himno pirmą stulpelį parašytą iš kitos pusės vietoj tarpų įterpiant pirminius skaičius.
Žinau ne vieną didelę lietuvišką svetainę, kurioje slaptažodžiai buvo saugomi antru arba trečiu būdu. Kai neturėdavau ką veikti, eidavau ieškoti savo pažįstamų: priešų bei draugų ir skaitydavau jų slaptažodžius. Po to bandydavau pasitikrinti jų paštą ir kitus dalykus. Žmonės (įskaitant ir mane patį) per daug dažnai visoms svetainėms naudoja tą patį slaptažodį.
Kaip žinoti geri ar blogi programuotojai kūrė svetainę? Labai paprastai, paspaudžiate „pamiršau slaptažodį“, jeigu svetainė gali jums atsiųsti jūsų tikrą slaptažodį tuomet belieka melstis. Jeigu slaptažodis yra užkoduotas vienkrypčiu algoritmu svetainė negali priminti jūsų slaptažodžio ir vietoj jo jums atsiųs kitą. Tai nėra 100% patikimas metodas, bet daugiau ar mažiau viskas veikia būtent taip.
Yra ir dar vienas būdas kaip patikrinti ar slaptažodis saugomas užkoduotas. Kaip slaptažodį pasirenkate frazę adminas_gaidys. Čia turiu padaryti pastabą: aš esu džentelmenas, todėl viešai skelbti keiksmažodžių neleidžia mano moralinės normos. Savo ruoštu jūs galvodami tokį slaptažodį galite naudoti angliškus arba rusiškus žodžius nurodančius kryptį arba tam tikrus veiksmus, kurie galimai susiję (bet nebūtinai) su jūsų arba kito asmens galimu troškimu patirti malonumą arba/ir pratęsti giminę. O vietoj žodžio adminas patartina naudoti svetainę prižiūrinčio asmens vardą. Tai yra mano nuoširdus patarimas iš patirties. Kartą aš vienoje svetainėje susigalvojau būtent tokį slaptažodį, po dviejų valandų gavau piktą laišką pranešantį, jog mano profilis buvo užblokuotas.
Pirma dalis. MD5 nėra saugus algoritmas
Pirmiausiai išsiaiškinkime kaip veikia sistema. Jūs įvedate savo slaptažodį, pavyzdžio atveju tarkime, kad tas slaptažodis yra 123456, slaptažodis MD5 algoritmo dėka yra paverčiamas į kodą e10adc3949ba59abbe56e057f20f883e, kuris saugojamas duomenų bazėje. Kiekvieną kartą, kai prisijungiate prie sistemos, jūsų slaptažodis yra paverčiamas į kodą ir palyginamas su kodu esančių duomenų bazėje, jeigu sutampa leidžia prisijungti, jeigu nesutampa neleidžia.
Kai hakeriai nulaužia puslapį vietoj slaptažodžių, jie mato tokius kodus ir iš tiesų nežino jūsų tikrų slaptažodžių. Kad sužinotų juos jie naudojasi „žodyno“ pagalbą. Žodyną sudaro dažniausiai naudojami slaptažodžiai bei juos atitinkantys kodai. Sunku pasakyti tikslų populiariausių slaptažodžių šimtuką, kadangi jis keičiasi priklausomai nuo metų ir tikslinės grupės, bet neabejotinai jame tikrai patenka tokie: 123456, password, qwerty, 696969, abc123, fuck, 111111, 123123, asdfgh.
Ką aš noriu pasakyti, jog jeigu pats vartotojas naudoja lengvą slaptažodį, tai programuotojas negali jo apsaugoti. Ir vis tik programuotojo tikslas yra padaryti viską ką gali, kad apsaugotų vartotoją.
Duona ir druska
Kaip jau supratote naudojant lengvą slaptažodį jūsų popieriai gana prasti. Tiesa, jeigu jūsų slaptažodis yra bebriukas irgi nereiktų labai džiaugtis, kadangi standartiniai žodžiai neabejotinai yra žodyne.
Programuotojams, kurie stengiasi maksimaliai apsaugoti savo vartotojus, vienas patarimas saugumui pagerinti vadinasi naudok druską. Kaip tai vyksta? Jūs įvedate savo slaptažodį 123456 ir sistema automatiškai prideda druska (čia tik pavyzdys, gali būti bet koks žodis), tuomet gaunasi druska123456, kurį užkoduoja MD5 algoritmas ir gauna 73820c487b790d0424a8917a0e760658 kodą. Kodas visai nepanašus į pirmąjį. Ir hakeriai nulaužę sistema iš pradžių gali nesuprasti kas atsitiko, tačiau tuomet gali sugalvoti patikrinti koks populiariausias kodas ir net nežinodami „druskos“ padaryti spėjimą, jog tai greičiausiai yra 123456. Spėjimų nebūtina daryti iš Palubinsko, tam yra speciali metodologija vadinama Rainbow table jinai naudoja daug resursų, bet gali surasti tikslų atsakymą protingo laiko ribose. Aišku, jeigu jūsų slaptažodis yra bebriukas, šiuo atveju jūs esate sąlyginai saugus, kadangi, nemanau, jog kas nors gaištų daug laiko spėliodamas vieno konkretaus žmogus retai naudojamą slaptažodį.
Antra dalis. MD5 nėra saugus algoritmas
Paimkime supaprastintą hipotetinį pavyzdį. Tarkim, kad duomenų bazėje saugoma tik du pirmi slaptažodžio simboliai. Tarkim, kad mano slaptažodis yra Petriukas, tokiu atveju bus saugoma Pe. Tarkim, kad jūsų slaptažodis yra Per upelį šokinėti, taigi bus taip pat saugoma Pe. Kas iš to? Aš nežinodamas jūsų slaptažodžio galėčiau prisijungti prie jūsų sistemos naudodamas jūsų prisijungimo vardą ir savo slaptažodį.
Realybė daug kartus sudėtingesnė, tačiau panaši bėda kamuoja ir MD5 algoritmą. Ta prasme, kadangi MD5 sugeneruoja tik 32 simbolių kodą, vadinasi tam tikri du žodžiai turėtų duoti tą pačią reikšmę. Aš žodžių duodančių tą patį kodą nežinau, nes tikimybė surasti tokius žodžius lygi 2 pakelta 116,9 laipsniu. Ar tokio saugumo jums užteks?
Praėjusią savaitę twitter kilo ginčas ar labai nesaugūs tie MD5 slaptažodžiai yra. Kaip įrodymą, kad jie nesaugūs pasiūliau atspėti mano sugeneruotą kodą, kadangi atsakymo nesulaukiau pakartosiu siūlymą.
Pirmas. 6b7e585e0f253a35d6ac997e65091c4c – tai keturių simbolių anglų kalbos žodis. Darželio lygio, manau atspėsit lengvai.
Antras. 7bac0632d5def59dde87bef63ca9b175 – norėčiau duoti tą patį kodą, kokį įdėjau ir į twitter, bet kadangi neatsimenu, pabandžiau sugeneruoti panašų. Tai devynių raidžių lietuviškas žodis.
Abiem atvejais jokių specialių simbolių ar skaičių nenaudoju, tik raidės, tam kad būtų lengviau spėlioti. Esminis klausimas, kiek laiko jums užtruks atspėti? Tikiuosi turite labai gerą žodyną.
Ar jūsų slaptažodis saugus?
Vakar sakiau: bet kur užrašytas slaptažodis yra nesaugus. Šiandien noriu praplėsti šio sakinio supratimą. Slaptažodis, kurį naudojate nors vienoje svetainėje jau yra užrašytas tos svetainės duomenų bazėje, taigi jis yra jau nebesaugus, todėl kitoje svetainėje pasirinkite kitą slaptažodį. Ir jeigu geri programuotojai padarė, viską ką gali dėl jūsų saugumo, tuomet jis priklauso tik nuo jūsų pačių. (Priešingu atveju skaitykite pirmą paryškintą sakinį.)