Andmete kaitsmine krüpteerimise abil
Mõningaid andmeid on vaja kaitsta, et need ei muutuks avalikuks. Niisuguste andmete hulka kuuluvad ärisaladused, meditsiiniline info, riigisaladused, privaatne info, jne.
Andmete kaitsmine peaks tagama selle, et kolmandad osapooled ei saa kaitstavaid andmeid kopeerida ega lugeda. Selle eesmärgi saavutamiseks saab kasutada erinevaid võtteid, näiteks saab dokumente ja lepinguid hoida seifis. Samamoodi saab kaitsta ka digitaalseid andmeid kui vastavat andmekandjat koos andmetega seifis hoida. Juhul kui tegu on piisavalt kaitstud seifiga, siis ei pea andmete lekkimise pärast muretsema, aga probleem tekib juhul kui digitaalseid andmeid on vaja lugeda või transportida. Tekib küsimus, et kuidas saab turvaliselt töödelda ja transportida digitaalseid andmeid.
Kindlat vastus eelnenud küsimusele ei ole võimalik leida, sest antud küsimus on liiga üldine. Andmete turvamiseks peab teadma vastavat konfidentsiaalsuse taset, teadma seda, kes on andmete omanik ja arvestama kindlat tüüpi vastasega. On suur vahe, kas andmeid on vaja kaitsta konkurentide eest või suurriikide eest. Viimasel juhul on tavainimesel andmetega töötamiseks turvalise keskkonna loomine peaaegu võimatu. Üks lahendus, mis võiks aidata niisuguse vastase vastu on õhkeraldusega arvutite kasutamine (need on arvutid, mis ei ole võrku ühendatud), aga see kaitse toimiks ainult õige kasutusviisi korral. Näiteks on võimalik pahavaralise USB pulga abil õhkeraldatud arvuti nakatada ning seejärel võib arvutikasutaja andmete transpordi käigus tahtmatult õhkeraldusega arvutis olevaid andmeid lekitada.
Eelmine näide on veidi ekstreemne ja tavainimesel ei lähe tavaliselt niisugust turvataset vaja ning seetõttu keskendume järgnevalt tavainimesele vajalike turvameetmete kirjeldamisele. Üheks niisuguseks meetmeks on krüpteerimine.
Lisaks on andmete kaitsmisel oluline mõelda sellele, et millises andmete elutsükli etapis me kaitsemeetmeid rakendame. Andmed võivad olla lihtsalt andmekandjale salvestatud ja ootel (data at rest), neid saab liigutada eri seadmete või andmekandjate vahel (data in transit) ning neid saab kasutada või töödelda (data in use). Selles loengus käsitletud sümmeetriline krüpteerimine aitab eelkõige kaitsta ootel olevaid andmeid, aga on kasutatav ka andmete transportimisel kui krüpteerimisvõti õnnestub mingi teise kanali kaudu transportida. Sümmeetrilise krüpteerimisalgoritmiga krüpteeritud andmeid üldjuhul töödelda ei saa. Krüpteeritud või muul viisil loetamatuks muudetud andmete töötlemisest räägitakse privaatsuskaitsetehnoloogiate (privacy enhancing technologies, PET) kursusel.
Sümmeetriline krüptograafia
Krüpteerimine (encryption) viib andmed sellisele kujule, et need on võõrastele loetamatud. Krüpteeritud andmeid nimetatakse krüptotekstiks või ka krüptogrammiks (cyphertext). Õige võtme abil saab krüptogrammist taastada algsed andmed (plaintext), seda protsessi nimetatakse lahti krüpteerimiseks või ka dekrüpteerimiseks (decryption).
võti võti | | v v andmed --[krüpteerimine]--> krüptogramm --[dekrüpteerimine]--> andmed
Andmete kaitsmiseks krüpteerimise abil on vaja sobivat krüptosüsteemi. Krüptosüsteem koosneb võtme genereerimise algoritmist, andmete kaitsmiseks mõeldud krüpteerimisalgoritmist ja andmete taastamiseks mõeldud dekrüpteerimisalgoritmist.
Krüpteerimiseks kasutatav võti on analoogne tavalise võtmega - võtit tuleb valvata, et sellest koopiat ei tehtaks ja võtit tuleb kaitsta kadumise eest, et võõrad võtit kasutada ei saaks. Lisaks sellele tuleb võtit enda jaoks säilitada, et tagada juurdepääs võtmega suletud esemetele. Oluline on märkida, et krüpteeritud andmetele on võimalik juurde pääseda ainult vastavat võtit kasutades. Kui andmeid krüpteeritakse ja dekrüpteeritakse sama võtmega, siis on tegemist sümmeetrilise krüptogaafiaga.
Tavaliselt on krüptograafias võtmeteks pikad juhuslikud bitijadad. On väga oluline, et võtmed oleksid juhuslikud, sest vastasel juhul ei pruugi krüptosüsteem olla piisavalt turvaline. Juhuslike bitijadade kasutamise nõue toob endaga kaasa kaks probleemi. Esimene probleem on seotud sellega, et juhuslikkuse genereerimine ei ole lihtne ja teine probleem on seotud sellega, et inimesed ei ole võimelised meelde jätma sadu ja tuhandeid bitte (bitt on informatsiooni ühik, millel on ainult kaks võimalikku väärtust, kas 0 või 1). Näiteks, püüdke meelde jätta see 128-bitine juhuslik võti, mis on kodeerimise abil viidud lühemale ja inimloetavale kujule (toorel kujul koosneks see võti 128-st nullist ja ühest):
83f38541d9fa2540c8663d9d82a5c97f
Selleks, et pikki krüptovõtmeid ei peaks meelde jätma kasutatakse sageli krüptovõtmete kaitsmiseks paroole. See näeb välja nii, et juhuslikul genereeritud krüptovõti (edaspidi peavõti) krüpteeritakse omakorda lühema võtmega (edaspidi parool), mida on inimesel lihtsam meelde jätta ning krüpteeritud peavõti talletatakse sageli koos krüpteeritud andmetega. Krüpteeritud ketta korral paigutatakse krüpteeritud peavõti ketta päisesse, krüpteeritud faili korral faili päisesse, aga võimalik on hoida krüpteeritud peavõtit ka eraldi failis.
Kuna paroolid ei paku sageli sama palju juhuslikkust nagu krüptovõtmed, siis võib parooli abil kaitstud andmete turvatase oluliselt langeda. Juhul kui on vaja kõrgemat turvataset, siis hoiustatakse esialgne krüptovõti (ilma parooli kasutamata) riistavaralises seadmes, mis on spetsiaalselt loodud võtmete hoiustamiseks. Niisugused seadmed ei võimalda võtme kopeerimist ja autoriseerimata kasutust. Siia kategooriasse sobivad näiteks spetsiifiliselt võtmete hoidmiseks loodud kiipkaardid nagu Eesti ID-kaart, füüsilised turvamoodulid ehk HSM-d, aga ka usaldatava platvormi moodulid ehk Trusted Platform Module (TPM).
Krüpteeritud andmete turvalisus sõltub mitmest erinevast faktorist. Esiteks on oluline krüpteermisalgoritmi valik, sest on olemas palju nõrku ja vananenud krüpteerimisalgoritme. Teiseks peaks krüpteerimiseks kasutatav võti olema täiesti juhuslikult genereeritud, sest muidu vastava algoritmi turvaeeldused ei kehti. Kolmandaks on vaja võtit turvaliselt hoida ning kasutada, et vältida selle sattumist volitamata osapoole kätte. Neljandaks peab krüpteerimistarkvara olema korrektselt kirjutatud, et see ei lekitaks krüpteeritavate andmete või krüpteerimisvõtme kohta infot. Seega on oluline, et vastav tarkvara lähtuks algoritmi kirjeldusest ehk spetsifikatsioonist ning ei sisaldaks vigu. Samas on krüptoalgoritmide implementeerimine keeruline ka siis kui spetsifikatsiooni on täpselt järgitud. Probleemiks on kõrvalkanali ründed, mis võivad lekitada infot näiteks protsessori taktsageduse või töötemperatuuri kaudu. Seega on levinud kirjutamata reegel, mis ütleb, et ise ei ole mõistlik krüptotarkvara luua juhul kui leidub alternatiive. Isegi ekspertidel on raske kirjutada tarkvara, mis oleks kiire, vastaks spetsifikatsioonidele ning ei lekitaks kõrvalkanalite kaudu infot. Viiendaks on vaja usaldada arvutit, milles jookseb krüpteerimise tarkvara, sest see arvuti omab mingil hetkel juurdepääsu dekrüpteeritud andmetele. On ilmne, et krüpteerimine ei taga konfidentsiaalsust olukorras kus arvuti on nakatunud kahjurvaraga, mis võimaldab kas infot lekitada või siis arvutit kontrollida kolmandal osapoolel.
Näited krüpteeringu kasutamisest
- mobiilside
- lukustatud telekanalid
- Skype's rääkimine
- WiFi ruuteri ja arvuti vaheline andmeside (juhul kui tegu pole avatud wifi võrguga)
- andmeside HTTPS protokolli kasutavate veebilehtedega (näiteks Facebooki sisselogimine)
- ID-kaardi abil failide krüpteerimine
- DRM kaitse DVD plaatidel
Krüpteerimisalgoritmid
Krüpteerimisalgoritmi võib nimetada ka šifriks. Idee illustreerimiseks kasutame lihtsat šifrit nimega ROT13. Selle šifri korral nihutatakse igat sõnumis olevat tähte 13 tähe võrra edasi (kasutades tähestikku). See muutub võimalikuks kui tähestiku otsad omavahel siduda, nii, et pärast Z tuleb uuesti A. Seda šifrit illustreerib kõrvalolev joonis.
Nüüd võib tekkida küsimus, et mis oli antud šifri korral võtmeks? Selle selgitamiseks vaatleme abstraktsemat šifrit ROTn, mis nihutab igat tähte täpselt n korda edasi. Sellisel juhul ongi arv n võtmeks. Võtame aluseks ladina tähestiku, mis annab meile 26 erinevat võimalust n valimiseks. Kui n on võrdne nulliga, siis sõnum ei muutu, aga matemaatiliselt on ikkagi tegemist sobiva võtmega. Kuna 26 võimalusest koosnev võtmeruum on väga väike, siis on võimalik niisuguse šifri korral võtit ära arvata kõikvõimalike n väärtuste proovimise teel. Seega ei taga antud šiffer tänapäeval piisavat turvataset. Kusjuures, šiffer ROTn on tuntud ka kui Caesari šiffer.
Sümmeetrilised krüpteerimisalgoritmid jagunevad kaheks: plokkšifrid (block cipher) ja jadašifrid (stream cipher). Jadašifrid krüpteerivad andmeid bitt- või baithaaval (vt. joonis) ja on seega plokkšifritest kiiremad. Seetõttu kasutatakse neid rohkem reaalajarakendustes, näiteks mobiilside krüpteerimiseks. Jadašifrid on näiteks RC4 ja mobiilsides kasutatav A5 perekond. RC4 oli viimase viieteistkümne aasta jooksul küllaltki populaarne, aga tema kasutatavus langes järsult pärast algoritmist leitud nõrkusi. 2015. aastal leiti RC4 algoritmist statistilised nõrkused, mistõttu ei paista krüpteeritud sõnum täiesti juhuslikuna. Nende mustrite olemasolu võib viia krüpteeritud sõnumi osalise lekkimiseni. Seetõttu lõpetasid Google, Mozilla ja Microsoft 2015. ja 2016. aastal RC4 toetamise enda brauserites.
Plokkšifrid krüpteerivad andmeid teatud pikkusega plokkide kaupa (vt. joonis) ja on võrreldes jadašifritega rünnetele paremini vastu pidanud. Plokkšifrid on näiteks Digital Encryption Standard (DES), 3DES, Blowfish ja Advanced Encryption Standard (AES). DES oli päris pikka aega kõige levinum plokkšiffer, kuid tänapäeval ei tohiks seda enam kasutada, sest DES abil krüpteeritud andmeid on võimalik kõikide võtmete läbiproovimise teel lahti murda. Seetõttu asendati DES plokkšifriga AES, mis on tänapäeval standardlahendus olukorras kus on vaja kasutada sümmeetrilist krüpteerimist. AES pool pakutavat krüpteeringut peetakse korrektsel kasutamisel murdmatuks (tarkvara peab olema korrektselt ehitatud, kuid oluline on ka kasutusviis - peamiselt võtme juhuslik genereerimine ja selle korrektne kaitsmine).
Kas leidub perfektse salastusega krüpteerimisalgoritme?
Sellele küsimusele vastamiseks on vaja mõista informatsiooni-teoreetilise turvalisuse tähendust. Informatsiooni-teoreetiline turvalisus tähendab seda, et turvalisus tuleneb otseselt informatsiooniteooriast. Seetõttu ei ole võimalik informatsiooni-teoreetiliselt krüpteeritud andmeid murda isegi siis kui ründajal on juurdepääs piiramatule arvutusresursile. Seega, kui leiduks informatsiooni-teoreetiliselt turvaline krüpteerimisalgoritm, siis oleks võimatu ilma võtit kasutamata selle algoritmiga krüpteeritud andmeid murda. Niisugune krüpteerimisalgoritm leidub, aga see ei leia tänapäeval laialdast kasutust.
Ühekordne šifriplokk (one-time pad)
Ühekordne šifriplokk on informatsiooni-teoreetiliselt turvaline sümmeetriline krüptosüsteem. Selles krüptosüsteemis on krüpteeritavate andmete pikkus võrdne krüpteerimisvõtme pikkusega ja iga krüpteeritavate andmete bit seotakse vastava krüptovõtmes oleva bitiga kasutades moodularitmeetikat. Moodularitmeetikas tehakse arvutused lõplike hulga arvude peal ning tulemused langevad samuti samasse arvuhulka. Heaks analoogiks on seieritega kell kus on samuti piiratud hulk arve, täpsemalt 12. Siiski on võimalik arvutada, et mis kell on näiteks seitsme tunni pärast kui kella osutid näitavad hetkel kella 11 peale (seitsme tunni pärast näitavad seierid, et kell on 6). Moodulaararitmeetika on krüptograafias kesksel kohal ning seda kasutab ka avaliku võtme krüptograafia, mida käsitleme järgmises teemaplokis. Kahjuks ei võimalda infoturbe piiratud maht moodularitmeetikat põhjalikumalt käsitleda ning see jääb huvilistele iseseisvaks uurimiseks.
Kuna bitil saab olla ainult kaks väärtust, null ja üks, siis on loogiline kasutada moodulit kaks selleks, et siduda krüpteeritavate andmete bit krüpteerimisvõtmes oleva vastava bitiga. Sellisel juhul kasutame erinevalt kümnendsüsteemist ainult sümboleid 0 ja 1 ning 1 + 1 = 0. Kuna niisugune tulemus ei pruugi olla intuitiivselt mõistetav, siis soovitame tuletada meelde eelnevalt kirjeldatud kella näidet. Näiteks digitaalsel kellal on tundide arvestuseks kasutusel arvud 0 kuni 23. Keskööl ei kuvata ekraanil mitte 24 vaid uuesti nulli, seega on digitaalse kella puhul kasutusel moodul 24. Näiteks 20 + 7 mod 24 = 3. Siin võib analoogiks tuua jagamisel jäägi leidmise.
Kahe biti omavaheliseks sidumiseks kasutatakse modulaarset liitmist, mida saab mooduli kaks korral esitada XOR operatsiooni abil. Selleks, et krüpteerida andmete bit vastava võtmes oleva bitiga tuleks kasutada nende bittide vahel XOR operatsiooni. Kuna tegu on sümmeetrilise krüptosüsteemiga, siis toimub dekrüpteerimine analoogselt. XOR on sarnane OR operatsioonile, aga erineb selle poolest, et kui mõlemad tehte liikmed on ühed, siis on tulemuseks null. Järgmine nimekiri näitab kuidas XOR operatsioon töötab.
- 1 XOR 1 = 0
- 1 XOR 0 = 1
- 0 XOR 1 = 1
- 0 XOR 0 = 0
Ühekordse šifriploki praktilist kasutamist takistab mitu erinevat probleemi. Esimene probleem on seotud sellega, et krüpteerimisvõti peab olema krüpteeritavate andmetega sama pikkusega. See toob kaasa selle, et kui on vaja krüpteerida gibabaidi suurust faili, siis peab ka võti olema täpselt gigabaidi suurune. See omakorda tähendab seda, et võtme haldamine ja transport muutub keerukaks. Teiseks probleemiks on see, et vastavat krüpteerimisvõtit võib kasutada ainult üks kord ja pärast seda tuleb võti hävitada. Iga uue sõnumi jaoks on vaja genereerida uus võti. Kolmandaks probleemiks on see, et krüpteerimiseks kasutatav võti peab olema juhuslik, kuid täiesti juhuslike bittide genereerimine on keeruline. Juhul kui võti ei ole päris juhuslik, siis pole ühekordse šifriploki kasutamine enam informatsiooni-teoreetiliselt turvaline. Nende probleemide tõttu ei leiagi ühekordne šifriplokk tänapäeval laialdast kasutust.
Kas avatud lähtekoodiga krüpteerimistarkvara on vähem turvaline kui vastav suletud lähtekoodiga tarkvara?
Enamasti ei saa öelda, et lähtekoodi avalikustamine muudaks krüptosüsteemi nõrgemaks. Selline olukord võiks tekkida vaid juhul kui programm on vigaselt kirjutatud või kui kasutatud on mõnda ebastandardset krüpteerimisalgoritmi. Millest tuleneb see, et krüpteerimiseks kasutatavad algoritmid on avalikud? Oleks ju võimalik salastada algoritmid, et ründajal oleks vaja teha rohkem tööd.
Antud lahendus tuleneb Kerckhoffs-i printsiibist, mis ütleb, et krüptosüsteem peaks olema disainitud nii, et see oleks turvaline ka siis kui kõik peale võtme on avalik. Selle printsiibi järgmine muudab krüptosüsteemi kasutamise lihtsamaks ja tagab turvalisuse, sest krüptograafid saavad avalikustatud algoritme rünnata ja alles jäävad vaid tugevad algoritmid. Antud printsiibi järgmise tõttu on peaaegu kõik (välja arvatud mõned sõjaväe poolt kasutust leidvad algoritmid) tänapäeval kasutatavad krüptograafilised algoritmid avalikud. Standardse krüpteerimisalgoritmi implementatsioon võikski soovituslikult olla avatud lähtekoodiga, et krüptograafidel oleks võimalik kontrollida selle korrektsust. Suletud lähtekoodiga tarkvara võib sisaldada programmeerija poolt tehtud vigu ja ka tahtlikult loodud tagauksi.
Viimaste aastate jooksul on uuesti esile kerkinud diskussioon selle üle, et kas riigid peaksid reguleerima tugeva krüptograafia kasutamist ning lisama riiklikke tagauksi. Sarnane diskussioon toimus üheksakümnendatel USA-s ning lõppes riigi allajäämisega. Sellel ajal peeti krüptograafiat sisaldavat tarkvara militaarkaubaks ning riik tahtis vältida tugeva krüptograafia levikut. Seetõttu taheti uutele mobiilseadmetele lisada kiip (Clipper chip), mis võimaldaks riikliku tagaukse kasutamist. Kuna tagaukse disain sisaldas turvaprobleeme ja projektile oli tugev vastuseis, siis jäeti projekt katki.
Seoses terrorismi ja tugeva krüptograafia levikuga on mitmed riigid ja agentuurid uuesti tõstatanud krüptograafia reguleerimise teema. Samas ei ole tänapäeval enam võimalik krüptograafia kasutamist piirata, sest see on keskseks osaks digitaalmajandusest. Samuti ei ole krüpteerimistarkvara keelustamine praktiline, sest kurjategijad saavad kasutada välismaiseid krüpteerimisrakendusi või keelatud krüpteerimisrakendusi. Niisugune keelustamine muudaks tavainimesel enda andmete kaitsmise keerukaks samas kui küberkurjategijad ja spetsialistid saaksid jätakta krüpteerimistarkvara kasutamist. Seda probleemi kirjeldab Bruce Schneieri artikkel A Worldwide Survey of Encryption Products.
Siiski on mitmed riigid huvitatud tagauste seadustamisest, mis võimaldaksid juurdepääsu digitaalsetele suhtluskanalitele. See omakorda tooks kaasa vajaduse uute krüptoprotokollide või algoritmide loomiseks ning need peaksid olema loodud nii, et ainult volitatud osapool saaks tagaust kasutada. Selle probleemi keerukusest pole kahjuks paljud poliitikud aru saanud. Näiteks kui USA loob tagauksega süsteemi, siis nad ilmselt ei ole huvitatud, et Hiina saaks seda tagaust kasutada. Samas kui avalikult luuakse tagauksega teenused, siis tahavad neid tagauksi kasutama hakata ka ebademokraatlikud riigid kus puudub sõnavabadus. Selleks, et nendele probleemidele tähelepanu juhtida koostasid tuntud krüptograafid 2015. aastal ühisraporti: Keys Under Doormats: Mandating insecurity by requiring government access to all data and communications
Samal teemal on koostatud mitmeid teisigi raporteid:
- The Effect of Encryption on Lawful Access to Communications and Data (CSIS, 2017)
- The Risks of “Responsible Encryption” (Stanford, 2018)
- Moving the Encryption Policy Conversation Forward (The Carnegie Endowment for International Peace, 2019)
Krüpteerimine vs kodeerimine
Mõnikord võib lugeda, et krüpteerimine (encryption) aetakse segamini kodeerimisega (encoding), aga tegemist on täiesti erinevate kontseptsioonidega. Kui krüpteerimise eesmärgiks on peita sõnumit kõrvaliste osapoolte eest, siis kodeerimise eesmärgiks on transleerida sõnum teise formaati. Samuti ei ole kodeerimise korral kasutusel võtit ning kodeerimise algoritm (juhend) on avalik.
Igapäevaselt kasutame kümnendsüsteemi kus on kasutusel numbrid 0-9, aga lisaks sellele on arvutites laialt kasutusel kahendsüsteem, kaheksandsüsteem ja kuueteistkümnendsüsteem. Selleks, et arvutid toimida saaksid kodeeritakse kõik andmed arvutite jaoks binaarsüsteemi (binary) kus on kasutusel ainult nullid ja ühed (bitid). Kuna binaarsüsteemis tuleb arve esitada ainult kahe sümboli abil, siis on kümnendsüsteemi arvu esitlus kahendsüsteemis oluliselt pikem.
Tarkvaras on laialt levinud ka kaheksandsüsteem (octal, kasutab numbreid: 0-7); kuueteistkümnendsüsteem (hexadecimal ehk hex, kasutab sümboleid: 0-9, A-F) ja base64, mis kasutab 64 erinevat sümbolit (A-Z, a-z, 0-9, +, /). Hex ja base64 kasutatakse sageli pikkade binaarkujul olevate krüptovõtmete esitamiseks lühikesel ja inimloetaval kujul.
Samad andmed erinevates kodeeringutes:
binary: 001001001101011101101100000001000001100011011111 octal: 1115355401014337 decimal: 40507648776415 hex: 24d76c0418df base64: JNdsBBjf
Kasulikud lingid
- Krüptograafia
- Juhuslikud numberid ja nende genereerimine - väga relevantne, soovitame lugeda / vaadata
- Muu