Download - Java Security Extensions
![Page 1: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/1.jpg)
![Page 2: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/2.jpg)
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
![Page 3: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/3.jpg)
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.
![Page 4: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/4.jpg)
![Page 5: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/5.jpg)
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
![Page 6: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/6.jpg)
Zloženie:
Spoločné triedy - Subject, Principal, Credential
Autentifikačné triedy a rozhrania - LoginContext, LoginModule, CallbackHandler, Callback
Autorizačné triedy - Policy, AuthPermission, PrivateCredentialPermission
![Page 7: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/7.jpg)
Architektúra autentifikácie
aplikáciapožiadavka
na autentifikáciu
konfiguračný login súbor
prihlásenie
komunikácia s používateľom
identifikácia používateľa
aplikácia s identifikovaným
používateľom
Štruktúra priebehu autentifikácie:
autor autentifikačnej technológie
autor aplikácie
![Page 8: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/8.jpg)
Autentifikácia v JAAS
aplikáciaLoginContext.
login()
konfiguračný login súbor
LoginModule
CallbackHandler
SubjectPrincipal
aplikácia s objektom Subject určujúcim
používateľa
autor autentifikačnej technológie
autor aplikácie
Použitie tried v architektúre autentifikácie:
![Page 9: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/9.jpg)
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());
![Page 10: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/10.jpg)
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ý.
![Page 11: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/11.jpg)
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.
![Page 12: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/12.jpg)
Zakomponovanie JAAS do aplikácie (4)
Príklad CallbackHandlera:
public void 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}
} else if (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());
} else if (callbacks[i] instanceof PasswordCallback) {PasswordCallback pc = (PasswordCallback)callbacks[i];
System.err.print(pc.getPrompt()); System.err.flush(); pc.setPassword(readPassword(System.in));
} else { throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); }
} }
![Page 13: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/13.jpg)
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.
![Page 14: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/14.jpg)
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
![Page 15: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/15.jpg)
Zakomponovanie JAAS do aplikácie (7)
failfailfailfailfailpasspasspassOverall Authentication
*failpass**failpass*optionalKerberos
failpasspass*failpasspass*requisiteSmartCard
failfailfailpassfailfailfailpasssufficientNTLoginModule
failfailfailfailpasspasspasspassrequiredSampleLoginModule
Login2 Authentication Status
Výsledok celkovej autentifikácie na základe výsledkov čiastkových autentifikácií:
![Page 16: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/16.jpg)
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
![Page 17: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/17.jpg)
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
![Page 18: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/18.jpg)
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"
![Page 19: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/19.jpg)
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";};
![Page 20: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/20.jpg)
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
![Page 21: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/21.jpg)
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);
![Page 22: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/22.jpg)
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);
![Page 23: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/23.jpg)
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
![Page 24: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/24.jpg)
![Page 25: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/25.jpg)
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
![Page 26: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/26.jpg)
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 RSAPROVIDER_2 má prioritu 2
![Page 27: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/27.jpg)
Postup pri určovaní konkrétnej implementácie algortimu(2)
Pozrime sa na štyri scenáre:
1. 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ý
2. 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ý
3. Predpokladajme, že hľadáme algoritmus podpisu SHAwithRSA. Nakoľko žiadny poskytovateľ takúto službu neimplementuje, je vyhodená výnimka NoSuchAlgorithmException
4. 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
![Page 28: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/28.jpg)
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
![Page 29: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/29.jpg)
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)
![Page 30: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/30.jpg)
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();
![Page 31: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/31.jpg)
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);
![Page 32: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/32.jpg)
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();
![Page 33: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/33.jpg)
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);
![Page 34: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/34.jpg)
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();
![Page 35: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/35.jpg)
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());}
![Page 36: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/36.jpg)
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);
![Page 37: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/37.jpg)
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);
![Page 38: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/38.jpg)
Implementované algoritmy
MessageDigestMD2MD5SHA-1SHA-256, SHA-384 a SHA-512
SignatureMD2withRSAMD5withRSASHA1withDSASHA1withRSA
KeyPairGenerator, KeyFactory, AlgorithmParameterGenerator, AlgorithmParameters
DSARSA
![Page 39: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/39.jpg)
Implementované algoritmy (2)
SecureRandomSHA1PRNG
CertificateFactoryX.509
KeyStore JKSPKCS12
![Page 40: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/40.jpg)
![Page 41: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/41.jpg)
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
![Page 42: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/42.jpg)
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()
![Page 43: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/43.jpg)
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();
![Page 44: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/44.jpg)
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 = new byte[8];int i = cis.read(b);while (i != -1) {
fos.write(b, 0, i);i = cis.read(b);
}
![Page 45: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/45.jpg)
SecretKeyFactory, KeyGenerator
Fungujú obdobne ako KeyFactory a KeyGenerator v JCA.
![Page 46: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/46.jpg)
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) {}
![Page 47: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/47.jpg)
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ý
![Page 48: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/48.jpg)
KeyAgreement (2)
0. private key
0. private key
0. private key
2. phase key
2. phase key
1. public key1. public key
Bob
Alice
Carol
1. public key
2. phase key
Príklad procesu vytvárania kľúča pre tri osoby
![Page 49: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/49.jpg)
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());
![Page 50: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/50.jpg)
Implementované algoritmyAlgorithm
AESBlowfishDESDESedePBEWith<digest>And<encryption> or PBEWith<prf>And<encryption>
PBEWithMD5AndDESPBEWithHmacSHA1AndDESede
RC2, RC4 a RC5RSA
ModeNONE CBCCFBECBOFBPCBC
PaddingNoPadding OAEPWith<digest>And<mgf>Padding
OAEPWithMD5AndMGF1Padding. PKCS5PaddingSSL3Padding
Cipher
![Page 51: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/51.jpg)
Implementované algoritmy (2)
KeyAgreementDiffieHellman
KeyGeneratorAES Blowfish DES DESede HmacMD5 HmacSHA1
KeyPairGeneratorDiffieHellman
SecretKeyFactoryAES DES DESede PBEWith<digest>And<encryption> or PBEWith<prf>And<encryption>
PBEWithMD5AndDESPBEWithHmacSHA1AndDESede
![Page 52: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/52.jpg)
Implementované algoritmy (3)
KeyFactoryDiffieHellman
AlgorithmParameterGeneratorDifiieHellman
AlgorithmParametersBlowfish DES DESede DiffieHellman PBE
MACHmacMD5HmacSHA1PBEWith<mac>
PBEWithHmacSHA1
KeyStoreJCEKS
![Page 53: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/53.jpg)
![Page 54: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/54.jpg)
Umožňuje bezpečnú internetovú komunikáciu zabezpečením:
autentifikácie servera
šifrovaním vymieňaných dát
overovaním integrity správ
možnosťou autentifikácie klienta
Podporované protokoly:
SSL 2.0
SSL 3.0
TSL 1.0
![Page 55: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/55.jpg)
Algoritmy používané v JSSE
1024hromadné kryptovanieDSA
1024512
key agreementDiffie - Hellman
192 (112 efektívnych)hromadné kryptovanieTriple DES
64 (56 efektívnych)64 (40 efektívnych)
hromadné kryptovanieDES
128128 (40 efektívnych)
hromadné kryptovanieRC4
2048 (autentifikácia)2048 (výmena kľúčov)512 (výmena kľúčov)
Autentifikácia a výmena kľúčov
RSA
Dĺžka kľúča (bitov)kryptografický proceskryptovací algoritmus
![Page 56: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/56.jpg)
Hierarchia tried v rámci JSSE
![Page 57: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/57.jpg)
SocketFactory, ServerSocketFactory, SSLSocket, SSLServerSocket, SSLSocketFactory,
SSLServerSocketFactory
Vytvárajú a spravujú bezpečné spojenie.
Transformácia obyčajného spojenia na bezpečné (server):
import java.io.*;import java.net.*;. . .int port = availablePortNumber;ServerSocket s;try { s = new ServerSocket(port); Socket c = s.accept(); OutputStream out = c.getOutputStream(); InputStream in = c.getInputStream();}catch (IOException e) {}
import java.io.*;import javax.net.ssl.*;. . .int port = availablePortNumber;SSLServerSocket s;try { SSLServerSocketFactory sslSrvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); S = (SSLServerSocket) sslSrvFact.createServerSocket(port); SSLSocket c = (SSLSocket)s.accept(); OutputStream out = c.getOutputStream(); InputStream in = c.getInputStream();}catch (IOException e) {}
![Page 58: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/58.jpg)
Transformácia obyčajného spojenia na bezpečné (klient):
import java.io.*;import java.net.*;. . .int port = availablePortNumber;String host = "hostname";try { s = new Socket(host, port); OutputStream out = s.getOutputStream(); InputStream in = s.getInputStream();}catch (IOException e) {}
import java.io.*;import javax.net.ssl.*;. . .int port = availablePortNumber;String host = "hostname";try { SSLSocketFactory sslFact = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket s = (SSLSocket) sslFact.createSocket(host, port); OutputStream out = s.getOutputStream(); InputStream in = s.getInputStream();}catch (IOException e) {}
![Page 59: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/59.jpg)
SSLContext
slúži ako Factory na výrobu SocketFactories
je automaticky vytvorený v prípade, že zavoláme SocketFactory.getDefault()
môžeme vytvoriť vlastnú inštanciu SSLContextu, ak chceme mať lepšiu kontrolu napríklad nad tým, akými protokolmi sa bude spojenie riadiť
môžeme nastaviť certifikáty a kľúče, podľa ktorých sa bude kontrolovať spojenie
![Page 60: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/60.jpg)
TrustManager, TrustManagerFactory
Primárnou zodpovednosťou je rozhodnúť, či nájdené autentifikačné poverovacie listiny (credentials) sú dôveryhodné
Na autentifikáciu vzdialeného servera je potrebné vytvoriť SSLContext s jedným alebo viacerými TrustManagermi
Je potrebné dodať jeden TrustManager pre každý autentifikačný mechanizmus, ktorý je podporovaný
TrustManagerFactory slúži na vytvorenie TrustManagera na základe zadaných atribútov
možnosť inicializovať databázou, ktorá sa nachádza v KeyStore alebo pomocou parametrov
![Page 61: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/61.jpg)
KeyManager, KeyManagerFactory
Primárnou zodpovednosťou je vybrať autentifikačné listiny (credentials), ktoré budú poslané pri autentifikácii klienta servru
Pracuje sa s ním rovnako ako s TrustManagerom (výber listín pre každý mechanizmus autentifikácie)
KeyManagerFaktory funguje obdobne ako TrustManagerFacory
![Page 62: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/62.jpg)
X509TrustManager, X509KeyManager
Štandardne je používaná komunikácia na báze X.509 protokolu, tieto dve rozhrania musia byť implementované všetkými triedami, ktoré chcú daný štandard používať
class MyX509TrustManager implements X509TrustManager { X509TrustManager sunX509TrustManager; MyX509TrustManager() { sunX509TrustManager = tmf.getTrustManagers()[0] } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException) { try { sunX509TrustManager.checkServerTrusted(chain, authType); } catch (CertificateException excep) { } public X509Certificate[] getAcceptedIssuers() { return sunJSSETrustManager.getAcceptedIssuers(); }}
![Page 63: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/63.jpg)
HostnameVerifier
Rozhranie slúži na určenie činnosti, ktorá sa má uskutočniť, ak štandardné autentifikačné metódy zlyhajú
public class MyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { // pop up an interactive dialog box // or insert additional matching logic if (good_address) { return true; } else { return false; } }}HttpsURLConnection urlc = (HttpsURLConnection) (new URL("https://www.sun.com/")).openConnection();urlc.setHostnameVerifier(new MyHostnameVerifier());
![Page 64: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/64.jpg)
![Page 65: Java Security Extensions](https://reader036.vdocuments.net/reader036/viewer/2022062409/56814cf7550346895dba0353/html5/thumbnails/65.jpg)
[1] http://java.sun.com/j2se/1.4.2/docs/api/[2] http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html[3] http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html[4] http://java.sun.com/j2se/1.4.2/docs/guide/security/jce/JCERefGuide.html[5] http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html[6] http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.html[7] http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/index.html[8] http://java.sun.com/j2se/1.4.2/docs/guide/security/PolicyFiles.html[9] http://java.sun.com/j2se/1.4.2/docs/guide/security/HowToImplAProvider.html[10] http://java.sun.com/j2se/1.4.2/docs/guide/security/doprivileged.html
Použité zdroje