Скачать презентацию Fejlett Programozási Technikák 2 15 8 1 Fejlett Скачать презентацию Fejlett Programozási Technikák 2 15 8 1 Fejlett

9d6448c8304a053c4ce7463640c67172.ppt

  • Количество слайдов: 71

Fejlett Programozási Technikák 2. 15/8 1 Fejlett Programozási Technikák 2. 15/8 1

Fejlett Programozási Technológiák 2. Az előző előadás tartalma: n Java Applet ¨ Felépítése ¨ Fejlett Programozási Technológiák 2. Az előző előadás tartalma: n Java Applet ¨ Felépítése ¨ Tulajdonságai ¨ Paraméterátadás n JDBC ¨ Típusai ¨ Kapcsolat típusok ¨ Statement objektumok ¨ Record. Set ¨ Tranzakciók 2

Fejlett Programozási Technológiák 2. Források n n n n n http: //www. javaworld. com/javaworld/jw-04 Fejlett Programozási Technológiák 2. Források n n n n n http: //www. javaworld. com/javaworld/jw-04 -2000/jw-0428 -security. html http: //www. cacr. math. uwaterloo. ca/hac/ http: //java. sun. com/security/ http: //www. javaworld. com/javaworld/jw-09 -2002/jw-0913 -jaas. html http: //java. sun. com/sfaq/verifier. html http: //ei. cs. vt. edu/~wwwbtb/book/chap 14/index. html http: //www. cab. u-szeged. hu/WWW/java/kiss/security. html#ch 3. 1 http: //www 2. tw. ibm. com/developer. Works/tutorial/pdf/j-sec 1 -a 4. pdf http: //www 2. tw. ibm. com/developer. Works/tutorial/pdf/j-sec 2 -a 4. pdf 3

Fejlett Programozási Technológiák 2. A mai előadás tartalma: n n Számítógépes biztonság Jáva és Fejlett Programozási Technológiák 2. A mai előadás tartalma: n n Számítógépes biztonság Jáva és a biztonság ¨ Biztonsági n architektúra Titkosító architektúra ¨ JCE ¨ JAAS ¨ JSSE ¨ GSSE 4

Fejlett Programozási Technológiák 2. Számítógépes biztonság n n n Mit jelent a számítógépes biztonság? Fejlett Programozási Technológiák 2. Számítógépes biztonság n n n Mit jelent a számítógépes biztonság? Korlátlan erőforrással bármely rendszer feltörhető. Cél: Olyan rendszer kiépítése melynek feltörése sokkal nagyobb energia mint a benne fellelhető információ értéke A bonyolult rendszer nem biztos, hogy biztonságosabb. A biztonsági szempontok a rendszer tervezésének alapvető paraméterei közé tartoznak. 5

Fejlett Programozási Technológiák 2. Támadás típusok n Kategóriák: ¨ Titkosság elleni támadás ¨ Integritás Fejlett Programozási Technológiák 2. Támadás típusok n Kategóriák: ¨ Titkosság elleni támadás ¨ Integritás elleni támadás ¨ Rendelkezésre állás elleni támadás n Gyakori támadás fajták: ¨ Nyers erő (brute force) ¨ Trójai (trojan horse) ¨ Ember középen (man-in-the-middle) 6

Fejlett Programozási Technológiák 2. Feltörhetőség n n n n 1977: Diffie and Hellman, 20 Fejlett Programozási Technológiák 2. Feltörhetőség n n n n 1977: Diffie and Hellman, 20 millió gép, 10 óra alatt 1987: Diffie and Hellman, 200, 000 gép, 10 óra alatt 1993: Diffie and Hellman, M. Wiener, kulcs kereső IC, 5760 IC, $10. 50/IC, 1. 5 nap alatt 1997: DES challenges I, DESCHALL, 96 nap 1998: DES challenges II-1, distributed. net, 41 nap 1998: DES challenges II-2, Electronic Frontier Foundation, 56 nap 1999: DES challenges III, distributed. net, 22 nap 7

Fejlett Programozási Technológiák 2. Jáva támadások 1. 2. 3. 4. 5. 6. Trükkös kód Fejlett Programozási Technológiák 2. Jáva támadások 1. 2. 3. 4. 5. 6. Trükkös kód Régi, hack-elt javac Class fájlok átírása (CGI jogosultságok) Programok válogatása Kapcsolat eltérítése (spoofing) (aláírt applet) JVM bug 8

Fejlett Programozási Technológiák 2. Áttekintés 9 Fejlett Programozási Technológiák 2. Áttekintés 9

Fejlett Programozási Technológiák 2. Jáva és a biztonság/1 n Nyílt: ¨ n Jáva nyelv: Fejlett Programozási Technológiák 2. Jáva és a biztonság/1 n Nyílt: ¨ n Jáva nyelv: ¨ ¨ ¨ n A fordító és a virtuális gép forrása is hozzáférhető, megvizsgálható Nincsenek mutatók Minden primitív típus adott méretű Hozzáférési szintek Final Hibakezelés Fordító: Az utasítások sorrendje fordító független ¨ Bájtkód ¨ Erősen típusos, fordításkor szigorú ellenőrzés ¨ n n n Objektum típusátformázás ellenőrzött (casting) Minden metódus, tagváltozó hivatkozás ellenőrzésre kerül (pl. : private) Primitív adattípusok nem keverhetőek a referencia típusokkal (1. 5 auto boxing) 10

Fejlett Programozási Technológiák 2. Jáva és a biztonság/2 n Futtató környezet: ¨ Osztály betöltő Fejlett Programozási Technológiák 2. Jáva és a biztonság/2 n Futtató környezet: ¨ Osztály betöltő ¨ Bájt kód ellenőrző n Verzió problémák, Bináris kompatibilitás n Gonosz másik oldal (trükkös fordító, …) ¨ Biztonsági Menedzser: n Az erőforrások elérésének ellenőrzése n Kód alapú n Felhasználó alapú ¨ Szemét gyűjtő n Keretrendszerek, API-k 11

Fejlett Programozási Technológiák 2. Osztály betöltő n Típusai: Ősi (primordial) ¨ Java osztálybetöltő ¨ Fejlett Programozási Technológiák 2. Osztály betöltő n Típusai: Ősi (primordial) ¨ Java osztálybetöltő ¨ Saját osztály betöltőt is írhatunk (pl. : címtárból történő betöltésre…) ¨ n Feladatai: ¨ Az osztály fájlok megtalálása (megfelelő sorrendben, biztonsági okokból) n n n Böngésző értelmezi a html kódot Indít egy JVM-et A JVM meghívja az Applet osztály betöltőt A betöltő megpróbálja a helyi lemezről betölteni (java. , …) (ősi) Végigkeresi a classpath-ot (URLClass. Loader) Megpróbálja letölteni a webszerverről (Bönégsző specifikus class loader, vagy URLClass. Loader) A biztonsági beállítások lekérdezése ¨ Egy osztály objektum definiálása megfelelő jogosultságokkal ¨ A névterek kezelése ¨ 12

Fejlett Programozási Technológiák 2. Bájt kód ellenőrző n n n Class file verifier Az Fejlett Programozási Technológiák 2. Bájt kód ellenőrző n n n Class file verifier Az alap Java osztályokat nem bántja (esetenként a helyi lemezen lévő fájlokat sem) Problémák: ¨ ¨ ¨ n n Illegális mutató (egy objektumot más objektumként használunk) Illegális bájtkód utasítások Illegális paraméterek kiszűrése Verem túlcsordulás Illegális cast Láthatóság megsértése A fentieket megoldhatná a JVM csak lassabb lenne a végrehajtás Folyamat: ¨ ¨ Osztályállomány szintaktikus ellenőrzése Osztályállomány összefüggéseinek ellenőrzése Az utasításfolyam ellenőrzése Külső hivatkozások ellenőrzése 13

Fejlett Programozási Technológiák 2. Példa Exception in thread Fejlett Programozási Technológiák 2. Példa Exception in thread "main" java. lang. Verify. Error: (class: Test. Verify, method: add signature: ()I) Accessing value from uninitialized register 1 import java. awt. *; import java. applet. *; public class Test. Verify extends Applet { public static void main(String[] args) { System. out. println("3 + 4 = " + add()); } static int add() { int a, b, c; a = 3; b = 4; return (a+b); } public void paint(Graphics g) { g. draw. String("3 + 4 = " + add(), 10, 20); } } Compiled from Test. Verify. java public class Test. Verify extends java. applet. Applet { public Test. Verify(); static int add(); public static void main(java. lang. String[]); public void paint(java. awt. Graphics); } Method Test. Verify() 0 aload_0 1 invokespecial #9 4 return Method int add() 0 iconst_3 1 istore_0 2 iconst_4 3 istore_1 4 iload_0 5 iload_1 6 iadd 14 7 ireturn

Fejlett Programozási Technológiák 2. Osztályállomány szintaktikus ellenőrzése n n n Class. File { u Fejlett Programozási Technológiák 2. Osztályállomány szintaktikus ellenőrzése n n n Class. File { u 4 magic; (0 x. CAFEBABE) Aláírás ellenőrzés u 2 minor_version; A struktúrák hosszának ellenőrzése u 2 major_version; u 2 constant_pool_count; Constant pool ellenőrzése cp_info constant_pool[constant_pool_count-1]; u 2 access_flags; u 2 this_class; u 2 super_class; u 2 interfaces_count; u 2 interfaces[interfaces_count]; u 2 fields_count; field_info fields[fields_count]; u 2 methods_count; method_info methods[methods_count]; u 2 attributes_count; attribute_info attributes[attributes_count]; } 15

Fejlett Programozási Technológiák 2. Osztályállomány összefüggéseinek ellenőrzése n n Olyan ellenőrizések melyeket a kód Fejlett Programozási Technológiák 2. Osztályállomány összefüggéseinek ellenőrzése n n Olyan ellenőrizések melyeket a kód értelmezése nélkül meg lehet tenni Final Superclass Konstans Tároló 16

Fejlett Programozási Technológiák 2. Az utasításfolyam ellenőrzése n Adatfolyam ellenőrzés minden metóduson, a program Fejlett Programozási Technológiák 2. Az utasításfolyam ellenőrzése n Adatfolyam ellenőrzés minden metóduson, a program egy-egy pontban az elérési útvonaltól függetlenül: ¨A stack ugyanolyan méretű és ugyanazokat az objektumokat tartalmazza ¨ A regiszterek csak akkor használtak, ha megfelelő típust tartalmaznak ¨ A metódusok megfelelő paraméterekkel hívódnak meg ¨ A mezők megfelelő típusú értékkel módosulnak n n A kódot statikusan ellenőrzi (nem futtatja) Eredménye: ¨ Futásidejű viselkedés bizonyíthatóan biztonságos ¨ Futásidejű viselkedés bizonyíthatóan nem biztonságos ¨ Futásidejű viselkedés sem nem bizonyíthatóan biztonságos sem nem bizonyíthatóan nem biztonságos 17

Fejlett Programozási Technológiák 2. Külső hivatkozások ellenőrzése Az előző menetekben nem ellenőrizte a külső Fejlett Programozási Technológiák 2. Külső hivatkozások ellenőrzése Az előző menetekben nem ellenőrizte a külső osztályok és azok mezőinek valódiságát n Futás közben ellenőrzi a fentieket amikor betöltődnek az osztályok n 18

Fejlett Programozási Technológiák 2. Biztonsági Menedzser Futás idejű biztonsági ellenőrzés n Java 2 előtt Fejlett Programozási Technológiák 2. Biztonsági Menedzser Futás idejű biztonsági ellenőrzés n Java 2 előtt egy absztrakt osztály volt (főleg a böngészők implementálták) n ¨ Homokozó n java. lang. Security. Manager ¨ Biztonsági rendszabály alapú (policy based) n Természetesen ez is bővíthető 19

Fejlett Programozási Technológiák 2. Hely függő (homokozó modell) Java 1. 0 n Nagyon szigorú Fejlett Programozási Technológiák 2. Hely függő (homokozó modell) Java 1. 0 n Nagyon szigorú a távoli kódokkal n Nincs kivétel n 20

Fejlett Programozási Technológiák 2. Kód alapú (digitálisan aláírt) Java 1. 1 n A digitálisan Fejlett Programozási Technológiák 2. Kód alapú (digitálisan aláírt) Java 1. 1 n A digitálisan aláírt kód alapján eldönthetjük, hogy milyen jogosultsággal akarjuk futtatni n Probléma: Érdekes játék, háttérben a bankkártya adatokat n 21

Fejlett Programozási Technológiák 2. Finomhangolás Java 2 n Aláírás/URL alapú n Távoli és helyi Fejlett Programozási Technológiák 2. Finomhangolás Java 2 n Aláírás/URL alapú n Távoli és helyi kódra is vonatkozhat n Policy fájl n Adott jogosultság adott kódrésznek adott erőforráshoz n 22

Fejlett Programozási Technológiák 2. Védelmi tartomány Rendszer Tartomány n Alkalmazás tartományok n ¨ Principal Fejlett Programozási Technológiák 2. Védelmi tartomány Rendszer Tartomány n Alkalmazás tartományok n ¨ Principal ¨ Policy fájl grant signed. By "sysadmin", code. Base "file: /home/sysadmin/*" { permission java. security. Security. Permission "Security. insert. Provider. *"; permission java. security. Security. Permission "Security. remove. Provider. *"; permission java. security. Security. Permission "Security. set. Property. *"; }; 23

Fejlett Programozási Technológiák 2. Lexikális szűkítés Csak az adott kódrésznek adunk jogosultságot n Minden Fejlett Programozási Technológiák 2. Lexikális szűkítés Csak az adott kódrésznek adunk jogosultságot n Minden érzékeny kód egy helyre gyűjthető n java. security. Access. Controler. do. Privileged() n 24

Fejlett Programozási Technológiák 2. Futás idejű hozzáférés vezérlés n n n I/O, … Security. Fejlett Programozási Technológiák 2. Futás idejű hozzáférés vezérlés n n n I/O, … Security. Manager. check. Permission() A szál jogosultságát ellenőrzi ¨A hívási veremben minden metódust ellenőriz (az általuk használt objektumokat) ¨ A legkisebb közös jogosultság n Használata: ¨ java -Djava. security. manager Hello. World ¨ java. lang. System 25

Fejlett Programozási Technológiák 2. Áttekintés 26 Fejlett Programozási Technológiák 2. Áttekintés 26

Fejlett Programozási Technológiák 2. Eszközök Jar n Jarsigner n Keytool n ¨ Keystore n Fejlett Programozási Technológiák 2. Eszközök Jar n Jarsigner n Keytool n ¨ Keystore n policytool 27

Fejlett Programozási Technológiák 2. Kód biztonság n Bájt kód ¨ Sok információt tartalmaz ¨ Fejlett Programozási Technológiák 2. Kód biztonság n Bájt kód ¨ Sok információt tartalmaz ¨ Könnyű visszafejteni n Eszköz: ¨ Mocha, n n … Algoritmus másolás Érzékeny információ (passwd, …) Biztonsági rendszer megismerése … 28

Fejlett Programozási Technológiák 2. Megoldás n Obfuscator ¨A változó, metódus neveket lecseréli a constant Fejlett Programozási Technológiák 2. Megoldás n Obfuscator ¨A változó, metódus neveket lecseréli a constant pool-ban ¨ Védett nevek használata (if, for, …) n Hosing ¨ Értelmetel kódokat szúr be (pl. : pop, push) ¨ Nagyban rontja a JVM JIT hatékonyságát n Írjunk olyan kódot melynél nem baj ha más is elolvassa 29

Fejlett Programozási Technológiák 2. J 2 SE 1. 5 biztonsági eszközök JCA/JCE n JSSE Fejlett Programozási Technológiák 2. J 2 SE 1. 5 biztonsági eszközök JCA/JCE n JSSE n Java Cert. Path n JAAS/JGSS n 30

Fejlett Programozási Technológiák 2. JCA/JCE JCA n Titkosító architektúra n Alap titkosítás n Export Fejlett Programozási Technológiák 2. JCA/JCE JCA n Titkosító architektúra n Alap titkosítás n Export korlátozás mentes n Aláírások, kivonat, . . JCE n Titkosító architektúra bővítmény n Fejlett titkosítás n Export korlátozás n Titkosítók 31

Fejlett Programozási Technológiák 2. Titkosító architektúra n Titkosító eljárások: ¨ Szimmetrikus n n kulcsú Fejlett Programozási Technológiák 2. Titkosító architektúra n Titkosító eljárások: ¨ Szimmetrikus n n kulcsú titkosítás (bulk encripiton) DES DEA RC 4 AES ¨ Aszimmetrikus n kulcsú titkosítás (public key encripition) RSA ¨ Kivonatolás n MD 5 32

Fejlett Programozási Technológiák 2. Kivonatolás n Kulcs használatával (MAC) Kulcs nélkül ¨ Algoritmusok: n Fejlett Programozási Technológiák 2. Kivonatolás n Kulcs használatával (MAC) Kulcs nélkül ¨ Algoritmusok: n HMAC/SHA-1 n HMAC/MD 5 n MD 2, MD 5 (128 bit) ¨ Használata: n SHA-1 (160 bit) Key. Generator. get. Instance("Hmac. MD 5" n SHA-256, SHA-382, SHA-512 ) ¨ Használata: . generate. Key() Mac. get. Instance("Hmac. MD 5") Message. Digest. get. Instance("MD 5"). init(MD 5 key). update(plaintext). digest(). do. Final() n 33

Fejlett Programozási Technológiák 2. Példa kivonatoló import java. security. *; import javax. crypto. *; Fejlett Programozási Technológiák 2. Példa kivonatoló import java. security. *; import javax. crypto. *; public class Message. Digest. Example { public static void main (String[] args) throws Exception { if (args. length !=1) { System. err. println("Usage: java Message. Digest. Example text"); System. exit(1); } byte[] plain. Text = args[0]. get. Bytes("UTF 8"); Message. Digest message. Digest = Message. Digest. get. Instance("MD 5"); message. Digest. update( plain. Text); System. out. println( "n. Digest: " ); System. out. println( new String( message. Digest. digest(), "UTF 8") ); } } 34

Fejlett Programozási Technológiák 2. Példa MAC import java. security. *; import javax. crypto. *; Fejlett Programozási Technológiák 2. Példa MAC import java. security. *; import javax. crypto. *; public class Message. Authentication. Code. Example { public static void main (String[] args) throws Exception { if (args. length !=1) { System. err. println("Usage: java Message. Authentication. Code. Example text"); System. exit(1); } byte[] plain. Text = args[0]. get. Bytes("UTF 8"); System. out. println( "n. Start generating key" ); Key. Generator key. Gen = Key. Generator. get. Instance("Hmac. MD 5"); Secret. Key MD 5 key = key. Gen. generate. Key(); System. out. println( "Finish generating key" ); Mac mac = Mac. get. Instance("Hmac. MD 5"); mac. init(MD 5 key); mac. update(plain. Text); System. out. println( "n" + mac. get. Provider(). get. Info() ); System. out. println( "n. MAC: " ); System. out. println( new String( mac. do. Final(), "UTF 8") ); }} 35

Fejlett Programozási Technológiák 2. Titkosítás n Típusai: ¨ Adatkezelés n Blokk titkosító (block cipher) Fejlett Programozási Technológiák 2. Titkosítás n Típusai: ¨ Adatkezelés n Blokk titkosító (block cipher) ¨ ¨ n 64 bit Padding (No padding, PKCS 5, OAEP, SSL 3) Bit titkosító (stream cipher) ¨ Algoritmus: n n Nyilvános kulcsú Titkos kulcsú ¨ Működési n n n módok ECB (Electronic Code Book) CBC (Cipher Block Chaining) CFB (Cipher Feedback Mode) OFB (Output Feedback Mode) PCBC (Propagating Cipher Block Chaining) 36

Fejlett Programozási Technológiák 2. Szimmetrikus titkosítás n Algoritmusok: ¨ DES (Data Encription Standard) – Fejlett Programozási Technológiák 2. Szimmetrikus titkosítás n Algoritmusok: ¨ DES (Data Encription Standard) – 54 bit ¨ Tripl. DES – 112 bit ¨ AES (Advanced Encription Standard) – 128, 192, 256 bit ¨ RC 2, RC 4, RC 5 ¨ Blowfish – 32 - 448 bit ¨ PBE (Password Based Encryption) n Használatuk: ¨ Key. Generator. get. Instance("DES"), . init(56), . generate. Key() ¨ Cipher. get. Instance("DES/ECB/PKCS 5 Padding") ¨. init(Cipher. ENCRYPT_MODE, key) ¨. do. Final(plain. Text) ¨. init(Cipher. DECRYPT_MODE, key): 37 ¨. do. Final(cipher. Text)

import Programozási Fejlett java. security. *; Technológiák 2. import javax. crypto. *; public class import Programozási Fejlett java. security. *; Technológiák 2. import javax. crypto. *; public class Private. Example { public static void main (String[] args) throws Exception { if (args. length !=1) { System. err. println("Usage: java Private. Example text"); System. exit(1); } byte[] plain. Text = args[0]. get. Bytes("UTF 8"); System. out. println( "n. Start generating DES key" ); Key. Generator key. Gen = Key. Generator. get. Instance("DES"); key. Gen. init(56); Key key = key. Gen. generate. Key(); System. out. println( "Finish generating DES key" ); Cipher cipher = Cipher. get. Instance("DES/ECB/PKCS 5 Padding"); System. out. println( "n" + cipher. get. Provider(). get. Info() ); System. out. println( "n. Start encryption" ); cipher. init(Cipher. ENCRYPT_MODE, key); byte[] cipher. Text = cipher. do. Final(plain. Text); System. out. println( "Finish encryption: " ); System. out. println( new String(cipher. Text, "UTF 8") ); System. out. println( "n. Start decryption" ); cipher. init(Cipher. DECRYPT_MODE, key); byte[] new. Plain. Text = cipher. do. Final(cipher. Text); System. out. println( "Finish decryption: " ); System. out. println( new String(new. Plain. Text, "UTF 8") ); } } 38

Fejlett Programozási Technológiák 2. Aszimmetrikus titkosítás n n n Tipikus kulcs hosszúság 1024 bit Fejlett Programozási Technológiák 2. Aszimmetrikus titkosítás n n n Tipikus kulcs hosszúság 1024 bit 100, 1000 –szer lassabb mint a szimmetrikus Algoritmusok: ¨ RSA ¨ Diffie-Hellman n (kulcs csere) Használata: ¨ Key. Pair. Generator. get. Instance("RSA") n. initialize(1024) n. generate. Key. Pair(): ¨ Cipher. get. Instance("RSA/ECB/PKCS 1 Padding") ¨. init(Cipher. ENCRYPT_MODE, key. get. Public()) ¨. do. Final(plain. Text) ¨. init(Cipher. DECRYPT_MODE, ¨. do. Final(cipher. Text) key. get. Private()) 39

import java. security. *; Fejlett Programozási Technológiák 2. import javax. crypto. *; public class import java. security. *; Fejlett Programozási Technológiák 2. import javax. crypto. *; public class Public. Example { public static void main (String[] args) throws Exception { if (args. length !=1) { System. err. println("Usage: java Public. Example text"); System. exit(1); } byte[] plain. Text = args[0]. get. Bytes("UTF 8"); System. out. println( "n. Start generating RSA key" ); Key. Pair. Generator key. Gen = Key. Pair. Generator. get. Instance("RSA"); key. Gen. initialize(1024); Key. Pair key = key. Gen. generate. Key. Pair(); System. out. println( "Finish generating RSA key" ); Cipher cipher = Cipher. get. Instance("RSA/ECB/PKCS 1 Padding"); System. out. println( "n" + cipher. get. Provider(). get. Info() ); System. out. println( "n. Start encryption" ); cipher. init(Cipher. ENCRYPT_MODE, key. get. Public()); byte[] cipher. Text = cipher. do. Final(plain. Text); System. out. println( "Finish encryption: " ); System. out. println( new String(cipher. Text, "UTF 8") ); System. out. println( "n. Start decryption" ); cipher. init(Cipher. DECRYPT_MODE, key. get. Private()); byte[] new. Plain. Text = cipher. do. Final(cipher. Text); System. out. println( "Finish decryption: " ); System. out. println( new String(new. Plain. Text, "UTF 8") ); }} 40

Fejlett Programozási Technológiák 2. Digitális aláírások n n Tipikusan hash+asszimmetrikus titkosítás Módszerek: ¨ ¨ Fejlett Programozási Technológiák 2. Digitális aláírások n n Tipikusan hash+asszimmetrikus titkosítás Módszerek: ¨ ¨ n Algoritmusok: ¨ ¨ n Barkácsolós Egyszerű MD 2/RSA MD 5/RSA SHA 1/DSA SHA 1/RSA Használatuk: ¨ Key. Pair. Generator. get. Instance("RSA") n n ¨ . initialize(1024). generate. Key. Pair() Cipher. get. Instance("MD 5 With. RSA") n n . init. Sign(key. get. Private()). update(plain. Text). sign(). init. Verify(key. get. Public()) and. verify(signature): 41

import Programozási Fejlett java. security. *; Technológiák 2. import javax. crypto. *; public class import Programozási Fejlett java. security. *; Technológiák 2. import javax. crypto. *; public class Digital. Signature 2 Example { public static void main (String[] args) throws Exception { if (args. length !=1) {System. err. println("Usage: java Digital. Signature 1 Example text"); System. exit(1); } byte[] plain. Text = args[0]. get. Bytes("UTF 8"); System. out. println( "n. Start generating RSA key" ); Key. Pair. Generator key. Gen = Key. Pair. Generator. get. Instance("RSA"); key. Gen. initialize(1024); Key. Pair key = key. Gen. generate. Key. Pair(); System. out. println( "Finish generating RSA key" ); Signature sig = Signature. get. Instance("MD 5 With. RSA"); sig. init. Sign(key. get. Private()); sig. update(plain. Text); byte[] signature = sign(); System. out. println( sig. get. Provider(). get. Info() ); System. out. println( "n. Signature: " ); System. out. println( new String(signature, "UTF 8") ); System. out. println( "n. Start signature verification" ); sig. init. Verify(key. get. Public()); sig. update(plain. Text); try {if (sig. verify(signature)) {System. out. println( "Signature verified" ); } else System. out. println( "Signature failed" ); } catch (Signature. Exception se) { System. out. println( "Signature failed" ); }}} Példa 42

Fejlett Programozási Technológiák 2. Digitális igazolványok n Hitelesító Hatóság - certificate authority (CA) ¨ Fejlett Programozási Technológiák 2. Digitális igazolványok n Hitelesító Hatóság - certificate authority (CA) ¨ Certificate n Revocation Lists (CRL) Típusok: ¨ X. 509 n Tárolás: ¨ Keystore 43

Fejlett Programozási Technológiák 2. Kulcstároló (Keystore) n n n n java. secutity keytool ->. Fejlett Programozási Technológiák 2. Kulcstároló (Keystore) n n n n java. secutity keytool ->. keystore A privát kulcsokat és a megfelelő bizonyítványokat tároljuk benne Jelszóval van titkosítva (Java Key Store) Minden kulcs külön jelszóval titkosítható Hash-el van védve a változtatástól Természetesen ez is bővíthető (pl. : adatbázist akarunk használni fájl helyett) 44

Fejlett Programozási. Settingsbilickiv. INFORM>keytool -genkey -v -alias Vili -keyalg C: Documents and Technológiák 2. Fejlett Programozási. Settingsbilickiv. INFORM>keytool -genkey -v -alias Vili -keyalg C: Documents and Technológiák 2. RSA Enter keystore password: jelszó What is your first and last name? [Unknown]: Vilmos Bilicki What is the name of your organizational unit? [Unknown]: SZTE What is the name of your organization? [Unknown]: Inf. TSZCS What is the name of your City or Locality? [Unknown]: Szeged What is the name of your State or Province? [Unknown]: Csongrád What is the two-letter country code for this unit? [Unknown]: HU Is CN=Vilmos Bilicki, OU=SZTE, O=Inf. TSZCS, L=Szeged, ST=Csongrád, C=HU correct? [no]: yes Használata Generating 1á 024 bit RSA key pair and self-signed certificate (MD 5 With. RSA) for: CN=Vilmos Bilicki, OU=SZTE, O=Inf. TSZCS, L=Szeged, ST=Csongrád, C=HU Enter key password for (RETURN if same as keystore password): jelszó 45

Fejlett Programozási Technológiák 2. cacerts Rendszer szintű tároló n A megbízható CA bizonyítványok tárolója Fejlett Programozási Technológiák 2. cacerts Rendszer szintű tároló n A megbízható CA bizonyítványok tárolója n keytool -list -keystore cacerts n 46

Fejlett Programozási Technológiák 2. Certification Path API import java. security. *; import java. security. Fejlett Programozási Technológiák 2. Certification Path API import java. security. *; import java. security. cert. *; // Certificate. Factory for X. 509 Certificate. Factory cf =Certificate. Factory. get. Instance("X. 509"); // Obtain Cert. Path. Validator cpv = Cert. Path. Validator. get. Instance("PKIX"); // Set the Trust anchor Trust. Anchor anchor = new Trust. Anchor((X 509 Certificate)cf. get. Certificate("ca"), null); PKIXParameters params = new PKIXParameters(Collections. singleton(anchor)); // Revocation as false params. set. Revocation. Enabled(false); // Validate PKIXCert. Path. Validator. Result result = (PKIXCert. Path. Validator. Result) cpv. validate(cp, params); 47

Fejlett Programozási Technológiák 2. JSE n Java Platform Security Extension (JSE) ¨ Java Secure Fejlett Programozási Technológiák 2. JSE n Java Platform Security Extension (JSE) ¨ Java Secure Socket Extension (JSSE) ¨ Java Authorization and Authentication Service API (JAAS) ¨ Java Crypography Extenision (JCE) 48

Fejlett Programozási Technológiák 2. Java Secure Socket Extension Jáva SSL megvalósítás n Vég-vég biztonság Fejlett Programozási Technológiák 2. Java Secure Socket Extension Jáva SSL megvalósítás n Vég-vég biztonság n import java. io. *; import java. net. *; import javax. net. ssl. *; SSLServer. Socket. Factory sslsrvfact = SSLServer. Socket. Factory. get. Default(); SSLServer. Socket s = sslsrvfact. create. Server. Socket(port); s. accept(); import java. io. *; import java. net. *; import javax. net. ssl. *; SSLSocket. Factory sslfact = SSLSocket. Factory. get. Default(); SSLSocket s = sslfact. create. Socket(host, port); 49

Fejlett Programozási Technológiák 2. import java. io. *; import java. net. *; import javax. Fejlett Programozási Technológiák 2. import java. io. *; import java. net. *; import javax. net. ssl. *; public class HTTPSServer. Example { public static void main(String[] args) throws IOException { SSLServer. Socket. Factory sslsf = (SSLServer. Socket. Factory)SSLServer. Socket. Factory. get. Default(); Server. Socket ss = sslsf. create. Server. Socket(8080); while (true) { try { Socket s = ss. accept(); System. out. println( "Client connection made" ); Buffered. Reader in = new Buffered. Reader(new Input. Stream. Reader(s. get. Input. Stream())); System. out. println(in. read. Line()); Print. Writer out = new Print. Writer( s. get. Output. Stream() ); out. println("HTTPS Server Example" + "Hello World!n"); out. close(); java -Djavax. net. ssl. key. Store=ssl. Key. Store s. close(); -Djavax. net. ssl. key. Store. Password=password } catch (Exception e) { HTTPSServer. Example e. print. Stack. Trace(); }}}} 50

Fejlett Programozási Technológiák 2. JAAS n n Java Authentication and Authorization Service (JAAS) API Fejlett Programozási Technológiák 2. JAAS n n Java Authentication and Authorization Service (JAAS) API Felhasználó azonosítás (eddig csak kód alapú azonosítás volt) Mit tud ¨ Mivel rendelkezik ¨ Kicsoda ¨ n n n Az azonosítás választható (alakítható) Plugable Authentication Modules (PAM) Engedélyezés: Deklaratív ¨ Progamból ¨ 51

Fejlett Programozási Technológiák 2. PAM SUN Solaris (Linux, …) n Szabványos azonosító környezet n Fejlett Programozási Technológiák 2. PAM SUN Solaris (Linux, …) n Szabványos azonosító környezet n Az aktuálisan használt eljárás használat, telepítés közben derül ki (administrator) n Login modulok n ¨ Válszthatóak ¨ Könnyen n bővíthetőek Login konfigurációs fájl 52

Fejlett Programozási Technológiák 2. Java 1. 4 login modulok n n n n com. Fejlett Programozási Technológiák 2. Java 1. 4 login modulok n n n n com. sun. security. auth. module. NTLogin. Module com. sun. security. auth. module. NTSystem com. sun. security. auth. module. Jndi. Login. Module com. sun. security. auth. module. Key. Store. Login. Module com. sun. security. auth. module. Krb 5 Login. Module com. sun. security. auth. module. Solaris. System com. sun. security. auth. module. Unix. Login. Module com. sun. security. auth. module. Unix. System 53

Fejlett Programozási Technológiák 2. JAAS elemei n Login Context ¨ Login. config n n Fejlett Programozási Technológiák 2. JAAS elemei n Login Context ¨ Login. config n n Login Module Subject ¨ Elemei: n Principal (Principal. Impl) n Credential ¨ Metódusai: n subject. get. Principals() n subject. get. Public. Credentials() n subject. get. Private. Credentials() n Access Controller ¨ Permission ¨ Jaas. policy objektum 54

Fejlett Programozási Technológiák 2. JAAS példa // Example Java 2 Security Policy Entry grant Fejlett Programozási Technológiák 2. JAAS példa // Example Java 2 Security Policy Entry grant Codebase "www. sun. com", Signedby "duke" { File. Permission "/cdrom/-", "read"; } // Example JAAS Security Policy Entry grant Codebase "www. sun. com", Signedby "duke", Principal com. sun. Principal "charlie" { File. Permission "/cdrom/charlie/-", "read"; } // Example login module configuration entry Login 2 { sample. Sample. Login. Module required; com. sun. security. auth. module. NTLogin. Module sufficient; com. foo. Smart. Card requisite debug=true; com. foo. Kerberos optional debug=true; }; import java. security. *; import javax. security. auth. *; //exts // Instantiate a login context Login. Context ctx = new Login. Context ("name", Callback. Handler); // Authenicate the subject ctx. login(); // Retrieve authenticated subject Subject sub = ctx. get. Subject(); // Enforce Access Controls Subject. do. As(sub, action); 55

Fejlett Programozási Technológiák 2. Példa 56 Fejlett Programozási Technológiák 2. Példa 56

Fejlett Programozási Technológiák 2. Principal. Impl import java. io. Serializable; import java. security. Principal; Fejlett Programozási Technológiák 2. Principal. Impl import java. io. Serializable; import java. security. Principal; public class Principal. Impl implements Principal, Serializable { private String name; public Principal. Impl(String n) {name = n; } public boolean equals(Object obj) { if (!(obj instanceof Principal. Impl)) {return false; } Principal. Impl pobj = (Principal. Impl)obj; if (name. equals(pobj. get. Name())) {return true; }return false; } public String get. Name() {return name; } public int hash. Code() {return name. hash. Code(); } public String to. String() {return get. Name(); } } 57

Fejlett Programozási Technológiák 2. Login konfiguráció n n n A használt azonosítási eljárást nem Fejlett Programozási Technológiák 2. Login konfiguráció n n n A használt azonosítási eljárást nem a program írásakor döntjük el Login. config Djava. security. auth. login. config==login. config == a rendszer fájlt lecseréli Login. Context ¨ required ¨ optional ¨ requisite ¨ sufficient JAASExample { Always. Login. Module required; Password. Login. Module optional; }; 58

Fejlett Programozási Technológiák 2. Login Context Java osztály n Login végrehajtás n Subject visszaadás Fejlett Programozási Technológiák 2. Login Context Java osztály n Login végrehajtás n Subject visszaadás n Konstruktora: n ¨ Login. Context("JAASExample", new. Username. Password. Callback. Handler()) n Fontosabb metódusai: ¨ login() ¨ get. Subject() ¨ logout() 59

Fejlett Programozási Technológiák 2. Callback handler Feladata a megfelelő információ beszerzése n javax. security. Fejlett Programozási Technológiák 2. Callback handler Feladata a megfelelő információ beszerzése n javax. security. auth. callback. Callback. Handler n Elemei: n ¨ Name. Callback ¨ Password. Callback ¨ Text. Input. Callback ¨ Text. Output. Callback ¨ Language. Callback ¨ Choice. Callback ¨ Confirmation. Callback 60

import Programozási Technológiák 2. Fejlett java. io. *; import java. security. *; import javax. import Programozási Technológiák 2. Fejlett java. io. *; import java. security. *; import javax. security. auth. callback. *; Username. Password. Callback. Handler implements Callback. Handler { public void handle(Callback[] callbacks) throws Unsupported. Callback. Exception, IOException { for(int i=0; i

Fejlett Programozási Technológiák 2. Login Modul n n n Login. Module interfész Két fázisú Fejlett Programozási Technológiák 2. Login Modul n n n Login. Module interfész Két fázisú elfogadás (two phase commit) Metódusai: ¨ initialize( subject, callback. Handler, shared. State, options) ¨ login() ¨ commit() ¨ abort() ¨ logout() 62

Fejlettclass Always. Login. Module implements Login. Module { public Programozási Technológiák 2. private Subject Fejlettclass Always. Login. Module implements Login. Module { public Programozási Technológiák 2. private Subject subject; private Principal principal; private Callback. Handler callback. Handler; private String username; private boolean login. Success; public void initialize(Subject sub, Callback. Handler cbh, Map shared. State, Map options) {subject = sub; callback. Handler = cbh; login. Success = false; } public boolean login() throws Login. Exception { if (callback. Handler == null) {throw new Login. Exception( "No Callback. Handler defined"); } Callback[] callbacks = new Callback[1]; callbacks[0] = new Name. Callback("Username"); try {System. out. println( "n. Always. Login. Module Login" ); callback. Handler. handle(callbacks); username = ((Name. Callback)callbacks[0]). get. Name(); } catch (IOException ioe) { throw new Login. Exception(ioe. to. String()); } catch (Unsupported. Callback. Exception uce) { throw new Login. Exception(uce. to. String()); } login. Success = true; return true; } public boolean commit() throws Login. Exception { if (login. Success == false) { System. out. println( "Commit: Always. Login. Module FAIL" ); return false; } if (!(subject. get. Principals(). contains(principal))) { subject. get. Principals(). add(principal); } System. out. println( "Commit: Always. Login. Module SUCCESS" ); return true; 63 }…

if (callback. Handler == Technológiák 2. Fejlett Programozásinull) {throw new Login. Exception( if (callback. Handler == Technológiák 2. Fejlett Programozásinull) {throw new Login. Exception("No Callback. Handler defined"); } Callback[] callbacks = new Callback[2]; callbacks[0] = new Name. Callback("Username"); callbacks[1] = new Password. Callback("Password", false); try { callback. Handler. handle(callbacks); username = ((Name. Callback)callbacks[0]). get. Name(); char[] temp = ((Password. Callback)callbacks[1]). get. Password(); password = new char[temp. length]; System. arraycopy(temp, 0, password, 0, temp. length); ((Password. Callback)callbacks[1]). clear. Password(); } catch (IOException ioe) {throw new Login. Exception(ioe. to. String()); } catch (Unsupported. Callback. Exception uce) {throw new Login. Exception(uce. to. String()); } if ( "joeuser". equals(username)) { if ( password. length == 5 && password[0] == 'j' && password[1] == 'o' && password[2] == 'e' && password[3] == 'p' && password[4] == 'w' ) { login. Success = true; clear. Password(); return true; }} else {login. Success = false; username = null; clear. Password(); throw new Failed. Login. Exception(); } 64

Fejlett Programozási Technológiák 2. Hozzáférési környezet Szálanként kezeljük a jogosultságot n A Subject kötése Fejlett Programozási Technológiák 2. Hozzáférési környezet Szálanként kezeljük a jogosultságot n A Subject kötése a környezethez: n ¨ Object do. As(Subject subject, Privileged. Action action) ¨ Object do. As. Privileged(Subject, Privileged. Action action, Access. Control. Context acc) n Deklaratív megoldás: ¨ Object do. As. Privileged(Subject, Privileged. Action action, null) 65

Fejlett Programozási Technológiák 2. Program modell/ Deklaratív modell class Payroll. Action implements Privileged. Action Fejlett Programozási Technológiák 2. Program modell/ Deklaratív modell class Payroll. Action implements Privileged. Action { Access. Control. Context context = Access. Controller. get. Context(); Subject subject = Subject. get. Subject(context ); if (subject == null ) {throw new Access. Control. Exception("Denied"); } Set principals = subject. get. Principals(); Iterator iterator = principals. iterator(); while (iterator. has. Next()) { Principal. Impl principal = (Principal. Impl)iterator. next(); if (principal. get. Name(). equals( "joeuser" )) {System. out. println("joeuser has Payroll accessn"); return new Integer(0); }}throw new Access. Control. Exception("Denied"); } class Personnel. Action implements Privileged. Action { public Object run() { Access. Controller. check. Permission(new Personnel. Permission("access")); System. out. println( "Subject has Personnel accessn"); return new Integer(0); }} 66

public Programozási Technológiák 2. Fejlettclass JAASExample { static Login. Context lc = null; public public Programozási Technológiák 2. Fejlettclass JAASExample { static Login. Context lc = null; public static void main( String[] args) { try { lc = new Login. Context("JAASExample", new Username. Password. Callback. Handler()); } catch (Login. Exception le) {System. out. println( "Login Context Creation Error" ); System. exit(1); } try {lc. login(); } catch (Login. Exception le) { System. exit(1); } try { Subject. do. As( lc. get. Subject(), new Payroll. Action() ); } catch (Access. Control. Exception e) {System. out. println( "Payroll Access DENIED" ); } try { Subject. do. As. Privileged( lc. get. Subject(), new Personnel. Action(), null ); } catch (Access. Control. Exception e) { System. out. println( "Personnel Access DENIED" ); } try { lc. logout(); } catch (Login. Exception le) { System. out. println( "Logout FAILED" ); System. exit(1); } java -Djava. security. manager System. exit(0); -Djava. security. auth. login. config==login. config } -Djava. security. policy==jaas. policy JAASExample } 67

Fejlett Programozási Technológiák 2. JGSS n GSS API (RFC 2853) 68 Fejlett Programozási Technológiák 2. JGSS n GSS API (RFC 2853) 68

Fejlett Programozási Technológiák 2. Áttekintés 69 Fejlett Programozási Technológiák 2. Áttekintés 69

Fejlett Programozási Technológiák 2. A mai előadás tartalma: n n Számítógépes biztonság Jáva és Fejlett Programozási Technológiák 2. A mai előadás tartalma: n n Számítógépes biztonság Jáva és a biztonság ¨ Biztonsági n architektúra Titkosító architektúra ¨ JCE ¨ JAAS ¨ JSSE ¨ GSSE 70

Fejlett Programozási Technológiák 2. A következő előadás tartalma n Java Servlet ¨ Servlet Interfész Fejlett Programozási Technológiák 2. A következő előadás tartalma n Java Servlet ¨ Servlet Interfész ¨ Servlet Context ¨ Request ¨ Response ¨ Filter ¨ Session ¨ Web Application 71