Fun fact:
Zbog svojeg potencijala u kontekstu špijunaže i vojnih aktivnosti, neke vlade klasificiraju kriptografiju kao oružje, te limitiraju ili zabranjuju korištenje i izvoz kriptografskih sustava.
Budući da učestalost napada na sustave i pojedince nezaustavljivo raste, prosječni korisnik bi trebao biti upoznat s osnovama moderne kriptografije – gdje gledati, na što obratiti pažnju, što izbjegavati, čemu vjerovati?
Što je kriptografija?
Nekada je kriptografija bila sinonim za enkripciju – konverziju informacija iz „normalnog“, čitljivog oblika, u nerazumljivi (kriptirani) niz znakova. Samo su sugovornici znali na koji način se informacija pretvara iz čitljivog u kriptirani oblik i obrnuto, time sprječavajući nepoželjne strane, javnost ili maliciozne entitete odgonetnuti sadržaj tajne komunikacije.
Naravno, ta osnovna funkcionalnost ostala je i danas, ali su se stvari i značajno proširile – područje kriptografije se kontinuirano bavi razvojem i analizom protokola za njene brojne funkcionalnosti.
Moderna kriptografija danas obuhvaća poveći spektar disciplina kao što su matematika, računalne i komunikacijske znanosti, pa čak i elektrotehnika i fizika. Kriptografski sustavi danas koriste računski kompleksne algoritme i velike kriptografske ključeve koji su izuzetno teški za praktične pokušaje direktnih napada.
Čemu nam služi kriptografija? Vrlo konkretno, ona nam omogućuje:
- Povjerljivost
- Integritet
- Autentifikaciju
- Neporecivost
Povjerljivost
Vjerojatno je kod većine ljudi prva asocijacija na riječ kriptografija – tajnost. Povjerljivost kao jedan od ciljeva kriptografije omogućuje upravo tajnost – tajnost podataka u mirovanju, u tranzitu te u korištenju, ali i tajnost komunikacije. Uobičajeno se tajnost omogućuje kriptiranjem poruke na strani pošiljatelja nekom vrstom ključa, pa dekriptiranjem te poruke na strani primatelja.
Integritet
Integritet je svojstvo koje štiti podatke od neautoriziranih izmjena. Mehanizmi integriteta primatelju poruke omogućuju razmjernu sigurnost da je primljena poruka identična poruci koju je pošiljatelj poslao. Integritet bi morao štititi podatke od namjernih, malicioznih izmjena ili brisanja podataka, ali i od nenamjernih neovlaštenih izmjena u procesu prijenosa.
Poruka koju šaljemo trebala bi na odredište stići u onom obliku, sadržaju i obujmu u kakvom je bila i poslana. Ako poruka na odredište stigne na bilo koji način neovlašteno izmijenjena, narušuje joj se integritet. Kriptografija nam nudi konkretne mehanizme kako spriječiti, odnosno otkriti narušeni integritet.
Autentifikacija
Autentifikacija verificira navodni identitet sugovornika. Primjerice, u svakodnevnom korištenju web preglednika, certifikati omogućuju autentifikaciju servera/subjekta po čijim web stranicama surfamo, kako bismo bili razumno sigurni da ne komuniciramo s lažnim subjektima.
Neporecivost
Neporecivost također primatelju poruke omogućuje razumnu sigurnost da je poruka pristigla od očekivanog pošiljatelja, a ne od nekoga tko se lažno predstavlja. S druge strane, neporecivost također sprječava pošiljatelju tvrditi da nikada nije niti poslao poruku – jer postoje dokazi da jest. Ovo svojstvo podržava asimetrična kriptografija.
Kerckhoffsovo načelo
Zanimljivo načelo postavio je nizozemski kriptograf Auguste Kerckhoffs, a ono glasi: „kriptirani sustav treba biti siguran čak i kada je o njemu javno poznato sve osim samoga ključa“. Dakle ne smijemo ovisiti o tajnosti algoritma – jer je pretpostavka da će napadač na neki način uspjeti saznati detalje o algoritmu i njegovu funkcioniranju. Tajnost mora ovisiti isključivo o ključu. Ovo je široko prihvaćeno načelo u svijetu kriptografije, u kontrastu s načelom Security through obscurity (STO), koje navodi da se sigurnost postiže sakrivanjem detalja o dizajnu arhitekture ili implementacije sustava. STO se u pravilu mora izbjegavati.
Simetrična i asimetrična kriptografija
Simetrična kriptografija koristi jedan ključ za kriptiranje i dekriptiranje podataka. Taj ključ je tajan i treba biti poznat samo stranama koje žele u tajnosti komunicirati. Radi toga, ti sugovornici na neki se način prethodno moraju dogovoriti oko zajedničkog ključa.
Kako to izvesti putem nesigurnog kanala kao što je internet? To pitanje predstavlja jedan od značajnih problema simetrične kriptografije. Srećom, istraživači su nam na pladnju servirali rješenja - algoritme koji služe za efikasnu i sigurnu razmjenu (odnosno načine generiranja) tajnih ključeva. Više riječi o takvim algoritmima bit će malo kasnije.
Razmjena ključeva nekad – trčanje preko bojišnice 2. svjetskog rata s komadom papira koji sadrži listu ključeva za Enigmu.
Što se tiče algoritama za simetričnu enkripciju, dobro je znati koji se algoritmi više NE preporučuju jer se smatraju „razbijenima“: DES, 3DES, RC2, RC4. Preporučuje se izbjegavati sustave koji koriste ove algoritme.
Algoritmi za simetričnu enkripciju koji se u ovome trenutku preporučuju su primjerice AES (varijanta Rijndael algoritma koju je podržala vlada SAD-a), te Serpent, TwoFish (nasljednik Blowfisha, oboje autora Brucea Schneiera) i Camellia.
Simetrična kriptografija vrlo je brza, govori se čak o performansama koje pod određenim uvjetima mogu biti i do 10.000 puta brže od asimetrične kriptografije. Također, zbog pozadinske matematičke priče, moguće su i hardverske implementacije za dodatnu efikasnost.
Asimetrična kriptografija nastoji riješiti neke probleme simetrične kriptografije. U asimetričnom sustavu svaki korisnik mora imati dva ključa – jedan javni, koji je dostupan svima na internetu, te drugi tajni, koji je poznat samo korisniku. Zanimljiva je sljedeća činjenica: ako se poruka kriptira javnim ključem, onda se može dekriptirati povezanim tajnim ključem, ali i obrnuto – poruka kriptirana tajnim ključem, može se dekriptirati povezanim javnim ključem. Moguće su obje opcije, i obje opcije imaju svoju važnu funkcionalnost.
Ako Branka kriptira poruku Mariovim javnim ključem (koji Branka lako nabavi na internetu), samo Mario može dekriptirati tu poruku svojim tajnim ključem – jer samo on ima taj tajni ključ. Dakle, imamo tajnost. S druge strane, ako Branka kriptira svoju poruku svojim tajnim ključem i pošalje Mariu, nemamo baš neku tajnost, jer svatko tko uhvati tu poruku, može je dekriptirati Brankinim javnim ključem. Međutim, tko god dekriptira poruku Brankinim javnim ključem, može biti siguran u jedno – da je tu poruku definitivno kriptirala Branka, jer nitko drugi to nije mogao pod pretpostavkom da samo ona ima taj tajni ključ.
U tom slučaju imamo – autentifikaciju. Ovakav sustav ima brojne prednosti – jednostavnija distribucija ključeva, omogućuje se integritet, autentifikacija i neporecivost, ključevi se mogu jednostavno ukinuti ili ponovno generirati ako bi došlo do neke vrste kompromitacije, itd.
Međutim, asimetrična kriptografija ima jednu tešku manu – spora je. Također, ključevi su ogromni – npr. simetrični ključevi mogu biti veličine 256 bita (AES 256), a asimetrični 2048 i više bita (npr. RSA 2048, RSA 4096). Zbog toga se u brojnim scenarijima koji zahtijevaju prijenos većih količina podataka koristi hibridna kriptografija: prvo se asimetričnom kriptografijom uspostavlja konekcija i „razmjena“ simetričnog tajnog ključa; nakon toga se komunikacija odvija kriptiranjem poruka simetričnim ključevima. Konkretan primjer analizirat ćemo u nastavku teksta.
Najpoznatiji algoritmi asimetrične kriptografije su RSA (Rivest–Shamir–Adleman), ElGamal te EC (Elliptic Curve). Glavni problem s RSA je taj što svoju sigurnost temelji na matematičkom problemu faktorizacije integera, za koji trenutno ne postoji efikasno rješenje (polynomial-time), ali – ovo je bitno – nije dokazano da takvo rješenje ne postoji „somewhere out there“! Što znači da, ako neki matematički genij ili sretnik pronađe rješenje za efikasnu faktorizaciju, RSA i svi sustavi kritično bazirani na tom algoritmu naći će se u velikim problemima. Zbog toga, ali i pitanja efikasnosti i kvantne kriptografije, sve se više odvija prijelaz na E.C.
Primjer iz stvarnoga svijeta: „s“ koji sigurnost znači
O samo jednom slovu ovisi mogu li se naši podaci ukrasti ili ne. O jednom slovu ovisi hoće li nam netko popaliti identitet na društvenoj mreži ili skinuti novce s bankovnog računa. O jednom slovu ovisi da li ćemo ostati bez svojih povjerljivih podataka.
To slovo je „s“ – u „https“ – koje nam govori da se radi o sigurnoj vezi s web stranicom koju imamo učitanu u pregledniku.
I „s“ može lagati
Pogrešno je imati potpuno povjerenje u web stranice s „https“ prefiksom protokola. Naime, servisi kao što su Let’s Encrypt omogućuju svakome da uz nekoliko klikova besplatno implementira certifikat i ostvari „https“ protokol na svojoj web stranici. Pa tako i napadači. „https“ nije jamstvo potpune sigurnosti i povjerenja – i dalje je na nama utvrditi krije li se iza „https“ protokola poznata i vjerodostojna domena, ili neka mućka prijevara.
Let’s Encrypt omogućuje besplatnu i jednostavnu implementaciju certifikata i sigurne https veze na web stranici, ali nažalost sigurna veza prema nekoj web stranici ne jamči njenu vjerodostojnost.
Kroz sljedeću priču o šopingu, idemo vidjeti što se događa dok Mario želi kupiti Brankine proizvode na http://brankinestvari.hr (stranica je izmišljena - barem u trenutku pisanja ovoga članka).
Mario bira vrstu i količinu robe, pa puni košaricu. Mario se logira svojim korisničkim imenom i lozinkom, upisuje svoju adresu i detalje o kreditnoj kartici. Mario klikće SUBMIT. Mario čeka dostavu robe.
Što može poći po zlu? Mogući je sljedeći niz scenarija:
- Krađa informacija o kreditnoj kartici
- Preusmjeravanje sredstava
- Krađa login podataka
- Korištenje lozinke za napade na druge servise
- Modificiranje detalja o kupnji
- Krađa identiteta
- Krađa sredstava s kreditne kartice
- Korištenje lažnog web mjesta
- Preusmjeravanje pošiljke
- Ilegalno prikupljanje osobnih i osjetljivih podataka
Alatom Wireshark možemo uhvatiti nekriptirane Mariove mrežne pakete i iščitati njihov sadržaj kao što je to primjerice korisničko ime i lozinka od našeg nesretnog Maria, koji ovdje koristi svoj alias „Bob“.
Kao što je evidentno, pred Mariom je u ovome slučaju značajan potencijal za štetne scenarije raznih oblika. Kako se to dogodilo? Sve zbog jednog slova – odnosno, njegova nedostatka. Da bismo bolje razumjeli pozadinu ovih nesretnih okolnosti, moramo se nakratko vratiti osnovama.
Internet funkcionira na TCP/IP stacku („Internet Protocol Suite“) – familiji protokola čiji suživot prolazi u međusobnom razumijevanju i koordinaciji, sve kako bi računala mogla komunicirati putem interneta i razumjeti jedna druge. Međutim, ta tehnologija nikada nije bila dizajnirana za opaku sigurnost kakva nam je danas potrebna. Točnije, TCP jest dizajniran sa „sigurnošću“ na umu, ali jednom drugom vrstom.
Naime, u vrijeme kada se stack razvijao, ljudi su u većoj mjeri bili opterećeni – interkontinentalnim projektilima. Cilj je bio da TCP funkcionira u slučaju bombardiranja lokacija i gubitka čvorova. Sofisticirani napadi putem drugih računala tada nisu bili ozbiljnije razmatrani.
Možete li zamisliti da su ovakve scene za vrijeme Hladnog rata bile glavni fokus razmišljanja o mrežnoj sigurnosti, a razvojem nedavnih događaja, mogli bi opet.
Ako pogledamo strukturu TCP paketa (nećemo, jer bismo izišli van teme ovoga članka), nećemo pronaći niti jedan element moderne sigurnosti. Zbog toga, trebali smo neku vrstu sigurnosnih zakrpa i „prišivka“ na ovu postojeću tehnologiju, pošto generalna promjena korištene tehnologije na internetu baš i nije opcija. Bacimo konačno oko na taj naš „s“. Što krije to bezazleno slovo u URL-u web stranice i kako je povezano sa sigurnošću i kriptografijom?
Dakle „s“ u „https“ govori nam da stranica koristi tehnologiju TLS (Transport Layer Security) – nekada zvanu SSL (Secure Sockets Layer). Sigurnosni „prišivak“ na postojeći TCP/IP. Divno je što dizajn i implementacija TLS-a ne zahtijeva strukturalne promjene u samom TCP/IP protokolu, već se promjene događaju na razini korisničkih aplikacija i procesa.
Osim na web stranicama, TLS se koristi i za prijenos dokumenata, slanje i primanje emailova, instant messaging, VoIP itd. Čemu nam služi? Za povjerljivost; integritet; autentifikaciju servera; autentifikaciju klijenata; dokazivanje odgovornosti. Drugim riječima, TLS obuhvaća prije navedene ciljeve kriptografije. A to je divno, jer možemo odmah prijeći na konkretne primjere.
TLS nije „protokol“; TLS je skup protokola („cipher suite“) za autentifikaciju, za razmjenu ključeva, za tajnost, za integritet.
Ne treba nam Wireshark kako bismo pogledali „ispod haube“ – ako u web pregledniku kliknemo na ikonu lokota pored URL adresne trake, možemo pronaći detalje o TLS konekciji i korištenim algoritmima.
Idemo analizirati algoritme korištene u komunikaciji s foi.hr domenom.
Primjer uhvaćene TLS sesije („handshake“) s domenom foi.unizg.hr – između klijenta i servera pao je dogovor oko kriptoalgoritama koji će se koristiti u komunikaciji (crveno označeni Cipher Suite: (…).
ECDHE: Razmjena ključeva
Iza skraćenice ECDHE stoji više toga. Prvo, radi se o kriptografiji eliptičnih krivulja (EC – Elliptic Curve), Diffie–Hellman algoritmu (DH) i pojmu „Ephemeral“ (E). Eliptične krivulje već smo kratko spomenuli – u kontekstu temeljenja na drugačijem matematičkom problemu od problema faktorizacije koji koristi RSA, te da je EC „sigurniji“ za budućnost asimetrične kriptografije.
Diffie–Hellman je rock star algoritam za razmjenu ključeva – najznačajniji problem simetrične kriptografije, koji je u ovom slučaju „nadograđen“ eliptičnim krivuljama. Sveukupno, ECDH je anonimni key agreement protocol koji omogućuje dvjema stranama, od kojih svaka ima par javno-privatnih ključeva temeljenih na eliptičnim krivuljama, uspostaviti zajedničku tajnu (npr. ključ) preko nesigurnog kanala (interneta).
Ephemeral je pojam koji označava nešto što je prolazno, kratkotrajno – za razliku od statičnog DH, Ephemeral DH stvara kratkotrajne i jednokratne ključeve po sesiji. Na primjer, ako bismo koristili statički DH, pa nam ključ procuri ili bude ukraden, sve prethodne sesije također mogu biti kompromitirane jer su bile kriptirane istim ključem. Međutim, ako za svaku sesiju koristimo jednokratni ključ i taj jedan ključ nam procuri – on može služiti za kompromitaciju isključivo te jedne sesije, dok će sve prošle sesije biti sigurne u kontekstu tog propusta.
Takvo svojstvo ima naziv Forward Secrecy. Situacija je nešto kompleksnija u stvarnome svijetu i ovdje je to pojednostavljeno opisano, ali glavna ideja je predočena. Osim ECDHE, kao alternative na ovoj poziciji Cipher Suita u istoj funkciji mogu biti primjerice algoritmi RSA, DH ili DHE.
RSA: Autentifikacija
Važno je napomenuti da „Ephemeral“ svojstvo može onemogućiti autentifikaciju servera, čime DH postaje potencijalno izložen man-in-the-middle (MITM) prijetnjama. U sljedećem algoritmu u našem primjeru, RSA je taj koji će „pokrpati“ ovaj problem i omogućiti autentifikaciju servera. Moguće je autentificirati i klijenta, ali nije uobičajeno. Osim RSA, na ovoj poziciji i u istoj funkciji može biti primjerice ECDSA (Elliptic Curve Digital Signature Algorithm).
AES: Tajnost
Sljedeći je algoritam za simetričnu enkripciju AES 128 koji omogućuje kriptiranje samih poruka (payloada) između sugovornika. Vezana uz AES je kratica GCM (Galois/Counter Mode), koja označava mod rada AES-a. Postoji nekoliko režima rada simetričnih kriptoalgoritama, a GCM je široko primijenjen zbog dobrih performansi. Kao alternative na ovoj poziciji mogu biti i primjerice AES 256, ili Camellia.
Do sada korišteni algoritmi u našoj TLS sesiji – ECDHE, RSA, AES – jasno nam govore da se radi o praktičnoj hibridnoj kriptografiji, kombinirajući dodatne funkcionalnosti asimetrične kriptografije (kao što je autentifikacija) i brzinu i efikasnost simetrične kriptografije za daljnju razmjenu kriptiranih poruka.
SHA: Integritet
Još nam preostaje provjeriti je li došlo do neovlaštene izmjene podataka. Tu nam u pomoć priskače SHA algoritam, konkretno u verziji SHA 256, glavni suodgovorni za integritet podataka. SHA (Secure Hash Algorithms) pripada u kategoriju hash algoritama temeljenih na matematičkim jednosmjernim funkcijama. Takve funkcije pretvaraju ulazne podatke proizvoljne veličine (nazovimo ih „plaintext“) u kodirane podatke fiksne duljine bitova (koje zovemo „hashevi“). Kada kažemo „jednosmjerna“ funkcija, znači da bi trebalo biti gotovo nemoguće (eng. „infeasible“ – praktički neizvedivo) iz hasheva natrag dobiti plaintext.
Hack it!
Ovo je primjer hasha: df5e8c760f430ff37c1384098bd7e806. U duhu rečenog – da se iz ovog hasha ne bi smjela dobiti natrag plaintext vrijednost – pokušajte taj hash „probiti“ pomoću primjerice servisa crackstation.net (ne brinite, nećete raditi ništa ilegalno). Rezultat ovog eksperimenta mogao bi uputiti na zaključak da u toj priči nešto ne štima. Prvo, postoje sigurni i nesigurni hash algoritmi. Nesigurni su oni koji su na neki način već „probijeni“. Drugo, kriptografija se često na određeni način zaobilazi, a ne direktno napada.
Internet je primjerice pun baza unaprijed hashiranih lozinki, koje se sakupljaju iz raznih izvora (rječnici, ukradene baze s lozinkama i slično), te se u tom slučaju ne radi revers algoritma hashiranja - već se jednostavno uspoređuju hashevi s postojećim zapisima. Primjeri su lookup i rainbow tablice koje se koriste za „crackanje“ lozinki.
Zaštita postoji – uz samu hashiranu lozinku u bazi, potrebno je koristiti i tzv. salt – nasumični string koji se dodaje svakoj lozinci prije hashiranja. Pri tome je nužno koristiti kriptografski sigurni generator slučajnih brojeva (CSPRNG) i „spore“ algoritme hashiranja (Argon2, PBKDF2, Bcrypt, Scrypt). Glavne funkcionalnosti hasheva su upravo podrška integritetu podataka, ali i podrška sigurnijoj pohrani lozinki u baze podataka.
Upute o sastavljanju konfiguracije za razbijanje lozinki i hasheva dostupne su širom interneta, kao i cloud usluge iste namjene, na linku https://www.shellntel.com/blog/2019/2/19/how-to-build-a-2nd-8-gpu-password-cracker.
Ono što je bitno ovdje zapamtiti su hash algoritmi koji se više ne preporučuju (nisu više sigurni): MD2, MD4, MD5, SHA1. Potrebno je izbjegavati sustave koji koriste ove zastarjele algoritme.
U trenutku pisanja ovoga članka, preporučuju se primjerice algoritmi: SHA256, SHA512, SHA-3, a za sigurniju pohranu lozinki u baze podataka, u razmatranje treba uzeti „sporije“ algoritme kao što su BCrypt, PBKDF2, Argon2 itd.
Finale
Sigurnost je izuzetno dinamično područje te biste trebali biti u toku s važećim kriptoalgoritmima kako se ne bi dogodilo korištenje zastarjelih, probijenih i nesigurnih algoritama ili servisa koji koriste nesigurne algoritme.
Da zaokružimo priču, Mario nam je kroz svoje šoping iskustvo na Brankinoj nesigurnoj web stranici http://brankinestvari.hr skrenuo pažnju na brojne opasnosti koje nas vrebaju ako bismo na takvoj stranici ostavljali svoje privatne i(li) osjetljive podatke.
Radi toga, Mario je upozorio Branku na ovu situaciju, te je Branka promptno reagirala te zatražila i implementirala certifikat koji joj je omogućio sigurniju vezu prema njenoj stranici, koja sada glasi: https://brankinestvari.hr. Nije neka razlika, naočigled. Čini se kao da se Branka uopće nije potrudila, jer tu se samo dodatno pojavilo slovo „s“. Međutim kroz to slovo „s“ omogućena je TLS komunikacija.Takva komunikacija omogućuje većinu osnovnih ciljeva kriptografije: povjerljivost, integritet, autentifikaciju. Možemo uvjetno reći i neporecivost, ali to je jedna druga tema podložna daljnjoj diskusiji.
Mario sada može biti sigurniji u svoj šoping na Brankinu web shopu.
Osim što mu je poznat taj brand, kao i pozitivna iskustva drugih kupaca, Mario sada zna da može uspješno dovršiti kupnju bez da ostane bez svojih osjetljivih podataka, novaca i identiteta.