e573e1f3ab3302f2d8d6a4f61d9f5326.ppt
- Количество слайдов: 60
Pregled kriptografskih mehanizmov znotraj ogrodja. NET Dušan Zupančič, KOMPAS Xnet
Kje nam kriptografija pomaga? Integriteta Zaupnost Prestrezanje Modifikacija Ali je moja komunikacija zasebna? Je kdo spremenil podatke? Avtentikacija Neoporekljivost ? Ponarejanje S kom imam opravka? Ni poslal Trdi Ni prejel Kdo je kaj poslal in kdaj? 2
Kje kriptografija ne pomaga • Kriptografija predstavlja le del splošne varnosti !!! Uporabljamo kriptografijo ≠ varni smo !!! • Kljub vrhunski kriptografski opremi, nam le ta ne pomaga v naslednjih primerih: • Pomanjkljivo šolanje • Brezbrižnost (npr. Izpostavljanje zasebnih ključev, slaba izbira gesel, . . . ) • Neizkušenost in preveliko zaupanje • Napad s socialnim inženiringom • Podkupnine in izsiljevanje • Slabo načrtovana programska oprema z veliko napakami 3
Kaj nas je naučila zgodovina? Varnost šifre mora bazirati izključno na skrivanju ključa ne pa na skrivanju algoritma! Auguste Kerckhoff, „La Cryptographie militaire“, 1883 • Kerckhoff je verjel, da lahko dobre kriptografske algoritme najdemo samo s poskusi kriptoanalize • Dobra šifra predpostavlja da: • Napadalec pozna vse detajle kriptografskega algoritma • Ima napadalec vso potrebno opremo (HW in SW) za šifriranje /odšifriranje • Je napadalcu na voljo dovolj čistopisa in tajnopisa ustvarjenega z enakim (neznanim) ključem • Pri močni šifri se izkaže kot najboljši napad z grobo silo (preizkušanje vseh ključev) 4
Kriptografija v. NET frameworku
Imenski prostor “Cryptography” System. Object Symmetric. Algorithm DES, RC 2, Triple. DES in Rijndael Asymmetric. Algorithm RSA in DSS Hash. Algorithm MD 5, SHA 1, SHA 256, SHA 384 in SHA 512 Keyed. Hash. Algorithm Random. Number. Generator HMACSHA 1 in MACTriple. DES RNG To. Base 64 Transform From. Base 64 Transform Marshal. By. Ref. Object IO. Stream Crypto. Stream Csp. Parameters 6
Kriptografski model. NET • Kriptografski imenski prostor lahko v splošnem razdelimo na 4 glavna področja: 1. Pomožni razredi (Helper Classes) Generiranje naključnih števil, konverzije, komunikacija s Crypto. API skladiščem in dejansko šifriranje toka 2. Algoritmi za šifriranje / odšifriranje in zgoščevanje implementacija simetričnih in asimetričnih in zgoščevalnih algoritmov 3. X. 509 Certifikati Delo z X. 509 certifikati 4. XML Digitalni podpisi Implementacija digitalnih podpisov v XML dokumentih 7
1. Pomožni razredi Naključna števila
Zakaj so naključna števila pomembna • Osnova za generiranje: • Ključev • Inicializacijskih vektorjev • Friziranih vrednosti (salt) • Če osnova za ključ ni dovolj naključna je varnost precej manjša kot jo deklarira uporabljen algoritem 9
Generiranje psevdonaključnih števil • Splošno: SEED = (A * SEED + C) mod M X = f(SEED) Je rezultat res naključen? • Konkretno: • Funkcija rand() iz knjige “The C programming rand language ” (Kernighan / Ritchie): #define RAND_MAX 32767 /* (2**15 - 1) */ SEED = (1103515245 * SEED + 12345) mod 2**15 X = SEED • MS Visual C++ 7 (vrača int): return(((holdrand = holdrand * 214013 L + 2531011 L) >> 16) & 0 x 7 fff); 10
Kriptografsko varna naključna števila RNGCrypto. Service. Provider je ovojnica okrog Crypto. API funkcije Crypt. Get. Random, ki za generiranje naključnih števil uporablja različne podatke sistema: • različni parametri vhodnih naprav (miška, tipkovnica), • process ID, thread ID, • system time, • system counter, • memory status, • free disk clusters, • hashed user environment block byte[] random = new byte[100]; RNGCrypto. Service. Provider rng = new RNGCrypto. Service. Provider(); rng. Get. Bytes(random); 11
2. Algoritmi za šifriranje / odšifriranje in zgoščevanje
Zgoščevanje (Hashing) • Sporočilo se razbije v 512 (ali 1024) bitne bloke, ki so vhod v zgoščevalno funkcijo • Zgoščevalna funkcija iz vrednosti prejšnjega bloka (ali začetne vrednosti) in bloka sporočila izračuna zgoščeno vrednost (hash) • Zgoščena vrednost je velikosti od 128 do 512 bitov 1. Blok sporočila Začetna Vrednost (seed) 2. Blok sporočila 3. Blok sporočila Zgoščevalna funkcija Zgoščevalni algoritem Zgoščena Vrednost (hash) 13
System. Security. Cryptography. Hash. Algorithm MD 5 Crypto. Service. Provider SHA 1 Crypto. Service. Provider SHA 1 Managed SHA 256 Managed SHA 384 Managed SHA 512 Managed Keyed. Hash. Algorithm HMACSHA 1 MACTriple. DES 14
Primer uporabe zgostitve // deklaracija potrebnih spremenljivk byte[] podatki; byte[] rezultat; // nova instanca razreda SHA 512 Managed SHA 512 sha. M = new SHA 512 Managed(); // pretvorba iz niza v polje bajtov podatki = System. Text. Encoding. UTF 8. Get. Bytes(txt. Besedilo. Text); // izračun zgostitve rezultat = sha. M. Compute. Hash(podatki); // izpis kot Base 64 niz lbl. Hash. Text = Convert. To. Base 64 String(rezultat); 15
Varnost zgoščevalnega algoritma • Teoretično 264 (=18, 446, 744, 073, 709, 551, 616) različnih sporočil, da dobimo ponaredek, ki bo dal enako zgostitveno vrednost, kot original: • pri 50 sporočil/sekundo (povprečen PC) 11, 6 milijard let • Pri 10 milijonih sporočil/sekundo 58494 let • Če imamo nadzor nad vsebino obeh sporočil (original in ponaredek) je potrebnih 232 sporočil, da je možnost enake zgostitvene vrednosti višja od 50% • “Rojstnodnevni napad” • 50 sporočil/sekundo < 3 leta • 10 mil. Sporočil/sekundo cca. 7 minut • V takšnih primerih je potrebno poseči po zgostitvenih algoritmih, ki vračajo zgostitvene vrednosti večjih natančnosti • V. NET podrti algoritmi od 128 do 512 bitov 16
V razmislek … MD 5 hash 17
http: //csrc. ncsl. nist. gov/hash_standards_comments. pdf (25. 8. 04) At the recent Crypto 2004 conference, researchers announced that they had discovered a way to "break" a number of hash algorithms, including MD 4, MD 5, HAVAL-128, RIPEMD and the long superseded Federal Standard SHA-0 algorithm. The current Federal Information Processing Standard SHA-1 algorithm, which has been in effect since it replaced SHA-0 in 1994, was also analyzed, and a weakened variant was broken, but the full SHA-1 function was not broken and no collisions were found in SHA-1. The results presented so far on SHA-1 do not call its security into question. However, due to advances in technology, NIST plans to phase out of SHA-1 in favor of the larger and stronger hash functions (SHA-224, SHA-256, SHA-384 and SHA-512) by 2010. 18
DEMO: Gesla v bazi 19
Simetrični kriptosistem Odprti kanal P Šifriranje EK(P) = C Čistopis C Odšifriranje DK(C) = P Čistopis Tajnopis ključ K P ključ K Skupni ključ distribuiramo preko varnega kanala • Isti ključ je uporabljen za šifriranje in odšifriranje • Ključ mora ostati vedno skrit • Isti ključ lahko uporabimo za šifriranje več sporočil, vendar ga moramo periodično zamenjati problem varne distribucije ključev! 20
System. Security. Cryptography. Symmetric. Algorithm DESCrypto. Service. Provider Triple. DESCrypto. Service. Provider RC 2 Crypto. Service. Provider Rijndael. Managed 21
Uporaba šifrirnega toka - šifriranje 1. Ustvarimo instanco ustreznega algoritma Rijndael. Managed my. Rijndael = new Rijndael. Managed(); 2. Ustvarimo objekt tipa encryptor ICrypto. Transform encryptor =_ my. Rijndael. Create. Encryptor(key, IV); 3. Ustvarimo tok (v našem primeru pomnilniški) Memory. Stream ms. Encrypt = new Memory. Stream(); 4. Pred gornji tok dodamo šifrirni tok Crypto. Stream cs. Encrypt = new Crypto. Stream( ms. Encrypt, encryptor, Crypto. Stream. Mode. Write); 5. Pretvorba podatkov v byte array in zapis v kriptografski tok byte[] to. Encrypt = Encoding. UTF 8. Get. Bytes(original); cs. Encrypt. Write(to. Encrypt, 0, to. Encrypt. Length); cs. Encrypt. Flush. Final. Block(); 22
DEMO 23
V razmislek: Deep Crack (1999) – 56 bitni DES-ključ razbit v 56 urah • 24 plošč s po 64 čipi na vsaki • 90 bilijonov ključev na sekundo • Načrtovalec: Paul Kocher • Financiral: John Gilmore • • 72, 057, 594, 037, 927, 936 možnih ključev (256) Skupna cena < 250000 $US v letu 1998 Projekt sponzoriran s strani Electronic Frontier Foundation (EFF) Dokaz, da je NSA imela možnost razbijanja DES od vsega začetka 24
Kolikšna je cena razbitja 56 -bitnega DES ključa danes? Cracker zgrajen v letu 2002 za 160 milijonov USD in je v uporabi slaba 3 leta: • Cena HW na dan: 146000 USD • Razbije en 72 -bitni ključ ali 65536 56 -bitnih ključev vsak dan • Čas potreben za razbitje enega 56 -bitnega DES ključa: 1. 5 sekunde • Cena razbitja enega 56 bitnega DES ključa: 2. 5 $US Vir: http: //www. strongsec. com/vpn_security. pdf 25
Varnost simetričnih ključev in Moorov zakon • • 56 bitov možno razbiti v 1 dnevu za 64 bitov možno razbiti v 1 dnevu za 72 bitov možno razbiti v 1 dnevu za 80 bitov možno razbiti v 1 dnevu za 88 bitov možno razbiti v 1 dnevu za 96 bitov možno razbiti v 1 dnevu za 104 bite možno razbiti v 1 dnevu za 40 milijonov $US v 1982 80 milijonov $US v 1991 160 milijonov $US v 2002 320 milijonov $US v 2011 680 milijonov $US v 2023 1400 milijonov $US v 2033 3000 milijonov $US v 2044 Vir: Arjen K. Lenstra in Eric R. Verheul, "Cryptographic Key Sizes", Oktober 1999 26
In kje je meja napadov z grobo silo? • Termodinamične omejitve • Drugi zakon termodinamike pravi, da je za vsako predstavitev informacije potrebna določena energija • Za spremembo enega bita je potrebna energija: E = k * T (k-Boltzmanova konstanta = 1, 38*10 -23 J/K) • Če je temperatura vesolja 3. 2 Kelvina, bi idealen računalnik deloval pri tej temperaturi, torej za en bit porabi: 1, 38*10 -23 * 3. 2 = 4, 4 *10 -23 J • Naše sonce letno proizvede: 1, 21*1034 J v našem idealnem računalniku to zadostuje za 2, 7 * 1056 sprememb stanj, kar je dovolj, da spravimo 187 -bitni števec skozi vsa njegova stanja. • Če bi vso energijo sonca zbirali 32 let (brez izgub) bi imeli dovolj energije za 192 -bitni števec • Te številke seveda niso povezane s konkretno tehnologijo, so le termodinamični maksimumi, ki povedo, da v doglednem času ne bo mogoč napad z grobo silo na 256 -bitne ključe Vir: Bruce Schneier, Applied Cryptography 27
Asimetrični kriptosistem (Public Key Encryption) Vhod: čistopis Izhod: čistopis Tajnopis “Mlinarček stoji ob mlinu in se jezi” “Svx. C 1@7 l. V 4 b. N: b q/8 Mp? $p. F 5 a. Hjk 5 t Z%” Šifriranje javni Odšifriranje Različna ključa privatni 28
System. Security. Cryptography. Asymmetric. Algorithm DSACrypto. Service. Provider RSACrypto. Service. Provider 32
Primer uporabe asimetrične šifre //vzpostavim nov izvod RSA algoritma RSACrypto. Service. Provider rsa = new RSACrypto. Service. Provider(); // Včitam javni ključ (ki se že nahaja v spremenljivki) rsa. Import. Parameters(rsa. Params. Public); // šifriranje besedila s prej včitanim javnim ključem sifrirano. Sporocilo = rsa. Encrypt(byt. Arr. Cistopis, true); // primer šifriranja ključa seje (AES) // z javnim ključem prejemnika RSAPKCS 1 Key. Exchange. Formatter kefm = new RSAPKCS 1 Key. Exchange. Formatter(rsa); byte [] ovojnica = kefm. Create. Key. Exchange(my. Rijndael. Key); 33
Potek digitalnega podpisovanja 1. korak 2. korak Hash Podatki Zgostitev (Hash) Šifriranje Digitalni podpis Privatni Digitalni podpis 3. korak Javni 1. Izračunamo zgostitev (Hash) podatkov s pomočjo podprtih zgoščevalnih algoritmov, npr. : MD 2, MD 5, ali SHA-1. 2. Zgostitev (Hash) šifriramo s pošiljateljevim privatnim ključem. 3. Dobljen podpis (in kopijo pošiljateljevega javnega ključa) pripnemo na konec sporočila 35
Digitalni podpis • Podpisovanje: Asymmetric. Algorithm cipher = DSA. Create(); Asymmetric. Signature. Formatter asf = new DSASignature. Formatter(cipher); SHA 1 sha 1 = SHA 1. Create(); File. Stream in. Stream = new File. Stream(filename, File. Mode. Open); byte[] sig = asf. Create. Signature(sha 1. Compute. Hash(in. Stream)); 36
Digitalni podpis • Preverjanje: Asymmetric. Algorithm cipher = DSA. Create(); // pubkey vsebuje javni ključ v XML obliki cipher. From. Xml. String(pubkey); Asymmetric. Signature. Deformatter asd = new DSASignature. Deformatter(cipher); SHA 1 sha 1 = SHA 1. Create(); File. Stream in. Stream 3 = new File. Stream(filename, File. Mode. Open); byte[] hash = sha 1. Compute. Hash(in. Stream 3); if (asd. Verify. Signature(hash, sig)) Console. Write. Line(“Podpis je pristen!"); 37
3. Delo z X. 509 certifikati
Certifikat • Kako do testnega certifikata? • S programom “Make. Cert”, ki je vključen tudi v. NET framework SDK: makecert -sk "KOMPAS Xnet" -n "CN=Ime Test, O=KOMPAS Xnet" kompas. Test. CER 39
System. Security. Cryptography. X 509 Certificates • X 509 Certificate – CLR implementacija X 509. v 3 certifikata • X 509 Certificate. Collection – zbirka, ki vsebuje objekte X 509 Certificate 40
Primer uporabe X 509 Certificate using System; using System. Security. Cryptography. X 509 Certificates; public class X 509 { public static void Main() { // Pot do datoteke s certifikatom. string Certificate = "Certificate. cer"; // Nalaganje v X 509 Certificate objekt. X 509 Certificate cert = X 509 Certificate. Create. From. Cert. File(Certificate); // Dobi javni ključ. byte[] results = cert. Get. Public. Key(); // Izpiši vrednosti na konzolo foreach(byte b in results) { Console. Write(b); } } } 41
Shrambe certifikatov • Do certifikatov dostopamo preko Crypto. APi, ki loči naslednje shrambe: • » My « - certifikati prijavljenega uporabnika • » Address. Book « certifikati ostalih ljudi s katerimi komuniciramo • » Root « - korenski certifikati izdajateljev (CA) • » Trust « - certifikati, ki jim zaupamo 42
Kako do certifikatov v shambah • Trenutno samo 2 načina: • Preko Crypto. API • Ali preko CAPICOM • Whidbey bo prinesel podporo za uporabo certifikatnih shramb 43
DEMO: Včitavanje certifikatov iz shramb 44
XML digitalni podpisi
Standardi za XML varnost • Definiran je slovar XML za varnostne informacije • Skladen z ostalimi XML standardi • Varnost lahko uveljavljamo nad: • Celimi XML dokumenti • Določenim XML elementom • Vsebino XML elementa • Varnost je vezana na vsebino (ne na transport kot SSL) • XML Security uporablja obstoječe kriptografske metode 46
XML digitalni podpis • Osnovne značilnosti: • Podpišemo lahko skoraj karkoli v dokumentu • Zaradi robustnosti lahko XML kanonikaliziramo • Podpis se lahko nahaja v ločenem dokumentu 47
Zakaj kanonikalizacija? • Serializacija v XML 1. 0 ima ohlapna pravila
Osnovna pravila kanonikalizacije • Canonical XML 1. 0 • http: //www. w 3. org/TR/xml-c 14 n (RFC 3076) • Osnovna pravila – na kratko: • Znaki so kodirani po UTF-8 • CDATA odseki se zamenjajo z ustreznimi entitetnimi oznakami (> , < , itd. ) • Prazni elementi se iz
Ločen podpis (Detached signature) Vsebina Certifikat Dokumenta ------- Vsebina Dokumenta Generiranje podpisa ------- ------------Podpis ---- 50
Vsebovani podpisi 51
Osnovni deli XMLDSIG • Osnovo sestavljajo trije deli • Podatki, ki jih podpisujemo • Dejanski podpis • Informacija o ključu, uporabljenem pri podpisu Podatki, ki smo jih podpisali podpis Opcijske informacije O ključu
Kaj podpisujemo? • Signed. Info vsebuje podatke o tem kaj podpisujemo • Vsebuje informacije o tem kako • kanonikalizirati Signed. Info • izračunati zgostitev elementa Signed. Info • šifrirati dobljen rezultat, da dobimo digitalni podpis • Sklic na elemente za podpis Kako kanonikalizirati Signed. Info Kako izračunati zgostitev in jo šifrirati
Sklic na XML podatke za podpis • Element “Reference” povezuje podpis s podatki, ki jih želimo podpisati • Vsebuje zgostitev (hash) vsake reference, ki jo želimo podpisati • Podpis povezuje zgostitev z vsebino podpisnikovega ključa Oznaka fragmenta ali URL, ki kaže na zunanji XML dokument Uporabljena transformacija Kako izračunati zgostitev Zgostitvena vrednost
System. Security. Cryptography. Xml • • Signed. Xml Signature Signed. Info Reference Trasnform. Chain Transform Key. Info • • RSAKey. Value DSAKey. Value Key. Info. Name Key. Info. Retrieval. Method Key. Info. X 509 Data Key. Info. Node Data. Object 55
// ustvarim Signed. Xml signed. Xml = new Signed. Xml(); RSA key = RSA. Create(); signed. Xml. Signing. Key = key; // podatkovni vsebnik za podpisane podatke. System. Security. Cryptography. Xml. Data. Object data. Object = new System. Security. Cryptography. Xml. Data. Object(); data. Object. Data = document. Child. Nodes; data. Object. Id = "za. Podpis"; // Podatkovni objekt dodam k podpisu. signed. Xml. Add. Object(data. Object); //Dodam referenco, da lahko vse zapakiram v en dokument. Reference reference = new Reference(); reference. Uri = "#za. Podpis"; // Referenco dodam v sporočilo. signed. Xml. Add. Reference(reference); // Informacija o ključu. Key. Info key. Info = new Key. Info(); key. Info. Add. Clause(new RSAKey. Value(key)); signed. Xml. Key. Info = key. Info; // Izračun podpisa. signed. Xml. Compute. Signature(); // Get the XML representation of the signature. Xml. Element xml. Signature = signed. Xml. Get. Xml(); 56
DEMO: XML podpis 58
XML Encryption (XMLENC) • Šifrirani elementi se zamenjajo z elementom
Primer šifriranja XML
Podpora v. NET frameworku • V. NET frameworku 1. 1: • Obstaja podpora za XMLDSIG • Ni podpore za XMLENC • Whidbey prinaša: • Razširitve v smeri X. 509 (validacija certifikatov, dostop do certifikatnih shramb, …) • Podporo PKCS 7 (CMS - Cryptographic Message Syntax ) • Integracija z ostalimi tehnologijami (XMLENC, …) 61
Zaključek • Za varovanje podatkov ne pišimo lastnih “super” algoritmov – uporabimo kar ponuja System. Security. Cryptography • Nabor algoritmov, ki jih ponuja. NET je dovolj bogat, uporaba pa enostavna • Podpora škriplje pri delu z X. 509 certifikati, kar pa se bo izboljšalo z Whidbey-em • Podpora za delo z XMLDSIG je dobra, manjka pa podpora za XMLENC 62
Tečaji na to temo v KOMPAS Xnet • 2806 (31. 1. 2005) Microsoft Security Guidance Training for Developers • MOC 2300 (2. -6. 12. 2004) Developing Security-Enhanced Web Applications • MOC 2840 (21. -25. 2. 2005) Implementing Security for Applications 63
Vprašanja 64


