Fejlett Programoz ási Technikák 2.

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

description

Fejlett Programoz ási Technikák 2. 15 / 8. Az előző előadás tartalma:. Java Applet Felépítése Tulajdonságai Paraméterátadás JDBC Típusai Kapcsolat típusok Statement objektumok RecordSet Tranzakciók. Források. http://www.javaworld.com/javaworld/jw-04-2000/jw-0428-security.html - PowerPoint PPT Presentation

Transcript of Fejlett Programoz ási Technikák 2.

Page 1: Fejlett Programoz ási Technikák 2.

1

Fejlett Programozási Technikák 2.

15/8

Page 2: Fejlett Programoz ási Technikák 2.

2

Fejlett Programozási Technológiák 2.

Az előző előadás tartalma: Java Applet

Felépítése Tulajdonságai Paraméterátadás

JDBC Típusai Kapcsolat típusok Statement objektumok RecordSet Tranzakciók

Page 3: Fejlett Programoz ási Technikák 2.

3

Fejlett Programozási Technológiák 2.

Források

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/chap14/index.html http://www.cab.u-szeged.hu/WWW/java/kiss/security.html#ch3.1 http://www2.tw.ibm.com/developerWorks/tutorial/pdf/j-sec1-a4.pdf http://www2.tw.ibm.com/developerWorks/tutorial/pdf/j-sec2-a4.pdf

Page 4: Fejlett Programoz ási Technikák 2.

4

Fejlett Programozási Technológiák 2.

A mai előadás tartalma: Számítógépes biztonság Jáva és a biztonság

Biztonsági architektúra

Titkosító architektúra JCE JAAS JSSE GSSE

Page 5: Fejlett Programoz ási Technikák 2.

5

Fejlett Programozási Technológiák 2.

Számítógépes biztonság 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.

Page 6: Fejlett Programoz ási Technikák 2.

6

Fejlett Programozási Technológiák 2.

Támadás típusok Kategóriák:

Titkosság elleni támadás Integritás elleni támadásRendelkezésre állás elleni támadás

Gyakori támadás fajták:Nyers erő (brute force)Trójai (trojan horse)Ember középen (man-in-the-middle)

Page 7: Fejlett Programoz ási Technikák 2.

7

Fejlett Programozási Technológiák 2.

Feltörhetőség 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

Page 8: Fejlett Programoz ási Technikák 2.

8

Fejlett Programozási Technológiák 2.

Jáva támadások1. Trükkös kód2. Régi, hack-elt javac3. Class fájlok átírása (CGI

jogosultságok)4. Programok válogatása5. Kapcsolat eltérítése

(spoofing) (aláírt applet)6. JVM bug

Page 9: Fejlett Programoz ási Technikák 2.

9

Fejlett Programozási Technológiák 2.

Áttekintés

Page 10: Fejlett Programoz ási Technikák 2.

10

Fejlett Programozási Technológiák 2.

Jáva és a biztonság/1 Nyílt:

A fordító és a virtuális gép forrása is hozzáférhető, megvizsgálható Jáva nyelv:

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

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)

Page 11: Fejlett Programoz ási Technikák 2.

11

Fejlett Programozási Technológiák 2.

Jáva és a biztonság/2 Futtató környezet:

Osztály betöltő Bájt kód ellenőrző

Verzió problémák, Bináris kompatibilitás

Gonosz másik oldal (trükkös fordító, …)

Biztonsági Menedzser: Az erőforrások elérésének ellenőrzése Kód alapú Felhasználó alapú

Szemét gyűjtő Keretrendszerek, API-k

Page 12: Fejlett Programoz ási Technikák 2.

12

Fejlett Programozási Technológiák 2.

Osztály betöltő 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…)

Feladatai: Az osztály fájlok megtalálása (megfelelő sorrendben, biztonsági okokból)

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 (URLClassLoader) Megpróbálja letölteni a webszerverről (Bönégsző specifikus class loader,

vagy URLClassLoader) 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

Page 13: Fejlett Programoz ási Technikák 2.

13

Fejlett Programozási Technológiák 2.

Bájt kód ellenőrző Class file verifier Az alap Java osztályokat nem bántja (esetenként a helyi lemezen lévő

fájlokat sem) Problémák:

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

Page 14: Fejlett Programoz ási Technikák 2.

14

Fejlett Programozási Technológiák 2.

Példa

import java.awt.*;import java.applet.*;public class TestVerify 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.drawString("3 + 4 = " + add(), 10, 20);}}

Compiled from TestVerify.javapublic class TestVerify extends java.applet.Applet {public TestVerify();static int add();public static void main(java.lang.String[]);public void paint(java.awt.Graphics);}Method TestVerify()0 aload_01 invokespecial #9 <Method java.applet.Applet()>4 returnMethod int add()0 iconst_31 istore_02 iconst_43 istore_14 iload_05 iload_16 iadd7 ireturn

Exception in thread "main" java.lang.VerifyError: (class: TestVerify,method: add signature: ()I) Accessing value from uninitialized register 1

Page 15: Fejlett Programoz ási Technikák 2.

15

Fejlett Programozási Technológiák 2.

Osztályállomány szintaktikus ellenőrzése

ClassFile { u4 magic; (0xCAFEBABE) u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }

Aláírás ellenőrzés A struktúrák hosszának ellenőrzése Constant pool ellenőrzése

Page 16: Fejlett Programoz ási Technikák 2.

16

Fejlett Programozási Technológiák 2.

Osztályállomány összefüggéseinek ellenőrzése

Olyan ellenőrizések melyeket a kód értelmezése nélkül meg lehet tenni

Final Superclass Konstans Tároló

Page 17: Fejlett Programoz ási Technikák 2.

17

Fejlett Programozási Technológiák 2.

Az utasításfolyam ellenőrzése 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

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

Page 18: Fejlett Programoz ási Technikák 2.

18

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 Futás közben ellenőrzi a fentieket amikor

betöltődnek az osztályok

Page 19: Fejlett Programoz ási Technikák 2.

19

Fejlett Programozási Technológiák 2.

Biztonsági Menedzser

Futás idejű biztonsági ellenőrzés Java2 előtt egy absztrakt osztály volt

(főleg a böngészők implementálták)Homokozó

java.lang.SecurityManagerBiztonsági rendszabály alapú (policy based)

Természetesen ez is bővíthető

Page 20: Fejlett Programoz ási Technikák 2.

20

Fejlett Programozási Technológiák 2.

Hely függő (homokozó modell) Java 1.0 Nagyon szigorú

a távoli kódokkal Nincs kivétel

Page 21: Fejlett Programoz ási Technikák 2.

21

Fejlett Programozási Technológiák 2.

Kód alapú (digitálisan aláírt)

Java 1.1 A digitálisan aláírt kód

alapján eldönthetjük, hogy milyen jogosult-sággal akarjuk futtatni

Probléma: Érdekes játék, háttérben a bankkártya adatokat

Page 22: Fejlett Programoz ási Technikák 2.

22

Fejlett Programozási Technológiák 2.

Finomhangolás

Java2 Aláírás/URL alapú Távoli és helyi kódra is

vonatkozhat Policy fájl Adott jogosultság adott

kódrésznek adott erő-forráshoz

Page 23: Fejlett Programoz ási Technikák 2.

23

Fejlett Programozási Technológiák 2.

Védelmi tartomány

Rendszer Tartomány Alkalmazás tartományok

PrincipalPolicy fájlgrant signedBy "sysadmin", codeBase "file:/home/sysadmin/*" {

permission java.security.SecurityPermission "Security.insertProvider.*";

permission java.security.SecurityPermission "Security.removeProvider.*";

permission java.security.SecurityPermission "Security.setProperty.*";

};

Page 24: Fejlett Programoz ási Technikák 2.

24

Fejlett Programozási Technológiák 2.

Lexikális szűkítés Csak az adott kódrésznek adunk jogosultságot Minden érzékeny kód egy helyre gyűjthető java.security.AccessControler.doPrivileged()

Page 25: Fejlett Programoz ási Technikák 2.

25

Fejlett Programozási Technológiák 2.

Futás idejű hozzáférés vezérlés I/O, … SecurityManager.checkPermission() 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 Használata:

java -Djava.security.manager HelloWorld java.lang.System

Page 26: Fejlett Programoz ási Technikák 2.

26

Fejlett Programozási Technológiák 2.

Áttekintés

Page 27: Fejlett Programoz ási Technikák 2.

27

Fejlett Programozási Technológiák 2.

Eszközök Jar Jarsigner Keytool

Keystore policytool

Page 28: Fejlett Programoz ási Technikák 2.

28

Fejlett Programozási Technológiák 2.

Kód biztonság Bájt kód

Sok információt tartalmaz Könnyű visszafejteni

Eszköz: Mocha, …

Algoritmus másolás Érzékeny információ (passwd, …) Biztonsági rendszer megismerése …

Page 29: Fejlett Programoz ási Technikák 2.

29

Fejlett Programozási Technológiák 2.

Megoldás Obfuscator

A változó, metódus neveket lecseréli a constant pool-ban Védett nevek használata (if, for, …)

Hosing Értelmetel kódokat szúr be (pl.: pop, push) Nagyban rontja a JVM JIT hatékonyságát

Írjunk olyan kódot melynél nem baj ha más is elolvassa

Page 30: Fejlett Programoz ási Technikák 2.

30

Fejlett Programozási Technológiák 2.

J2SE 1.5 biztonsági eszközök JCA/JCE JSSE Java CertPath JAAS/JGSS

Page 31: Fejlett Programoz ási Technikák 2.

31

Fejlett Programozási Technológiák 2.

JCA/JCE

JCA Titkosító

architektúra Alap titkosítás Export korlátozás

mentes Aláírások,

kivonat, ..

JCE Titkosító

architektúra bővítmény

Fejlett titkosítás Export korlátozás Titkosítók

Page 32: Fejlett Programoz ási Technikák 2.

32

Fejlett Programozási Technológiák 2.

Titkosító architektúra Titkosító eljárások:

Szimmetrikus kulcsú titkosítás (bulk encripiton) DES DEA RC4 AES

Aszimmetrikus kulcsú titkosítás (public key encripition) RSA

Kivonatolás MD5

Page 33: Fejlett Programoz ási Technikák 2.

33

Fejlett Programozási Technológiák 2.

Kivonatolás Kulcs nélkül

Algoritmusok: MD2, MD5 (128 bit) SHA-1 (160 bit) SHA-256,SHA-382, SHA-512

Használata:

MessageDigest.getInstance("MD5")

.update(plaintext)

.digest()

Kulcs használatával (MAC) Algoritmusok:

HMAC/SHA-1 HMAC/MD5

Használata:KeyGenerator.getInstance("HmacMD5"

).generateKey()Mac.getInstance("HmacMD5").init(MD5key).update(plaintext).doFinal()

Page 34: Fejlett Programoz ási Technikák 2.

34

Fejlett Programozási Technológiák 2.

Példa kivonatolóimport java.security.*;import javax.crypto.*;public class MessageDigestExample {public static void main (String[] args) throws Exception {if (args.length !=1) {System.err.println("Usage: java MessageDigestExample text");System.exit(1);}byte[] plainText = args[0].getBytes("UTF8");MessageDigest messageDigest = MessageDigest.getInstance("MD5");messageDigest.update( plainText);System.out.println( "\nDigest: " );System.out.println( new String( messageDigest.digest(), "UTF8") );}}

Page 35: Fejlett Programoz ási Technikák 2.

35

Fejlett Programozási Technológiák 2.

Példa MACimport java.security.*;import javax.crypto.*;public class MessageAuthenticationCodeExample {public static void main (String[] args) throws Exception {if (args.length !=1) {System.err.println("Usage: java MessageAuthenticationCodeExample

text");System.exit(1);}byte[] plainText = args[0].getBytes("UTF8");System.out.println( "\nStart generating key" );KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");SecretKey MD5key = keyGen.generateKey();System.out.println( "Finish generating key" );Mac mac = Mac.getInstance("HmacMD5");mac.init(MD5key);mac.update(plainText);System.out.println( "\n" + mac.getProvider().getInfo() );System.out.println( "\nMAC: " );System.out.println( new String( mac.doFinal(), "UTF8") );}}

Page 36: Fejlett Programoz ási Technikák 2.

36

Fejlett Programozási Technológiák 2.

Titkosítás Típusai:

Adatkezelés Blokk titkosító (block cipher)

64 bit Padding (No padding,PKCS5,OAEP, SSL3)

Bit titkosító (stream cipher)

Algoritmus: Nyilvános kulcsú Titkos kulcsú

Működési módok ECB (Electronic Code Book) CBC (Cipher Block Chaining) CFB (Cipher Feedback Mode) OFB (Output Feedback Mode) PCBC (Propagating Cipher Block Chaining)

Page 37: Fejlett Programoz ási Technikák 2.

37

Fejlett Programozási Technológiák 2.

Szimmetrikus titkosítás Algoritmusok:

DES (Data Encription Standard) – 54 bit TriplDES – 112 bit AES (Advanced Encription Standard) – 128,192,256 bit RC2,RC4,RC5 Blowfish – 32 - 448 bit PBE (Password Based Encryption)

Használatuk: KeyGenerator.getInstance("DES"), .init(56), .generateKey() Cipher.getInstance("DES/ECB/PKCS5Padding") .init(Cipher.ENCRYPT_MODE, key) .doFinal(plainText) .init(Cipher.DECRYPT_MODE, key): .doFinal(cipherText)

Page 38: Fejlett Programoz ási Technikák 2.

38

Fejlett Programozási Technológiák 2. import java.security.*;import javax.crypto.*;public class PrivateExample {public static void main (String[] args) throws Exception {if (args.length !=1) {System.err.println("Usage: java PrivateExample text");System.exit(1);}byte[] plainText = args[0].getBytes("UTF8");System.out.println( "\nStart generating DES key" );KeyGenerator keyGen = KeyGenerator.getInstance("DES");keyGen.init(56);Key key = keyGen.generateKey();System.out.println( "Finish generating DES key" );Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");System.out.println( "\n" + cipher.getProvider().getInfo() );System.out.println( "\nStart encryption" );cipher.init(Cipher.ENCRYPT_MODE, key);byte[] cipherText = cipher.doFinal(plainText);System.out.println( "Finish encryption: " );System.out.println( new String(cipherText, "UTF8") );System.out.println( "\nStart decryption" );cipher.init(Cipher.DECRYPT_MODE, key);byte[] newPlainText = cipher.doFinal(cipherText);System.out.println( "Finish decryption: " );System.out.println( new String(newPlainText, "UTF8") );}}

Page 39: Fejlett Programoz ási Technikák 2.

39

Fejlett Programozási Technológiák 2.

Aszimmetrikus titkosítás Tipikus kulcs hosszúság 1024 bit 100, 1000 –szer lassabb mint a szimmetrikus Algoritmusok:

RSA Diffie-Hellman (kulcs csere)

Használata: KeyPairGenerator.getInstance("RSA")

.initialize(1024) .generateKeyPair():

Cipher.getInstance("RSA/ECB/PKCS1Padding") .init(Cipher.ENCRYPT_MODE, key.getPublic()) .doFinal(plainText) .init(Cipher.DECRYPT_MODE, key.getPrivate()) .doFinal(cipherText)

Page 40: Fejlett Programoz ási Technikák 2.

40

Fejlett Programozási Technológiák 2. import java.security.*;import javax.crypto.*;public class PublicExample {public static void main (String[] args) throws Exception {if (args.length !=1) {System.err.println("Usage: java PublicExample text");System.exit(1);}byte[] plainText = args[0].getBytes("UTF8");System.out.println( "\nStart generating RSA key" );KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");keyGen.initialize(1024);KeyPair key = keyGen.generateKeyPair();System.out.println( "Finish generating RSA key" );Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");System.out.println( "\n" + cipher.getProvider().getInfo() );System.out.println( "\nStart encryption" );cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());byte[] cipherText = cipher.doFinal(plainText);System.out.println( "Finish encryption: " );System.out.println( new String(cipherText, "UTF8") );System.out.println( "\nStart decryption" );cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());byte[] newPlainText = cipher.doFinal(cipherText);System.out.println( "Finish decryption: " );System.out.println( new String(newPlainText, "UTF8") );}}

Page 41: Fejlett Programoz ási Technikák 2.

41

Fejlett Programozási Technológiák 2.

Digitális aláírások Tipikusan hash+asszimmetrikus titkosítás Módszerek:

Barkácsolós Egyszerű

Algoritmusok: MD2/RSA MD5/RSA SHA1/DSA SHA1/RSA

Használatuk: KeyPairGenerator.getInstance("RSA")

.initialize(1024) .generateKeyPair()

Cipher.getInstance("MD5WithRSA") .initSign(key.getPrivate()) .update(plainText) .sign() .initVerify(key.getPublic()) and .verify(signature):

Page 42: Fejlett Programoz ási Technikák 2.

42

Fejlett Programozási Technológiák 2.

Példaimport java.security.*;import javax.crypto.*;public class DigitalSignature2Example {public static void main (String[] args) throws Exception {if (args.length !=1) {System.err.println("Usage: java DigitalSignature1Example text");System.exit(1);}byte[] plainText = args[0].getBytes("UTF8");System.out.println( "\nStart generating RSA key" );KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");keyGen.initialize(1024);KeyPair key = keyGen.generateKeyPair();System.out.println( "Finish generating RSA key" );Signature sig = Signature.getInstance("MD5WithRSA");sig.initSign(key.getPrivate());sig.update(plainText);byte[] signature = sig.sign();System.out.println( sig.getProvider().getInfo() );System.out.println( "\nSignature:" );System.out.println( new String(signature, "UTF8") );System.out.println( "\nStart signature verification" );sig.initVerify(key.getPublic());sig.update(plainText);try {if (sig.verify(signature)) {System.out.println( "Signature verified" );} else

System.out.println( "Signature failed" );} catch (SignatureException se) {System.out.println( "Signature failed" );}}}

Page 43: Fejlett Programoz ási Technikák 2.

43

Fejlett Programozási Technológiák 2.

Digitális igazolványok Hitelesító Hatóság - certificate authority (CA)

Certificate Revocation Lists (CRL)

Típusok:X.509

Tárolás:Keystore

Page 44: Fejlett Programoz ási Technikák 2.

44

Fejlett Programozási Technológiák 2.

Kulcstároló (Keystore) 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)

Page 45: Fejlett Programoz ási Technikák 2.

45

Fejlett Programozási Technológiák 2.

HasználataC:\Documents and Settings\bilickiv.INFORM>keytool -genkey -v -alias Vili -keyalg RSAEnter keystore password: jelszóWhat is your first and last name? [Unknown]: Vilmos BilickiWhat is the name of your organizational unit? [Unknown]: SZTEWhat is the name of your organization? [Unknown]: InfTSZCSWhat is the name of your City or Locality? [Unknown]: SzegedWhat is the name of your State or Province? [Unknown]: CsongrádWhat is the two-letter country code for this unit? [Unknown]: HUIs CN=Vilmos Bilicki, OU=SZTE, O=InfTSZCS, L=Szeged, ST=Csongrád, C=HU

correct? [no]: yes

Generating 1á024 bit RSA key pair and self-signed certificate (MD5WithRSA) for: CN=Vilmos Bilicki, OU=SZTE, O=InfTSZCS, L=Szeged, ST=Csongrád, C=HU

Enter key password for <Vili> (RETURN if same as keystore password): jelszó[Saving C:\Documents and Settings\bilickiv.INFORM\.keystore]

Page 46: Fejlett Programoz ási Technikák 2.

46

Fejlett Programozási Technológiák 2.

cacerts Rendszer szintű tároló A megbízható CA bizonyítványok tárolója keytool -list -keystore cacerts

Page 47: Fejlett Programoz ási Technikák 2.

47

Fejlett Programozási Technológiák 2.

Certification Path API

import java.security.*;import java.security.cert.*;// CertificateFactory for X.509CertificateFactory cf =CertificateFactory.getInstance("X.509");// Obtain CertPathValidator CertPathValidator cpv = CertPathValidator.getInstance("PKIX");

// Set the Trust anchorTrustAnchor anchor = new TrustAnchor((X509Certificate)cf.getCertificate("ca"),null);PKIXParameters params = new PKIXParameters(Collections.singleton(anchor));// Revocation as falseparams.setRevocationEnabled(false);// ValidatePKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)cpv.validate(cp, params);

Page 48: Fejlett Programoz ási Technikák 2.

48

Fejlett Programozási Technológiák 2.

JSE Java Platform Security Extension (JSE)

Java Secure Socket Extension (JSSE)Java Authorization and Authentication Service API

(JAAS)Java Crypography Extenision (JCE)

Page 49: Fejlett Programoz ási Technikák 2.

49

Fejlett Programozási Technológiák 2.

Java Secure Socket Extension

Jáva SSL megvalósítás Vég-vég biztonságimport java.io.*;

import java.net.*;

import javax.net.ssl.*;

SSLServerSocketFactory sslsrvfact = SSLServerSocketFactory.getDefault();

SSLServerSocket s = sslsrvfact.createServerSocket(port);

s.accept(); import java.io.*;

import java.net.*;

import javax.net.ssl.*;

SSLSocketFactory sslfact = SSLSocketFactory.getDefault();

SSLSocket s = sslfact.createSocket(host, port);

Page 50: Fejlett Programoz ási Technikák 2.

50

Fejlett Programozási Technológiák 2. import java.io.*;import java.net.*;import javax.net.ssl.*;public class HTTPSServerExample {public static void main(String[] args) throws IOException {SSLServerSocketFactory sslsf =

(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();ServerSocket ss = sslsf.createServerSocket(8080);while (true) {try {Socket s = ss.accept();System.out.println( "Client connection made" );BufferedReader in = new BufferedReader(new

InputStreamReader(s.getInputStream()));System.out.println(in.readLine());PrintWriter out = new PrintWriter( s.getOutputStream() );out.println("<HTML><HEAD><TITLE>HTTPS Server Example</TITLE>" +"</HEAD><BODY><H1>Hello World!</H1></BODY></HTML>\n");out.close();s.close();} catch (Exception e) {e.printStackTrace();}}}}

java -Djavax.net.ssl.keyStore=sslKeyStore-Djavax.net.ssl.keyStorePassword=password HTTPSServerExample

Page 51: Fejlett Programoz ási Technikák 2.

51

Fejlett Programozási Technológiák 2.

JAAS

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

Az azonosítás választható (alakítható) Plugable Authentication Modules (PAM) Engedélyezés:

Deklaratív Progamból

Page 52: Fejlett Programoz ási Technikák 2.

52

Fejlett Programozási Technológiák 2.

PAM SUN Solaris (Linux, …) Szabványos azonosító környezet Az aktuálisan használt eljárás használat,

telepítés közben derül ki (administrator) Login modulok

VálszthatóakKönnyen bővíthetőek

Login konfigurációs fájl

Page 53: Fejlett Programoz ási Technikák 2.

53

Fejlett Programozási Technológiák 2.

Java 1.4 login modulok

com.sun.security.auth.module.NTLoginModule com.sun.security.auth.module.NTSystem com.sun.security.auth.module.JndiLoginModule com.sun.security.auth.module.KeyStoreLoginModule com.sun.security.auth.module.Krb5LoginModule com.sun.security.auth.module.SolarisSystem com.sun.security.auth.module.UnixLoginModule com.sun.security.auth.module.UnixSystem

Page 54: Fejlett Programoz ási Technikák 2.

54

Fejlett Programozási Technológiák 2.

JAAS elemei Login Context

Login.config Login Module Subject

Elemei: Principal (PrincipalImpl) Credential

Metódusai: subject.getPrincipals() subject.getPublicCredentials() subject.getPrivateCredentials()

Access Controller Permission objektum Jaas.policy

Page 55: Fejlett Programoz ási Technikák 2.

55

Fejlett Programozási Technológiák 2.

JAAS példa

// Example Java 2 Security Policy Entrygrant Codebase "www.sun.com", Signedby "duke" {FilePermission "/cdrom/-", "read"; }// Example JAAS Security Policy Entrygrant Codebase "www.sun.com", Signedby "duke", Principal com.sun.Principal "charlie" {FilePermission "/cdrom/charlie/-", "read"; }

// Example login module configuration entryLogin2 {sample.SampleLoginModule required;com.sun.security.auth.module.NTLoginModule sufficient;com.foo.SmartCard requisite debug=true;com.foo.Kerberos optional debug=true;};

import java.security.*; import javax.security.auth.*; //exts// Instantiate a login contextLoginContext ctx = new LoginContext ("name", CallbackHandler);// Authenicate the subjectctx.login();// Retrieve authenticated subjectSubject sub = ctx.getSubject();// Enforce Access ControlsSubject.doAs(sub, action);

Page 56: Fejlett Programoz ási Technikák 2.

56

Fejlett Programozási Technológiák 2.

Példa

Page 57: Fejlett Programoz ási Technikák 2.

57

Fejlett Programozási Technológiák 2.

PrincipalImplimport java.io.Serializable;import java.security.Principal;public class PrincipalImpl implements Principal, Serializable {private String name;public PrincipalImpl(String n) {name = n;}public boolean equals(Object obj) {if (!(obj instanceof PrincipalImpl)) {return false;}PrincipalImpl pobj = (PrincipalImpl)obj;if (name.equals(pobj.getName())) {return true;}return false;}public String getName() {return name;}public int hashCode() {return name.hashCode();}public String toString() {return getName();}}

Page 58: Fejlett Programoz ási Technikák 2.

58

Fejlett Programozási Technológiák 2.

Login konfiguráció

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 LoginContext

required optional requisite sufficient

JAASExample {AlwaysLoginModule required;PasswordLoginModule optional;};

Page 59: Fejlett Programoz ási Technikák 2.

59

Fejlett Programozási Technológiák 2.

Login Context Java osztály Login végrehajtás Subject visszaadás Konstruktora:

LoginContext("JAASExample", newUsernamePasswordCallbackHandler())

Fontosabb metódusai: login()getSubject() logout()

Page 60: Fejlett Programoz ási Technikák 2.

60

Fejlett Programozási Technológiák 2.

Callback handler Feladata a megfelelő információ beszerzése javax.security.auth.callback.CallbackHandler Elemei:

NameCallbackPasswordCallbackTextInputCallbackTextOutputCallbackLanguageCallbackChoiceCallbackConfirmationCallback

Page 61: Fejlett Programoz ási Technikák 2.

61

Fejlett Programozási Technológiák 2. import java.io.*;import java.security.*;import javax.security.auth.*;import javax.security.auth.callback.*;UsernamePasswordCallbackHandler implements CallbackHandler {public void handle(Callback[] callbacks) throwsUnsupportedCallbackException, IOException {for(int i=0;i<callbacks.length;i++) {Callback cb = callbacks[i];if (cb instanceof NameCallback) {NameCallback nameCallback = (NameCallback)cb;System.out.print( nameCallback.getPrompt() + "? ");System.out.flush();String username = new BufferedReader(new InputStreamReader(System.in)).readLine();nameCallback.setName(username);} else if (cb instanceof PasswordCallback) {PasswordCallback passwordCallback = (PasswordCallback)cb;System.out.print( passwordCallback.getPrompt() + "? ");System.out.flush();String password = new BufferedReader(new InputStreamReader(System.in)).readLine();passwordCallback.setPassword(password.toCharArray());password = null;} else {throw new UnsupportedCallbackException(cb, "UnsupportedCallback Type");}}}}

Page 62: Fejlett Programoz ási Technikák 2.

62

Fejlett Programozási Technológiák 2.

Login Modul LoginModule interfész Két fázisú elfogadás (two phase commit) Metódusai:

initialize( subject, callbackHandler, sharedState, options) login() commit() abort() logout()

Page 63: Fejlett Programoz ási Technikák 2.

63

Fejlett Programozási Technológiák 2. public class AlwaysLoginModule implements LoginModule {private Subject subject;private Principal principal;private CallbackHandler callbackHandler;private String username;private boolean loginSuccess;public void initialize(Subject sub, CallbackHandler cbh,Map sharedState, Map options) {subject = sub;callbackHandler = cbh;loginSuccess = false;}public boolean login() throws LoginException {if (callbackHandler == null) {throw new LoginException( "No CallbackHandler defined");}Callback[] callbacks = new Callback[1];callbacks[0] = new NameCallback("Username");try {System.out.println( "\nAlwaysLoginModule Login" );callbackHandler.handle(callbacks);username = ((NameCallback)callbacks[0]).getName();} catch (IOException ioe) {throw new LoginException(ioe.toString());} catch (UnsupportedCallbackException uce) {throw new LoginException(uce.toString());}loginSuccess = true;return true;}public boolean commit() throws LoginException {if (loginSuccess == false) {System.out.println( "Commit: AlwaysLoginModule FAIL" );return false;}if (!(subject.getPrincipals().contains(principal))) {subject.getPrincipals().add(principal);}System.out.println( "Commit: AlwaysLoginModule SUCCESS" );return true;}…

Page 64: Fejlett Programoz ási Technikák 2.

64

Fejlett Programozási Technológiák 2. if (callbackHandler == null) {throw new LoginException("No CallbackHandler defined");}Callback[] callbacks = new Callback[2];callbacks[0] = new NameCallback("Username");callbacks[1] = new PasswordCallback("Password", false);try {callbackHandler.handle(callbacks);username = ((NameCallback)callbacks[0]).getName();char[] temp = ((PasswordCallback)callbacks[1]).getPassword();password = new char[temp.length];System.arraycopy(temp, 0, password, 0, temp.length);((PasswordCallback)callbacks[1]).clearPassword();} catch (IOException ioe) {throw new LoginException(ioe.toString());} catch (UnsupportedCallbackException uce) {throw new LoginException(uce.toString());}if ( "joeuser".equals(username)) {if ( password.length == 5 &&password[0] == 'j' &&password[1] == 'o' &&password[2] == 'e' &&password[3] == 'p' &&password[4] == 'w' ) {loginSuccess = true;clearPassword();return true;}} else {loginSuccess = false;username = null;clearPassword();throw new FailedLoginException();}

Page 65: Fejlett Programoz ási Technikák 2.

65

Fejlett Programozási Technológiák 2.

Hozzáférési környezet Szálanként kezeljük a jogosultságot A Subject kötése a környezethez:

Object doAs(Subject subject,PrivilegedAction action)

Object doAsPrivileged(Subject, PrivilegedAction action, AccessControlContext acc)

Deklaratív megoldás:Object doAsPrivileged(Subject, PrivilegedAction

action, null)

Page 66: Fejlett Programoz ási Technikák 2.

66

Fejlett Programozási Technológiák 2.

Program modell/ Deklaratív modell

class PayrollAction implements PrivilegedAction {AccessControlContext context = AccessController.getContext();Subject subject = Subject.getSubject(context );if (subject == null ) {throw new AccessControlException("Denied");}Set principals = subject.getPrincipals();Iterator iterator = principals.iterator();while (iterator.hasNext()) {PrincipalImpl principal = (PrincipalImpl)iterator.next();if (principal.getName().equals( "joeuser" )) {System.out.println("joeuser has Payroll access\n");return new Integer(0);}}throw new AccessControlException("Denied");}

class PersonnelAction implements PrivilegedAction {public Object run() {AccessController.checkPermission(new PersonnelPermission("access"));System.out.println( "Subject has Personnel access\n");return new Integer(0);}}

Page 67: Fejlett Programoz ási Technikák 2.

67

Fejlett Programozási Technológiák 2. public class JAASExample {static LoginContext lc = null;public static void main( String[] args) {try {lc = new LoginContext("JAASExample",new UsernamePasswordCallbackHandler());} catch (LoginException le) {System.out.println( "Login Context Creation Error" );System.exit(1);}try {lc.login();} catch (LoginException le) {System.exit(1);}try {Subject.doAs( lc.getSubject(), new PayrollAction() );} catch (AccessControlException e) {System.out.println( "Payroll Access DENIED" );}try {Subject.doAsPrivileged( lc.getSubject(), new PersonnelAction(), null );} catch (AccessControlException e) {System.out.println( "Personnel Access DENIED" );}try {lc.logout();} catch (LoginException le) {System.out.println( "Logout FAILED" );System.exit(1);}System.exit(0);}}

java -Djava.security.manager-Djava.security.auth.login.config==login.config-Djava.security.policy==jaas.policy JAASExample

Page 68: Fejlett Programoz ási Technikák 2.

68

Fejlett Programozási Technológiák 2.

JGSS GSS API (RFC2853)

Page 69: Fejlett Programoz ási Technikák 2.

69

Fejlett Programozási Technológiák 2.

Áttekintés

Page 70: Fejlett Programoz ási Technikák 2.

70

Fejlett Programozási Technológiák 2.

A mai előadás tartalma: Számítógépes biztonság Jáva és a biztonság

Biztonsági architektúra

Titkosító architektúra JCE JAAS JSSE GSSE

Page 71: Fejlett Programoz ási Technikák 2.

71

Fejlett Programozási Technológiák 2.

A következő előadás tartalma Java Servlet

Servlet InterfészServlet ContextRequestResponseFilterSessionWeb Application