Datasäkerhet Petter Ericson pettter@cs.umu.se
Vad vet jag? Doktorand i datavetenskap (naturliga och formella språk) Ordförande Umeå Hackerspace Sysadmin CS 07-09 (typ) Aktiv från och till i ACC m.fl. andra sammanhang Allmänt intresserad Frågor? Fråga!
Generell plan Nu: Koncept, bakgrund, SSL/TLS Efter paus: Mer bakgrund, PGP, WoT och CA-hierarkier Nästa gång: Vanliga attacker och försvar Efter paus: Mer grävande, matematiken bakom
Vad är säkerhet? Några idéer?
Vad är säkerhet? Konfidentialitet Ingen kan se vad som skickas, utom sändare och mottagare Inga garantier om vem som skickar, vem som tar emot vem som kan se att ett meddelande har skickats
Vad är säkerhet? Integritet Garanterar att meddelandet inte ändrats under färd Främst använt för att hitta slumpmässiga fel
Vad är säkerhet? (Ändpunkts-)Autenticitet Datorn på andra sidan är verkligen den dator som du tror det är Grönt hänglås
Vad är säkerhet? Anonymitet Bara ändpunkterna vet att ett meddelande utbytts Svårt att kombinera med responsivitet och hastighet i uppkopplingen
Vad är säkerhet? På en specifik dator: Program gör det de ska Användare kommer inte åt det de inte ska Utomstående kommer bara åt det som är offentligt
Kryptologi Ordagrant: Läran om hemligheter Specifika underområden: Informationsteori Kryptografi Diverse matematik
Kryptografi Koder Chiffer Symmetriska/Assymmetriska chiffer Ström-/Blockchiffer
Kryptografi Viktigt! Bra algoritmer och koncept fungerar även om allt om dem är kända, förutom krypteringsnyckeln!
Symmetriska chiffer En nyckel för att kryptera, samma nyckel för att dekryptera Om k = p, bevisat oknäckbart (One-Time Pad)
Konfidentialitet - Symmetriska chiffer Strömchiffer: Idé: Tag ett startvärde (nyckel) k, använd detta för att generera en bitström c s = p c, p = s c Exempel: RC4
Symmetriska chiffer Blockchiffer: Idé: Tag ett block (e.g. 256 bit) av klartext, kombinera ihop med nyckeln på ett reversibelt sätt. Exempel: AES, Blowfish Konfusion, diffusion (Shannon)
Symmetriska chiffer Viktig skillnad: Strömchiffer: beror på internt state, inte input Blockchiffer: beror på input, inte internt state Potentiellt problem med blockchiffer: identiska klartextblock blir identiska krypterade block löses med Cipher Block Chaining, nonces
Symmetriska chiffer Generellt löst, givet korrekta implementationer AES-256 bra nog, Blowfish beräkningsmässigt jobbigare men ännu bättre.
Asymmetrisk kryptografi En nyckel k för att kryptera, en annan nyckel l för att dekryptera. k svårt att hitta, även givet p, s och l. E(k, p) = s; E(l, s) = p
Asymmetrisk kryptografi Några få matematiska funktioner som uppfyller kraven: Primtalsfaktorisering Diskret logaritm modulo p Elliptiska kurvors diskreta logaritm...
Asymmetrisk kryptografi Ger många möjligheter Kryptera Signera Komma överens om symmetriska nycklar
Kryptografiska hashfunktioner Hashfunktioner är ofta använda för att skapa korta beskrivningar för att skydda mot slumpmässiga fel (CRC, etc.) För kryptografi ställer vi ytterligare krav: Om s = h(x), så måste det vara svårt att hitta ett y sådant att s = h(y) Detta måste vara svårt, även om både s och x är kända
Kryptografiska hashfunktioner Tumregler för bra kryptografiska hashfunktioner Att flippa en bit i inputen påverkar helst ungefär hälften av outputbitarna (i genomsnitt) Det är dessutom svårt att ändra på två (eller, för den delen, fler) bitar utan att hashvärdet förändras
Djupdykning: SSL/TLS Komplext protokoll, men vi ska ta en närmare titt på det viktigaste
SSL/TLS Tre faser Negotiation ChangeCipherSpec Application
SSL/TLS Negotiation går ut på att klient och server hittar chiffer, hashfunktioner och sessionsnycklar för säker kommunikation
SSL/TLS ChangeCipherSpec är i stort sett nu tycker jag vi är färdiga, så här såg det ut från mitt håll
SSL/TLS Application phase - allt är klart All kommunikation är nu autentiserad och konfidentiell
Säkra kanaler Vi behöver någon form av säker kanal för att kunna ge någon garanti om säkerhet
Säkra kanaler Den säkraste kanalen vi har är fysisk - Alice kan se och höra Bob, och kan konstatera att ingen annan finns runt om dem.
Säkra kanaler En annan lösning är att sprida en viss bit information (typiskt en publik nyckel) så vitt och brett som möjligt, och hoppas att den kommer fram korrekt fler gånger än inte.
Säkra kanaler Säkra kanaler är typiskt tidsmässigt och bandbreddsmässigt väldigt begränsade. Vi använder därför olika tekniker för att bygga nya säkra kanaler utifrån en tidigare säkrad nyckel.
CA-hierarkier Vi antar att vi på ett säkert sätt fått ett antal publika nycklar från betrodda auktoriteter VeriSign, GlobalSign, GoDaddy, m.fl.
CA-hierarkier Ett certifikat innehåller: Publik nyckel Domän som certifikatet gäller för Utgångsdatum m.m.
CA-hierarkier Hierarki - CA-root skapar för alla, och kan delegera subdomäner till andra CA, exvis *.se, *.com, *.cryptorparty.in osv.
Trovärdighetsnät Ett alternativt sätt att indikera identitet. Istället för ett fåtal antaget trovärdiga, så är alla lika betrodda i någon mening
Trovärdighetsnätverk En sätter själv sin nyckels utgångsdatum Ingen begränsning till en viss domän - däremot till en viss identitet Jobbigt (speciellt) initialt - innan några kopplingar gjorts över huvud taget.
PGP/GPG En av de första programmen som gjorde rejäl asymmetrisk kryptografi tillgänglig för alla GPG en fri implementation
GPG/PGP Främst baserad på RSA-nycklar och trovärdighetsnät Främst avsedd för e-mailkryptering
Defensiv kodstil Verifiera allt Om möjligt, begränsa åtkomsten till det nödvändiga Antag aldrig att något specifikt steg är oknäckbart eller ofelbart.
Defensiv kodstil: lösenord Helst: Klientautentisering via certifikat (del av SSL/TLS bl.a.) Vad som oftast görs: lösenord Vad som alldeles för ofta görs: spara lösenord i klartext
Defensiv kodstil: lösenord Spara kryptografiska hashar av lösenorden - aldrig klartexten Rainbow tables - lösning: salta hashen Om möjligt: använd krypto på klientsidan för att slippa att ett klartextlösenord ens lämnar klientdatorn. (e.g. SCRAM)
Defensiv kodstil: Koda lugnt Att koda är svårt Att koda matte är dubbelt svårt Att koda krypto är trippelt svårt
Defensiv kodstil: Koda lugnt Använd i möjligaste mån Färdig kod Vältestad kod Öppen kod