1 / 65

Java Security Extensions

Java Security Extensions. M nožina balíkov v Jave, ktorá sa týka bezpečnosti:. b ezpečnosti prístupu k zdrojom výpočtových prostriedkov šifrovaním bezpečnosti v komunikácii. Zloženie:.

chaeli
Download Presentation

Java Security Extensions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java Security Extensions

  2. Množina balíkov v Jave, ktorá sa týka bezpečnosti: • bezpečnosti prístupu k zdrojom výpočtových prostriedkov • šifrovaním • bezpečnosti v komunikácii

  3. Zloženie: • Java Authentication and Authorization Service - bezpečnosť z hľadiska prístupu k zdrojom výpočtových prostriedkov • Java Cryptography Architecture a Java Cryptography Extension – šifrovanie • Java Secure Socket Extension - bezpečná internetová komunikácia.

  4. Java Authentication and Authorization Service (JAAS)

  5. Použitie: • Autentifikácia používateľov - na dôveryhodné a bezpečné určenie, kto práve vykonáva javovský kód • Autorizácia používateľov - na uistenie, že majú prístupové práva požadované na vykonávanie operácie

  6. Zloženie: • Spoločné triedy - Subject, Principal, Credential • Autentifikačné triedy a rozhrania - LoginContext, LoginModule, CallbackHandler, Callback • Autorizačné triedy - Policy, AuthPermission, PrivateCredentialPermission

  7. Architektúra autentifikácie Štruktúra priebehu autentifikácie: identifikácia používateľa autor autentifikačnej technológie prihlásenie konfiguračný login súbor požiadavka na autentifikáciu aplikácia s identifikovaným používateľom komunikácia s používateľom aplikácia autor aplikácie

  8. Autentifikácia v JAAS Použitie tried v architektúre autentifikácie: Subject Principal autor autentifikačnej technológie LoginModule konfiguračný login súbor LoginContext. login() aplikácia s objektom Subject určujúcim používateľa CallbackHandler aplikácia autor aplikácie

  9. Zakomponovanie JAAS do aplikácie Vytvorenie objektu triedy javax.security.auth.login.LoginContext import javax.security.auth.login.*; . . . LoginContext lc = new LoginContext(<config file entry name>, <CallbackHandler to be used for user interaction>); Príklad: import javax.security.auth.login.*; . . . LoginContext lc = new LoginContext("Sample", new MyCallbackHandler());

  10. Zakomponovanie JAAS do aplikácie (2) zavolanie metódy login() na našom vytvorenom LoginContexte Príklad: lc.login(); Ak po zavolaní tejto metódy nevzniknú žiadne výnimky LoginException alebo SecurityException (označujúce, že autentifikácia nebola úspešná), používateľ bol úspešne autentifikovaný.

  11. Zakomponovanie JAAS do aplikácie (3) Pre komunikáciu s používateľom slúži rozhranie CallbackHandler. Má jedinú metódu: void handle(Callback[] callbacks) throws java.io.IOException, UnsupportedCallbackException; Spracúvajú sa v nej informácie a požiadavky, ktoré vyžadujú interakciu s používateľom. Potrebné Callbacky sú naplnené autentifikačným procesom. Môže sa stať, že metóda nie je vôbec zavolaná (napríklad pri autentifikácii odtlačkom prsta). Potrebné informácie je možné nájsť v dokumentácii k prihlasovacej rutine.

  12. Zakomponovanie JAAS do aplikácie (4) Príklad CallbackHandlera: publicvoid handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof TextOutputCallback) { TextOutputCallback toc = (TextOutputCallback)callbacks[i]; switch (toc.getMessageType()) { //spracovanie podľa druhu informácie } } elseif (callbacks[i] instanceof NameCallback) { NameCallback nc = (NameCallback)callbacks[i]; System.err.print(nc.getPrompt()); System.err.flush(); nc.setName((new BufferedReader(new InputStreamReader(System.in))).readLine()); } elseif (callbacks[i] instanceof PasswordCallback) { PasswordCallback pc = (PasswordCallback)callbacks[i]; System.err.print(pc.getPrompt()); System.err.flush(); pc.setPassword(readPassword(System.in)); } else { thrownew UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); } } }

  13. Zakomponovanie JAAS do aplikácie (5) Vytvorenie konfiguračného login súboru a zapísanie vstupu: Sample { JAAS.module.SampleLoginModule required debug=true; }; Sample je reťazec, ktorý identifikuje vstup v tomto konfiguračnom súbore. Ten sme uvádzali pri vytváraní LoginContextu. Obsahom je trieda, ktorá uskutoční prihlasovanie, potom nutnosť úspešného prihlásenia v tejto triede a prípadne aj nejaké nastavenia, ktoré sa použijú v autentifikačnej technológii.

  14. Zakomponovanie JAAS do aplikácie (6) Možnosti pri uvádzaní, či daná autentifkácia je nevyhnutná: • required – nutné pre úspešné prihlásenie celého procesu • optional – voliteľné prihlásenie, nie je nevyhnutné na úspech celého prihlasovacieho procesu • requisite – potrebné, aby sa mohlo v procese pokračovať • sufficient – ak je úspešné neberie sa ohľad na úspech ďalšieho procesu

  15. Zakomponovanie JAAS do aplikácie (7) Výsledok celkovej autentifikácie na základe výsledkov čiastkových autentifikácií: Login2 Authentication Status SampleLoginModule required pass pass pass pass fail fail fail fail NTLoginModule sufficient pass fail fail fail pass fail fail fail SmartCard requisite * pass pass fail * pass pass fail Kerberos optional * pass fail * * pass fail * Overall Authentication pass pass pass fail fail fail fail fail

  16. Zakomponovanie JAAS do aplikácie (8) Po vytvorení aplikácie a jej skompilovaní, potrebujeme pri spúšťaní uviesť údaj o tom, ktorý súbor sa má používať ako konfiguračný login súbor. To sa urobí uvedením parametra interpreta, ako je uvedené nasledovne: java –Djava.security.auth.login.config=jaas_login_config_path MainClass Predpokladajme, že máme aplikáciu umiestnenú v balíčku JAAS, meno konfiguračného login súboru je sample_jaas.config a názov hlavnej triedy SampleAcn.class. Potom bude príkaz vyzerať nasledovne: java –Djava.security.auth.login.config=JAAS/sample_jaas.config JAAS.SampleAcn

  17. Policy súbor • Keďže už vieme identifikovať, ktorý používateľ aplikáciu práve používa, môžeme pristúpiť k druhej fáze a to určeniu, či má alebo nemá práva používať požadované prostriedky. Na určenie, ktorí používatelia majú aké práva sa používa tzv. policy súbor. • Prístupové práva sa v ňom určujú na základe: • umiestnenia kódu • podpisu aplikácie • používateľa aplikácie

  18. Policy súbor (2) Položky v policy súbore majú nasledovnú syntax: grant <signer(s) field>, <codeBase URL> <Principal field(s)> { permission perm_class_name "target_name", "action"; .... permission perm_class_name "target_name", "action"; }; Principal field má nasledovnú syntax: Principal Principal_class "principal_name"

  19. Policy súbor (3) Príklad položky v policy súbore: grant codebase "file:./SampleAction.jar„ Principal JAAS.principal.SamplePrincipal "testUser" { permission java.util.PropertyPermission "java.home", "read"; permission java.util.PropertyPermission "user.home", "read"; permission java.io.FilePermission "foo.txt", "read"; };

  20. Zakomponovanie autorizácie do aplikácie Používateľ je po autentifikácii v JAAS určený: • objektom triedy Subject, ktorý je jeden pre každého používateľa používajúceho systém • jedným alebo niekoľkými objektmi rozhrania Principal, ktoré nejakým spôsobom identifikujú používateľa (napríklad meno alebo identifikačné číslo). Týmito objektmi je naplnená trieda Subjekt

  21. Zakomponovanie autorizácie do aplikácie (2) Subjekt je jeden pre všetky LoginModuly, ktorými prebieha autentifikácia. Po úspešnej autentifikácii každý z LoginModulov naplní tento Subjekt objektmi rozhrania Principal, napríklad cestou, ako je uvedené na príklade: userPrincipal = new SamplePrincipal(username); if (!subject.getPrincipals().contains(userPrincipal)) subject.getPrincipals().add(userPrincipal);

  22. Zakomponovanie autorizácie do aplikácie (3) Keďže máme úspešne autorizovaného používateľa, môžeme spustiť určitý kód, ktorého vykonávanie bude ním označené (teda kód bude spúšťaný konkrétnym používateľom). Metódy, ktoré umožňujú spúšťať kód identifikovaný daným používateľom: • Subject.doAs() • Subject.doAsPrivileged() Subject mySubject = lc.getSubject(); PrivilegedAction action = new SampleAction(); Subject.doAsPrivileged(mySubject, action, null);

  23. Zakomponovanie autorizácie do aplikácie (3) Pre overenie funčnosti naše aplikácie potrebujeme mať zavedený SecurityManager, ktorý bude kontrolovať, či sú splnené požiadavky uvedené v policy súbore. Pre aplikáciu je to možné urobiť nasledovne: java -Djava.security.manager -Djava.security.policy=JAAS/sampleazn.policy JAAS.SampleAcn -Djava.security.auth.login.config=JAAS/sample_acn.config

  24. Java Cryptography Architecture (JCA)

  25. Hlavné princípy: • algoritmická nezávislosť – na základe definovania šifrovacích rutín je možné použiť rôzne algoritmy rovnakým spôsobom • implementačná nezávislosť – tie isté algoritmy môžu byť implementované rôznymi autormi (poskytovateľmi) a používateľ má možnosť vybrať si, ktorého použije

  26. Postup pri určovaní konkrétnej implementácie algortimu • Predpokladajme, že máme nainštalovaných dvoch poskytovateľov PROVIDER_1 a PROVIDER_2. Predpokladajme, že: • PROVIDER_1 implementuje SHA1withDSA, SHA-1, MD5, DES a DES3 PROVIDER_1 má prioritu 1 (najvyššia priorita) • PROVIDER_2 implementuje SHA1withDSA, MD5withRSA, MD2withRSA, MD2, MD5, RC4, RC5, DES a RSA • PROVIDER_2 má prioritu 2

  27. Postup pri určovaní konkrétnej implementácie algortimu (2) • Pozrime sa na štyri scenáre: • Ak hľadáme implementáciu MD5. Obidvaja poskytovatelia implementujú takúto službu. Bude použitý PROVIDER_1 nakoľko má najvyššiu prioritu a je prehľadaný ako prvý • Ak hľadáme implementáciu MD5withRSA algoritmus podpisu, je prehľadaný PROVIDER_1. Implementácia nie je nájdená, preto sa prehľadá PROVIDER_2. Nakoľko tento danú službu implementuje, je preto použitý • Predpokladajme, že hľadáme algoritmus podpisu SHAwithRSA. Nakoľko žiadny poskytovateľ takúto službu neimplementuje, je vyhodená výnimka NoSuchAlgorithmException • Ak hľadáme implementáciu MD5, ale uvedieme, že chceme použiť PROVIDER_2, potom, ak je tento poskytovateľ nainštalovaný a implementuje danú službu, potom je použitý. Inak je vyhodená výnimka NoSuchProviderException alebo NoSuchAlgorithmException

  28. Rutinné triedy a algoritmy • MessageDigest • Signature • KeyPairGenerator • KeyFactory • CertificateFactory • KeyStore • AlgorithmParameters • AlgorithmParameterGenerator • SecureRandom • Vo verzii Javy 1.4. boli pridané nasledovné rutiny • CertPathBuilder • CertPathValidator • CertStore

  29. Vytváranie objektov rutín Vytváranie objektov všetkých rutín prebieha cez nasledovné statické metódy, ktoré obsahuje každá rutina: • getInstance(String algorithm) • getInstance(String algoritm, String provider) • getInstance(String algorithm, Provider provider)

  30. MessageDigest Trieda implementuje kryptograficky bezpečný výber zo správy. Reprezentuje tzv. hashovacie kryptovanie, keď z ľubovoľne dlhej správy vytvorí reťazec konštantnej dĺžky, z ktorého sa nedá odvodiť pôvodná správa a mal by byť pre každú správu iný. MessageDigest sha = MessageDigest.getInstance("SHA-1"); sha.update(i1); sha.update(i2); sha.update(i3); byte[] hash = sha.digest();

  31. Signature Trieda implementuje funkcionalitu spojenú s digitálnymi podpismi. Umožňuje podpisovanie správ a taktiež kontrolu správnosti podpisu (verifikáciu). Signature dsa = Signature.getInstance("SHA1withDSA"); PrivateKey priv = pair.getPrivate(); dsa.initSign(priv); dsa.update(data); byte[] sig = dsa.sign(); Signature dsa = Signature.getInstance("SHA1withDSA"); PublicKey pub = pair.getPublic(); dsa.initVerify(pub); dsa.update(data); boolean verifies = dsa.verify(sig);

  32. AlgorithmParameters, AlgorithmParameterSpec, AlgorithmParameterGenerator Tieto triedy a rozhrania slúžia na reprezentáciu parametrov jednotlivých algoritmov a na ich generovanie. Reprezentujú parametre buď v nepriehľadnej forme, v ktorej je možné k parametrom pristupovať len ako k celku (AlgorithmParameters) alebo v transparentnej forme, v ktorej je možné ku každému parametru zvlášť. Trieda AlgorithmParameterGenerator slúži na generovanie týchto parametrov buď nezávisle na algoritme (napríklad zadaním veľkosti kódovacej postupnosti a generátora náhodných čísel) alebo priamo nastaveniami pre konkrétny algoritmus (nastavenie dopĺňania prázdnych miest a pod.) AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance("DSA"); AlgorithmParameters ap = apg.generateParameters(); AlgorithmParameterSpec aps = ap.getParameterSpec(DSAParameterSpec.class); ((DSAParameterSpec)aps).getP();

  33. Key, KeySpec, KeyFactory Key je rozhranie, ktoré zastrešuje všetky triedy, ktoré reprezentujú nepriehľadný kľúč (nemáme prístup k materiálu z ktorého sa kľúč skladá). KeySpec reprezentuje rozhranie zahŕňajúce triedy, ktoré obsahujú kľúč uložený v transparentnej forme. To znamená, že sa vieme dostať k jednotlivým zložkám kľúča (napríklad pri asymetrických algoritmoch k prvočíslu tvoriacemu kľúč, k modulu a pod.) Nepriehľadné a transparentné reprezentácie môžu byť konvertované jedna na druhú pomocou triedy KeyFactory. KeyFactory keyFactory = KeyFactory.getInstance("DSA"); DSAPublicKeySpec dsaPubKeySpec = new DSAPublicKeySpec(y, p, q, g); PublicKey pubKey = keyFactory.generatePublic(dsaPubKeySpec); byte[] encKey = pubKey.getEncoded(); X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encodedPubKey); pubKey = keyFactory.generatePublic(pubKeySpec);

  34. KeyGenerator, KeyPairGenerator, KeyPair Triedy slúžia na generovanie kľúčov pre symetrické šifrovanie (KeyGenerator) alebo asymetrické šifrovanie (KeyPairGenerator). Trieda KeyPair slúži na uchovanie dvojice privátny/verejný kľúč pri asymetrickom šifrovaní. KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA"); Key k = keyGen.generateKey();

  35. CertificateFactory Použitie tejto triedy je pri vytváraní Certifikátov. Umožňuje načítanie certifikátov zo streamov podľa štandardov, podľa ktorých sú tieto certifikáty uložené. Súčasne umožňuje generovanie Certifikačných ciest a CRL listov FileInputStream fis = new FileInputStream(filename); BufferedInputStream bis = new BufferedInputStream(fis); CertificateFactory cf = CertificateFactory.getInstance("X.509"); while (bis.available() > 0) { Certificate cert = cf.generateCertificate(bis); System.out.println(cert.toString()); }

  36. KeyStore Databáza a zároveň trieda, ktorá reprezentuje uložené kľúče a dôveryhodné certifikáty a umožňuje ich správu. Každý prvok v KeyStore je identifikovaný „alias“ reťazcom. KeyStore môže byť rôzneho typu (štandardne „jks“), ktoré určujú spôsob uloženia tohto skladu. Databáza môže byť chránená heslom. Taktiež kľúče uložené v tejto databáze môžu byť chránené samostatným heslom. ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream("JSSE/sockets/server/testkeys"), passphrase);

  37. SecureRandom Generátor náhodných čísel na základe semienka. DSAParameterSpec dsaSpec = new DSAParameterSpec(p, q, g); SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); random.setSeed(userSeed); keyGen.initialize(dsaSpec, random);

  38. Implementované algoritmy MessageDigest MD2 MD5 SHA-1 SHA-256, SHA-384 a SHA-512 Signature MD2withRSA MD5withRSA SHA1withDSA SHA1withRSA KeyPairGenerator, KeyFactory, AlgorithmParameterGenerator, AlgorithmParameters DSA RSA

  39. Implementované algoritmy (2) SecureRandom SHA1PRNG CertificateFactory X.509 KeyStore JKS PKCS12

  40. Java Security Extension (JCE)

  41. Rozšírenie JCA spočívajúce: • vo väčšom počte šifrovacích algoritmov • v možnosti šifrovania symetrickými kľúčmi • v pridaní implementácie KeyAgreement protokolu • v pridaní šifrovanej práce s prúdmi údajov • v možnosti šifrovať akýkoľvek objekt

  42. Cipher • Trieda, ktorá tvorí jadro JCE štruktúry • Vykonáva šifrovanie a dešifrovanie (symetrické aj asymetrické) • Výber algoritmu s možnosťou uvedenia dodatočných atribútov mode a padding • Zachovaná filozofia z JCA – vytvorenie inštancie pomocou getInstance()

  43. Cipher (2) Postup pri práci s triedou Cipher: • vytvorenie inštancie s požadovaným algoritmom, módom a paddingom (algorithm/mode/padding) • inicializácia požadovaným typom operácie a kľúčom • naplnenie dátami • vykonanie šifrovania (dešifrovania) KeyGenerator kgen = KeyGenerator.getInstance("Blowfish"); SecretKey skey = kgen.generateKey(); Cipher cipher = Cipher.getInstance("Blowfish"); cipher.init(Cipher.ENCRYPT_MODE, skey); byte[] encrypted = cipher.doFinal("This is just an example".getBytes()); // cipher.update("This is just ".getBytes()); // cipher.update("an example".getBytes()); // byte[] encrypted = cipher.doFinal();

  44. CipherInputStream, CipherOutputstream Poskytujú možnosť pracovať s prúdmi a kryptovaním. Triedy CipherInputStream a CipherOutputStream rozširujú triedy FilterInputStream a FilterOutputStream. Je možné nimi zaobaliť vstupný alebo výstupný prúd FileInputStream fis; FileOutputStream fos; CipherInputStream cis; fis = new FileInputStream("/tmp/a.txt"); cis = new CipherInputStream(fis, cipher1); fos = new FileOutputStream("/tmp/b.txt"); byte[] b = newbyte[8]; int i = cis.read(b); while (i != -1) { fos.write(b, 0, i); i = cis.read(b); }

  45. SecretKeyFactory, KeyGenerator Fungujú obdobne ako KeyFactory a KeyGenerator v JCA.

  46. SealedObject Reprezentuje kryptovaný objekt Javy. Pre kryptovanie je možné použiť akýkoľvek z algoritmov, ktoré je možné použiť pre Cipher. Cipher c = Cipher.getInstance("DES"); c.init(Cipher.ENCRYPT_MODE, sKey); SealedObject so = new SealedObject("This is a secret", c); c.init(Cipher.DECRYPT_MODE, sKey); try { String s = (String)so.getObject(c); } catch (Exception e) { }

  47. KeyAgreement Poskytuje možnosť používania key agreement protokolu. Ide o spôsob, ako si dve a viac osôb môže vytvoriť spoločný kľúč, ktorý je rovnaký bez toho, aby si tento kľúč museli medzi sebou priamo vymeniť. Postup pri vytváraní tohto kľúča je nasledovný: • vytvorenie páru privátny/verejný kľúč každou z osôb, ktoré chcú zdieľať • inicializácia svojho KeyAgreement objektu svojím privátnym kľúčom • výmena verejných kľúčov medzi osobami • vykonanie fázy na svojom KeyAgreement objekte s cudzím verejným kľúčom • výmena medzikľúčov z prvej fázy a vykonanie fázy s týmito kľúčmi (táto časť sa opakuje niekoľko krát podľa počtu osôb, ktoré chcú zdieľať) • konečná fáza – vytvorenie kľúča, ktorý bude pre všetky osoby rovnaký

  48. KeyAgreement (2) Príklad procesu vytvárania kľúča pre tri osoby 0. private key 1. public key 0. private key 2. phase key Bob Carol 2. phase key 2. phase key 1. public key 1. public key Alice 0. private key

  49. MAC Poskytuje funkcionalitu pre Message Authentication Code. Je obdobou podpisových algoritmov. Inicializuje sa kľúčom a spúšťa sa nad dátami. KeyGenerator kg = KeyGenerator.getInstance("HmacMD5"); SecretKey sk = kg.generateKey(); Mac mac = Mac.getInstance("HmacMD5"); mac.init(sk); byte[] result = mac.doFinal("Hi There".getBytes());

  50. Implementované algoritmy Algorithm AES Blowfish DES DESede PBEWith<digest>And<encryption> or PBEWith<prf>And<encryption> PBEWithMD5AndDES PBEWithHmacSHA1AndDESede RC2, RC4 a RC5 RSA Mode NONE CBC CFB ECB OFB PCBC Padding NoPadding OAEPWith<digest>And<mgf>Padding OAEPWithMD5AndMGF1Padding. PKCS5Padding SSL3Padding Cipher

More Related