Fejlett Programozsi Technikk 2 158 1 Fejlett Programozsi

  • Slides: 71
Download presentation
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 "main" java. lang. Verify. Error: (class:

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 <Method java. applet. Applet()> 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 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 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 Programozási java. security. *; Technológiák 2. Fejlett import javax. crypto. *; public class

import Programozási java. security. *; Technológiák 2. Fejlett 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 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 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 Technológiák 2. C: Documents and Settingsbilickiv. INFORM>keytool -genkey -v -alias Vili -keyalg

Fejlett Programozási Technológiák 2. C: Documents and Settingsbilickiv. INFORM>keytool -genkey -v -alias Vili -keyalg 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 <Vili> (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 import. Programozási java. io. *; Technológiák 2. import java. net. *; import javax.

Fejlett import. Programozási java. io. *; Technológiák 2. 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("<HTML><HEAD><TITLE>HTTPS Server Example</TITLE>" + "</HEAD><BODY><H 1>Hello World!</H 1></BODY></HTML>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 java. io. *; Fejlett Programozási Technológiák 2. import java. security. *; import javax.

import java. io. *; Fejlett Programozási Technológiák 2. 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<callbacks. length; i++) { Callback cb = callbacks[i]; if (cb instanceof Name. Callback) { Name. Callback name. Callback = (Name. Callback)cb; System. out. print( name. Callback. get. Prompt() + "? "); System. out. flush(); String username = new Buffered. Reader( new Input. Stream. Reader(System. in)). read. Line(); name. Callback. set. Name(username); } else if (cb instanceof Password. Callback) { Password. Callback password. Callback = (Password. Callback)cb; System. out. print( password. Callback. get. Prompt() + "? "); System. out. flush(); String password = new Buffered. Reader( new Input. Stream. Reader(System. in)). read. Line(); password. Callback. set. Password(password. to. Char. Array()); password = null; } else { throw new Unsupported. Callback. Exception(cb, "Unsupported Callback Type"); }}}} 61

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

Fejlett Programozási Technológiák 2. Login. Module { public class Always. Login. Module implements private

Fejlett Programozási Technológiák 2. Login. Module { public class Always. Login. Module implements 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 == null) {throw new Login. Exception("No Callback. Handler defined"); } Fejlett

if (callback. Handler == null) {throw new Login. Exception("No Callback. Handler defined"); } Fejlett Programozási Technológiák 2. 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 class JAASExample { Fejlett Programozási Technológiák 2. static Login. Context lc = null;

public class JAASExample { Fejlett Programozási Technológiák 2. 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