65

Java Security Extensions

  • Upload
    chaeli

  • View
    70

  • Download
    0

Embed Size (px)

DESCRIPTION

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:. - PowerPoint PPT Presentation

Citation preview

Page 1: Java Security Extensions
Page 2: Java Security Extensions

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

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
Page 5: Java Security Extensions

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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
Page 25: Java Security Extensions

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

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

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

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

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

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

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

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

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

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

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

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

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

Implementované algoritmy

MessageDigestMD2MD5SHA-1SHA-256, SHA-384 a SHA-512

SignatureMD2withRSAMD5withRSASHA1withDSASHA1withRSA

KeyPairGenerator, KeyFactory, AlgorithmParameterGenerator, AlgorithmParameters

DSARSA

Page 39: Java Security Extensions

Implementované algoritmy (2)

SecureRandomSHA1PRNG

CertificateFactoryX.509

KeyStore JKSPKCS12

Page 40: Java Security Extensions
Page 41: Java Security Extensions

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

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

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

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

SecretKeyFactory, KeyGenerator

Fungujú obdobne ako KeyFactory a KeyGenerator v JCA.

Page 46: Java Security Extensions

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

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

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

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

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

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

Implementované algoritmy (3)

KeyFactoryDiffieHellman

AlgorithmParameterGeneratorDifiieHellman

AlgorithmParametersBlowfish DES DESede DiffieHellman PBE

MACHmacMD5HmacSHA1PBEWith<mac>

PBEWithHmacSHA1

KeyStoreJCEKS

Page 53: Java Security Extensions
Page 54: Java Security Extensions

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

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

Hierarchia tried v rámci JSSE

Page 57: Java Security Extensions

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

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

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

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

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

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

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
Page 65: Java Security Extensions

[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