Download presentation
Presentation is loading. Please wait.
1
Bezpečnosť JAVA technológií
Marián Lojka Jaroslav Porubän KPI FEI TU Košice ©
2
Obsah Model zabezpečenia v Jave Sandbox (bezpečnostné prostredie)
Správca zabezpečenia Súbory zásad Podpisovanie tried Typy oprávnenia Spätný preklad kódu
3
Model zabezpečenia v Jave
História vývoja zabezpečenia v Jave Zabezpečenie v Jave sa vyvíjalo už od jej samotného počiatku. Podstatné rozdiely, ktoré vznikali sa prejavili vo verziách JDK 1.0, JDK 1.1 a Java 2. V prvých počiatkoch vývoja Javy bola jedna z prelomových technológií tvorba Appletov. Applet je kód, ktorý možno prenášať sieťou a spúšťať na klientských počítačoch prostredníctvom vnorených objektov v dokumentoch formátu WWW.
4
Model zabezpečenia v Jave
Výsledkom prvotnej snahy zabezpečenia, ktoré by nepripustilo poškodenie klientského počítača spustením kódu z Internetu je model zabezpečenia nazývaný SANDBOX (krabica z piesku). Model pieskoviska je bezpečnostné prostredie okolo systému alebo aplikácie, ktoré je postavené na zákaze potenciálne nebezpečných činností (prístup k súborom, sieťovým prostriedkom a pod.).
5
Model zabezpečenia v Jave
Zabezpečenia v Java SDK 1.0 Sandbox
6
Model zabezpečenia v Jave
Zabezpečenia v Java SDK 1.1 Sandbox Podpisovanie vzdialeného kódu
7
Model zabezpečenia v Jave
Zabezpečenia v Java 2 bezpečnostné domény (množina tried) súbory zásad zabezpečenia (security policy file)
8
Overenie práv a sprístupnenie systémových prostriedkov
Sandbox Bezpečnostné prostredie Java 2 Načítanie triedy Overenie práv a sprístupnenie systémových prostriedkov
9
Sandbox Príklad /** * Metoda pre spustenie ako Aplikacia */
public static void main(String[] args) { System.out.println("3 + 4 = " + add()); } * Metoda, ktoru upravime prostrednictvom Hexakodu * (testujeme ByteCode Verifier) static int add(){ int a,b,c; a = 3; b = 4; // use hex editor to change to "a = 4" in class file return (a+b);
10
Sandbox Class File Verifier
Príklad požitia neinicializovaného registra Zmeníme časť bytecodu a spustíme program znovu. JVM ohlási chybu z dôvodu čítania neinicializovania registra. Program sa ukončí. Dôsledok toho že nie je možné pristupovať do chránenej pamäte. *** static int add(); Code: 0: iconst_3 1: istore_0 2: iconst_4 3: istore_1 1->0 4: iload_0 5: iload_1 6: iadd 7: ireturn java.lang.VerifyError: (class: ClassVerify, method: add signature: ()I) Accessing value from uninitialized register 1 at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) at java.lang.Class.getConstructor0(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at sun.applet.AppletPanel.createApplet(Unknown Source) at sun.applet.AppletPanel.runLoader(Unknown Source) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
11
Správca zabezpečenia Charakteristika Jadrom celého procesu riadenia prístupu v jazyku Java je trieda SecurityManager definovaná v balíčku java.lang riadi prístup k prostriedkom hostiteľského operačného systému. ak si program vyžiada prístup k určitému prostriedku je požiadavka odovzdaná objektu typu SecurityManager
12
Správca zabezpečenia Preskúmanie zdrojového kódu triedy FileInputStream Konštruktor ešte pred tým ako dovolí vytvorenie inštancie FileInputStream skontroluje či má právo čítať. public FileInputStream(File file) throws FileNotFoundException { String name = (file != null ? file.getPath() : null); SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(name); } if (name == null) { throw new NullPointerException(); fd = new FileDescriptor(); open(name);
13
Správca zabezpečenia Vlastnosti Za normálnych okolností nieje žiadna inštancia správcu zabezpečenia aktívna. Výnimkou je spustenie apletu v okne webového prehliadača, kde JVM vytvorí automaticky inštanciu). Tým docieli vytvorenie Sandboxu. V prebehu spracovania je aktívny len jeden Správca zabezpečenia a to posledne priradený systému prostredníctvom funkcie : System.setSecurityManager(...);
14
Správca zabezpečenia Spôsob inštalácie
Správcu zabezpečenia je možné do systému inštalovať dvoma spôsobmi a to: Explicitne inštaláciou v aplikácií. To je vytvorením inštancie SecurityManager a jej priradeniu Systému. Aktiváciou virtuálneho stroja pomocou prepínača –D : java –Djava.security.manager NazovTriedy
15
Správca zabezpečenia Súbory zásad (policy files)
Súbor zásad je jednoduchý plochý súbor obsahujúci oprávnenia (permissions) . Sú to práva užívateľa alebo kódu k vykonávaniu určitej činnosti. Ak je daná činnosť povolená volanie metódy checkPermission() správcom zabezpečenia prebehne bez problémov v opačnom prípade je vyvolaná výnimka. V tomto prípade je potrebné vytvoriť nový súbor zásad alebo modifikovať už vytvorený. Java 2 umožnite definovať oprávnenie nielen na základe danej činnosti ale aj na základe načítania triedy z určitého miesta alebo na základe podpisu vlastníka alebo skupiny vlastníkov.
16
Správca zabezpečenia Súbory zásad (policy files)
Pri inštalovaní prostredia Java je vytvorený štandardný konfiguračný súbor zabezpečenia. Tento súbor je uložený v podadresári /lib/security domovského adresára inštalácie JRE. Konfiguračný súbor sa nazýva java.security a obsahuje časť podobnú následnému výpisu : # The default is to have a single system-wide policy file, # and a policy file in the user's home directory. policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy Súbor .java.policy obsahuje základné povolenia na prístup k prostriedkom, ktoré sú rovnaké aké ma aplet po spustení v okne webového prehliadača.
17
Správca zabezpečenia Ako vytvoriť vlastný súbor zásad
Súbory zásad možno vytvárať a upravovať pomocou ľubovoľného textového editoru. K uvedenej činnosti môžeme použiť tiež nástroj policytool dodávaný ako súčasť sady JDK (Java Development Kit). Podrobnejší návod nájdete na Súbor zásad sa ukladá prostredníctvom File -> Save As Miesto uloženia súboru zásad Certifikát Povolenia ktoré sú uložené v danom súbore zásad. Pridať odobrať alebo editovať zásadu.
18
Správca zabezpečenia Ako vytvoriť vlastný súbor zásad
Pre vytvorenie novej zásady stlačíme v hlavnom okne “Add Policy Entry”. Zobrazí sa ďalší dialóg. Adresa na ktorú sa vzťahuje oprávnenie Alias podpisu užívateľa na ktorý sa vzťahuje oprávnenie Pridať odobrať alebo editovať oprávnenie.
19
Správca zabezpečenia Ako vytvoriť vlastný súbor zásad
CodeBase Definuje na akú adresu je povolené oprávnenie. Signed By Alias podpisu používateľa, ktorého kód je podpísaný. Využíva sa verejný kľúč na zistenie pravosti kódu podpísaného privátnym kľúčom. Add,Remove,Edit Permission Slúži na pridanie odobratie a zmenu oprávnenia. Toto oprávnenie sa vzťahuje na danné miesto alebo kódu podpísaného Aliasom a identifikovaného verejným kľúčom.
20
Správca zabezpečenia Ako vytvoriť vlastný súbor zásad Permission
určuje druh oprávnenia Target Name určuje triedu na ktorú sa bude oprávnenie vzťahovať Action určuje vlastnosť oprávnenia na ktorú sa oprávnenie vzťahuje
21
Správca zabezpečenia Využitie súboru zásad
Pre názornú ukážku vytvorme triedu WriteFile. import java.io.*; public class WriteFile{ public static void main(String[] args) throws IOException{ FileOutputStream fos = new FileOutputStream(“test.txt”); PrintWriter pw = new PrintWriter(fos); pw.println(“Testujem.”); pw.close(); } Trieda vykonáva jednoduchý zápis slova “Testujem.” do súboru “test.txt”.
22
Správca zabezpečenia Využitie súboru zásad
Po spustení vytvorenej aplikácie WriteFile s implicitným správcom zabezpečenia spustíme program príkazom: java –Djava.security.manager WriteFile Chyba, ktorá nastala pre zákaz zapisovania do súboru. java.security.AccessControlException: access denied (java.io.FilePermission test.txt write) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkWrite(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at WriteFile.main(WriteFile.java:18) Exception in thread "main"
23
Správca zabezpečenia Využitie súboru zásad
Vytvoríme nový súbor zásad s názvom WriteFile.policy, ktorý povoľuje zápis ľubovoľnej triedy na disk a uložíme ho do rovnakého adresára ako je trieda WriteFile.class. WriteFile.policy /* AUTOMATICALLY GENERATED ON Mon Apr 10 13:00:32 CEST 2004*/ /* DO NOT EDIT */ grant { permission java.io.FilePermission "<<ALL FILES>>", "write"; }; Spustíme program prostredníctvom príkazu : java –Djava.security.manager –Djava.security.policy=WriteFile.policy WriteFile –Djava.security.policy – identifikuje miesto kde sa nachádza súbor povolení. Program sa vykoná bez problémov pretože SecurityManager je na základe oprávnení definovaných v súbore WriteFile.policy povolí zápis súboru na disk.
24
Správca zabezpečenia Využitie súboru zásad
Oprávnenie založené na adresách URL a podpisu užívateľa WriteFile.policy grant codeBase "file:/D:/_Projects/Secure1" { permission java.io.FilePermission "<<ALL FILES>>", "write"; }; pre oddeľovanie adresárov sa používa bežné lomítko (/) aj v prípade súborového systému Windows. grant signedBy "bis", codeBase "file:/D:/_Projects/Secure1" { permission java.io.FilePermission "<<ALL FILES>>", "write„ aby bolo možné vytvoriť povolenie na základe podpisu je potrebné aby autor kódu vytvoril pár kľúčov a podpísal kód svojím súkromným kľúčom.
25
Správca zabezpečenia Využitie súboru zásad Ako svoju triedu podpísať
Osoba, ktorá chce svoj kód podpísať : Vytvorí dvojicu šifrovacích kľúčov (súkromný a verejný pomocou nástroja keytool). Vytvorí súbor jar, ktorý obsahuje triedy určené k distribucii (k tomu použije nástroj jar). Podpíše súbor jar pomocou súkromného kľúča (k tomuto účelu je určený nástroj jarsigner). Všetkým užívateľom takto zabalených tried poskytne archív jar a verejný kľúč. K tomuto musí vedieť ako nástroj keytool použiť k exportu certifikátu z databázy certifikátov a odoslaniu ich k danným užívateľom.
26
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov
Pre vytvorenie novej dvojice šifrovacích kľúčov je možné použiť nástroj keytool s prepínačom -genkey. Nástroj požadovanú dvojicu vytvorí a uloží ju do databázy certifikátov. Databáza certifikátov (KEYSTORE) Je malá databáza kde su uložené súkromné kľúče a k nim pridružené certifikáty, tiež zoznamy odvolaných certifikátov a dôveryhodných certifikátov. Pokiaľ daný súbor databázy neexistuje, nástroj keytool ho vytvorí.
27
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov
Ak použijeme nástroj keytool s prepínačom –genkey budeme musieť špecifikovať hodnoty: Alias Jednoduchý názov reprezentujúci užívateľa pre ktorého bude pár šifrovacích kľúčov vytvorený. Heslo k zašifrovaným párom kľúčov Heslo, ktoré bude spojené s dvojicou zašifrovaných kľúčov. Adresu URL Umiestnenie databázy certifikátov. Táto adresa môže obsahovať cestu už k existujúcej databáze (súboru) alebo k databáze ktorá sa má vytvoriť. Heslo do databázy certifikátov Ak nebola databáza certifikátov vytvorená použije hodnotu tohto parametru ako heslo pre novú databázu.
28
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov
Nasledujúci príkaz ukazuje ako vytvoriť pár šifrovacích kľúčov : keytool -genkey –alias kosice –keypass tajomstvo –keystore Autor.jks –storepass heslokeystore Po zadaní nasledujúceho príkazu program požiada o zadanie informácií, ktoré slúžia na identifikovanie osoby, ktorá vytvára kľúč. Nakoniec vyzve používateľa k potvrdeniu zadaných údajov.
29
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov
C:\Documents and Settings\Maio>keytool -genkey -alias kosice -keypass heslokeypass -keystore store.jst -storepass heslokeystore What is your first and last name? [Unknown]: Marian Lojka What is the name of your organizational unit? [Unknown]: Student What is the name of your organization? [Unknown]: TU Kosice What is the name of your City or Locality? [Unknown]: Kosice What is the name of your State or Province? [Unknown]: Slovakia What is the two-letter country code for this unit? [Unknown]: SK Is CN=Marian Lojka, OU=Student, O=TU Kosice, L=Kosice, ST=Slovakia, C=SK correct? [no]: yes
30
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov
Na prácu s nástrojom keytool je možné použiť nástroj KeyTool GUI 1.7 vytvorený Wayne Grantom. Ako voľnú verziu ho nájdete tu.
31
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov
Aby sme mohli vytvoriť kľúče musíme vytvoriť novú databázu kľúčov alebo použiť už vytvorenú. Java KeyStore (Sun's KeyStore format) Java Cryptography Extension KeyStore (More secure version of JKS) Public-Key Cryptography Standards #12 KeyStore (RSA's Personal Information Exchange Syntax Standard) Bouncy Castle KeyStore (Bouncy Castle's version of JKS) Bouncy Castle UBER KeyStore (More secure version of BKS)
32
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov pomocou KeyToolGUI Vytvorenie kľúčov Výber metódy šifrovania Nastavenie potrebných údajov Nastavenie Alias mena
33
Správca zabezpečenia Ako vytvoriť pár šifrovacích kľúčov pomocou KeyToolGUI
34
Správca zabezpečenia Ako vytvoriť jar súbor
Súbor jar, ktorý obsahuje zverejnené triedy vytvoríme prostredníctvom nástroja jar dodávaného štandardne s JDK. Jar súbor z sôr definovanej triedy vytvoríme nasledujúcim príkazom: jar cf WriteFile.jar WriteFile.class Bližšie sa zaoberať nástrojom jar nieje úlohou tejto prezentácie. Stručnú nepovedú získate zadaním príkazu jar – help.
35
Správca zabezpečenia Ako podpísať súbor jar
Podpísanie súboru jar môžeme vykonať prostredníctvom nástroja jarsigner, ktorý je súčasťou JDK. Pri podpisovaní Vás tento nástroj požiada aby ste zadali rovnaké hodnoty ako pri vytváraní páru šifrovacích kľúčov. Sú to : Adresa URL databázy certifikátov. Heslo do databázy certifikátov. Alias kľúča. Heslo k rozšifrovaniu kľúča. Okrem uvedených hodnôt je potrebné zadať aj názov súboru jar, ktorý sa má podpísať aj meno jeho kópie, ktorá bude podpísaná. jarsigner -keystore keystore.jks -storepass heslokeystore -keypass heslokeypass -signedjar SignedWriteFile.jar WriteFile.jar brown.
36
Správca zabezpečenia Štruktúra podpísaného jar súboru
SignedWriteFile.jar META-INF BROWN.DSA BROWN.SF MANIFEST.MF Zverejnené triedy
37
Správca zabezpečenia Export a Import verejného kľúča databázy certifikátov Export a Import verejného kľúča databázy je potrebné vykonať ak chcete preniesť kľúč k druhej osobe, ktorá používa vami podpísaný kód a potrebuje si overiť či kód nebol od jeho vytvorenia a podpísania zmenený. Postup exportu aj importu je v programe KeyToolGUI intuitívny avšak tento postup je možné vykonať prostredníctvom už skôr uvedeného nástroja keytool. Export : keytool -export –alias brown –keystore keystore.jks –storepass heslokeystore –file Brown.cer. Import: keytool -import –alias brown –keystore keystore.jks –storepass heslokeystore –file Brown.cer
38
Správca zabezpečenia Ako upraviť súbor zásad. Overenie identity vo vhodnej databáze certifikátov. Posledným krokom je úprava súboru zásad takým spôsobom aby našiel cestu k databáze certifikátov, kde sú uložené verejné kľúče vrátane ich aliasov. Túto činnosť je možné vykonať prostredníctvom nástroja policytool. URL k databáze certifikátov
39
Správca zabezpečenia Ako upraviť súbor zásad. Overenie identity vo vhodnej databáze certifikátov. WriteFile.policy keystore "file:/D:/_Projects/Secure1/keystore.jks"; grant signedBy "brown" { permission java.io.FilePermission "<<ALL FILES>>", "write"; }; Spustenie programu : Pre spustenie programu WriteFile uloženého v súbore SignedWriteFile.jar napríklad tento príkaz : java -cp SignedWriteFile.jar -Djava.security.manager -Djava.security.policy=WriteFile.policy WriteFile
40
public key certificate
Súbory zásad FileWriter.java 1. javac FileWriter.class 3. Keytool -genkey 2. jar Databáza kľúčov Jamesa Browna Keystore.jks FileWriter.jar Alias brown 5. 4. jarsigner private key Keytool -export SignedFileWriter.jar public key certificate JamesBrown.cer
41
Súbory zásad 1. 3. 2. 4. Exception SignedFileWriter.jar od James Brown
java security manager datový súbor Exception Program nemá oprávnenie pre zápis údajov na disk 3. Policy tool 2. JamesBrown.cer od James Brown Keytool -import Policy súbor Jennifer Lopez udeľuje oprávnenie kódu podpísaného aliasom “brown” na zápis údajov na disk Databáza kľúčov Jennifer Lopez 4. Keystore.jks SignedFileWriter.jar java security manager Brownov public key certificate datový súbor
42
Typy oprávnenia Základná špecifikácia
Všetky platné oprávnenia definované v súbore zásad sú v Jave interne reprezentované ako inštancia abstraktnej triedy Permission definovaného v balíku java.security. Ak sa má vykonať špecificky nebezpečná činnosť volá sa metóda checkXXX() a tá vola metódu checkPermission() definovanej v triede AccessControler. FileOutpuStream security.checkWrite(fileName); SecurityManager checkPermission(new FilePermission(file,SecurityConstants.FILE_WRITE_ACTION)); AccessController public static void checkPermission(Permission perm) throws AccessControlException{
43
Typy oprávnenia Základné rozdelenie typov oprávnení.
44
Typy oprávnenia Základná charakteristika
Určité triedy odvodené od triedy Permission sa používajú pre jeden typ oprávnenia, ako napríklad java.io.FilePermission, ktorej inštancia sa používa k povoleniu prístupu k súboru alebo k skupine súborou. Iné triedy ako napríklad java.lang.RuntimeException sa používajú k popisu viacej typov oprávnenia. Vo všetkých triedach odvodených od triedy Permission je zapuzdrená jedna alebo viacej hodnôt String. Uvedené hodnoty popisujú špecifický typ oprávnenia alebo typ povoleného prístupu. Typy prístupu sa označujú tiež ako zoznam akcií (action list).
45
Typy oprávnenia BasicPermission
Táto trieda je definovaná v baliču java.security. Je priamym potomkom triedy Permission a rovnako ako jej predok je abstraktnou triedou. Na rozdiel od je bázovej triedy Permission obsahuje metódu implies(Permission per). Metóda umožňuje určiť čí dané oprávnenie zahrnuje v sebe aj iné oprávnenie. Triedy dedené od BasicPermission AWTPermission NetPermission PropertyPermission ReflectPermission RuntimePermission SecurityPermission SerializablePermission SQLPermission Bližší popis tried nájdete
46
Oprávnenie k čítaniu adresára temp a k čítaniu súboru readme.txt.
Typy oprávnenia Oprávnenie FilePermission. Použitím tejto triedy sa určuje prístup k súborom alebo adresárom. Zoznam operácií by mal obsahovať jednu alebo viac nasledujúcich položiek : read, write, execute, delete. Väčšinou bude cieľ oprávnenia zastupovať názov súboru alebo adresára. Následne je uvedených nikoľko príkladov: Oprávnenie k čítaniu adresára temp a k čítaniu súboru readme.txt. grant { permission java.io.FilePermission “C:/temp”,”read”; permission java.io.FilePermission “C:/temp/readme.txt”,”read”; }
47
Typy oprávnenia Oprávnenie FilePermission.
Oprávnenie k čítaniu adresára a všetkých v ňom uložených súborov. grant { permission java.io.FilePermission “C:/temp/*”,”read”; } Oprávnenie k čítaniu všetkých súborov v tomto adresári a jeho podadresároch. grant { permission java.io.FilePermission “C:/temp/-”,”read”; } Oprávnenie k čítaniu a zápisu všetkých súborov a adresárov. grant { permission java.io.FilePermission “<<ALL FILES>>”,”write,read”; }
48
Typy oprávnenia Oprávnenie SocketPermission.
Schopnosť apletov vytvárať soketové pripojenie je obmedzené. Nepodpísané aplety môžu vytvárať soketové pripojenie iba k serveru z ktorého boli stiahnuté. Samotné oprávnenie sa skladá z dvoch položiek a to : Názov hostiteľa(názov DNS počítača v sieti alebo jeho IP). Zoznam akcií, ktoré sú povolené pri operáciách s hostiteľom Zoznam akcií môže obsahovať jednu alebo viacej nasledujúcich položiek : accept, connect, listen, resolve.
49
Typy oprávnenia Oprávnenie SocketPermission. Connect
Umožňuje určiť povolenie ktoré lokálnemu počítaču dovoľuje vytvoriť soketové pripojenie k iným počítačom. Listen Udeľuje oprávnenie k sledovaniu prichádzajúcich pripojení. permission java.net.SocketPermission “localhost: ”,”listen”; Accept Udeľuje, ktoré počítače môžu vytvoriť soketové pripojenie k lokálnemu počítaču. permission java.net.SocketPermission “*.tuke.sk: ”,”accept”; Reslove Určuje povolenie na preklad názvov hostiteľov na adresy IP a naopak.
50
Spätný preklad bajtového kódu
Nebezpečie spätnej analýzy DJ Decompiler
51
Nechránený prístup k reťazcom
Spätný preklad bajtového kódu Nebezpečie spätnej analýzy Súbor WriteFile.class po spätnej anlýze. Nechránený prístup k reťazcom
52
Spätný preklad Protiopatrenia Jednou z možností ako je predísť nebezpečiu pred spätným prekladom je použitie Obfuscator-a (Zatemňovača). Je to program, ktorý je určený pre jeden cieľ a to zmareniu spätného prekladu. Jedným z takýchto nástrojov je JShrink.
53
Nastavenie úrovne zatemňovania tried
Spätný preklad Protiopatrenia JShrink Nastavenie úrovne zatemňovania tried
54
Bibliografia [1] Marco Pistoia, Duane F. Reller : Java 2 Network Security , Jun 1999 [2] Scott Oaks:Java Security 2nd Edition, O'REILLY , May 2001 [3] BretSpell : Java Programujeme Profesionálne, Január 2002 [4] Markus Falkhausen:Contributions to Information Technology, [5] James A. Vuccolo : Java - A Secure Programming Language, September 2000 [6] Gary McGraw and Edward Felten: The Original Applet Sandbox, Januar 2000 [7] Scott Oaks:Java Security, May 1998 [8] Sun Microsystems: The Source for Developers, [9] Sun Microsystems: The JavaTM Tutorial , Trail: Security in Java 2 SDK 1.2 [10] Joseph A: Bank:Java Security,
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.