Programovanie

V Jave dôverujeme

Dôverovať všetkým? Never nikomu? Znie to trochu ako Akty X, ale pokiaľ ide o dôverné informácie, vedieť, komu dôverujete, je rovnako dôležité ako vedieť, v čo im dôverujete. Tento koncept je rovnako dôležitý pre aplikácie aj pre ľudí. Nakoniec, z aplikácií sme spravili správcov našich informácií a správcov našich zdrojov. Platí to v celom podniku - aplikácie obsahujú dôležité informácie o našom podnikaní a našich zákazníkoch - a platí to aj v prípade stolných počítačov. Nemôžem vám povedať, koľkokrát sa ma pýtali, ako napísať applet, ktorý skenuje disk používateľa, aby jeden mohol ovládať prehliadač iného používateľa alebo zachytiť súkromné ​​informácie.

Java, ktorá je platformou pre vývoj sietí, ktorá je, musí čeliť problému dôvery priamo. Výsledkom je rozhranie Java Security API a architektúra Java Cryptography Architecture.

Krátky pohľad dozadu

Predtým, ako sa bezhlavo ponorím do rozhraní API, kódu a komentárov, rád by som sa v krátkosti vrátil k diskusii z minulého mesiaca. Ak sa k nám pripájate prvýkrát, možno budete chcieť zálohovať mesiac a prečítať si článok „Podpísané a doručené: Úvod do zabezpečenia a autentifikácie“. Tento stĺpec poskytuje dôkladný úvod do všetkých pojmov a konceptov, ktoré budem tento mesiac používať.

Zabezpečenie a autentifikácia sa zameriavajú na dve zásadné záležitosti: preukázanie správy bolo vytvorené konkrétnou entitou a preukázanie správy nebolo po jej vytvorení nijako narušené. Jedným zo spôsobov, ako splniť obidva tieto ciele, je použitie digitálnych podpisov.

Digitálne podpisy vo veľkej miere závisia od odvetvia kryptografie známeho ako kryptografia s verejným kľúčom. Algoritmy verejného kľúča sa vyznačujú skutočnosťou, že sa spoliehajú skôr na zladený pár kľúčov (jeden súkromný a jeden verejný) ako na jeden kľúč. Subjekt tají svoj súkromný kľúč, ale sprístupní svoj verejný kľúč.

Algoritmus digitálneho podpisu berie ako vstup správu a súkromný kľúč entity a generuje digitálny podpis. Digitálny podpis je vytvorený takým spôsobom, že ktokoľvek môže vziať verejný kľúč entity a použiť ho na overenie, či entita v skutočnosti podpísala príslušnú správu. Ďalej, ak došlo k manipulácii s pôvodnou správou, podpis už nebude možné overiť. Digitálne podpisy poskytujú jednu ďalšiu výhodu: keď subjekt podpíše a distribuuje správu, je nemožné, aby jej pôvodca odmietol podpísanie správy (bez toho, aby napriek tomu tvrdil, že bol jeho súkromný kľúč ukradnutý).

Motorov a poskytovateľov

Rozhranie Java Cryptography API definuje sadu nástrojov Java pre zabezpečenie a autentifikáciu. Java Cryptography Architecture (JCA) popisuje, ako sa používa API. Aby sa zaistila najvyššia miera flexibility pre vývojárov aj pre koncových používateľov, obsahuje JCA dva hlavné princípy:

  1. Architektúra by mala podporovať nezávislosť a rozšíriteľnosť algoritmu. Vývojár musí byť schopný písať aplikácie bez toho, aby ich príliš viazal na konkrétny algoritmus. Pri vývoji nových algoritmov je navyše potrebné ich ľahko integrovať do existujúcich algoritmov.

  2. Architektúra by mala podporovať nezávislosť a interoperabilitu implementácie. Vývojár musí byť schopný písať aplikácie bez toho, aby ich viazal na implementáciu algoritmu od konkrétneho dodávateľa. Okrem toho musia byť implementované algoritmy poskytované rôznymi dodávateľmi.

Na splnenie týchto dvoch požiadaviek vyvinuli vývojári rozhrania Java Cryptography API svoj návrh na systéme motorov a poskytovateľov.

Motory produkujú inštancie generátorov prehľadu správ, generátorov digitálnych podpisov a generátorov párov kľúčov. Každá inštancia sa používa na vykonávanie svojej zodpovedajúcej funkcie.

Kanonický modul v JCA je trieda, ktorá poskytuje pomenovanú statickú metódu (alebo metódy) getInstance (), ktorá vracia inštanciu triedy, ktorá implementuje kryptograficky významný algoritmus. The getInstance () metóda prichádza v jedno argumentovej aj dvoj argumentovej forme. V obidvoch prípadoch je prvým argumentom názov algoritmu. JCA poskytuje zoznam štandardných mien, aj keď nie všetky budú uvedené v konkrétnom vydaní. Druhým argumentom je výber poskytovateľa.

Poskytovateľ SUN

Iba jeden poskytovateľ - SLNKO - je dodávaný v JDK 1.1. SUN poskytuje implementáciu algoritmu digitálneho podpisu NIST (DSA) a implementáciu algoritmov digescie správ MD5 a NIST SHA-1.

Trieda MessageDigest

Začneme tým, že sa pozrieme na kód, ktorý zo správy vygeneruje súhrn správy.

MessageDigest messagedigest = MessageDigest.getInstance ("SHA");

MessageDigest messagedigest = MessageDigest.getInstance ("SHA", "SUN");

Ako som už pred chvíľou spomenul, getInstance () metóda má dve príchute. Prvý krok vyžaduje zadanie iba algoritmu. Druhá vyžaduje špecifikáciu algoritmu aj poskytovateľa. Oba vracajú inštanciu triedy, ktorá implementuje algoritmus SHA.

Ďalej odovzdáme správu cez generátor prehľadu správ.

int n = 0; byte [] rgb = nový bajt [1 000]; while ((n = inputstreamMessage.read (rgb))> -1) {messagedigest.update (rgb, 0, n); }

Tu predpokladáme, že správa je k dispozícii ako vstupný prúd. Tento kód funguje dobre pre veľké správy neznámej dĺžky. The aktualizácia () metóda tiež prijíma jeden bajt ako argument pre správy s dĺžkou niekoľkých bajtov a bajtové pole pre správy pevnej alebo predvídateľnej veľkosti.

rgb = messagedigest.digest ();

Posledný krok zahŕňa vygenerovanie samotného prehľadu správ. Výsledný súhrn je zakódovaný do poľa bajtov.

Ako vidíte, JCA pohodlne skryje všetky podrobnosti implementácie na nízkej úrovni a podrobnosti špecifické pre algoritmus, čo vám umožní pracovať na vyššej a abstraktnejšej úrovni.

Jedným z rizík takéhoto abstraktného prístupu je samozrejme zvýšená pravdepodobnosť, že nerozpoznáme chybný výstup spôsobený chybami. Vzhľadom na úlohu kryptografie to môže byť značný problém.

Zvážte chybu „off-by-one“ v riadku aktualizácie nižšie:

int n = 0; byte [] rgb = nový bajt [1 000]; while ((n = inputstreamMessage.read (rgb))> -1) {messagedigest.update (rgb, 0, n - 1); }

Programátori v jazykoch C, C ++ a Java používajú frázu limit-mínus jedna tak často, že jej písanie sa stáva takmer automatickým - aj keď to nie je vhodné. Vyššie uvedený kód sa skompiluje a spustiteľný súbor sa spustí bez chyby alebo varovania, ale výsledný súhrn správ bude nesprávny.

Našťastie je JCA dobre premyslený a dobre navrhnutý, takže potenciálne nástrahy, ako je ten vyššie, sú pomerne zriedkavé.

Predtým, ako prejdeme k generátorom párov kľúčov, pozrite sa na

MessageDigestGenerator, kompletný zdrojový kód programu, ktorý generuje súhrn správ.

Trieda KeyPairGenerator

Na vygenerovanie digitálneho podpisu (a šifrovanie údajov) potrebujeme kľúče.

Generovanie kľúčov vo svojej podobe nezávislej od algoritmu nie je podstatne ťažšie ako vytváranie a používanie prehľadu správ.

KeyPairGenerator keypairgenerator = KeyPairGenerator.getInstance ("DSA");

Rovnako ako v príklade súhrnu správ vyššie, tento kód vytvára inštanciu triedy, ktorá generuje kľúče kompatibilné s DSA. Druhý (ak je to potrebné) argument určuje poskytovateľa.

Po vytvorení inštancie generátora párov kľúčov sa musí inicializovať. Generátory párov kľúčov môžeme inicializovať jedným z dvoch spôsobov: nezávislým od algoritmu alebo závislým od algoritmu. Metóda, ktorú použijete, závisí od rozsahu kontroly nad konečným výsledkom.

keypairgenerator.initialize (1024, nový SecureRandom ());

Kľúče založené na rôznych algoritmoch sa líšia tým, ako sú generované, majú však spoločný jeden parameter - kľúč sila. Sila je relatívny pojem, ktorý zhruba zodpovedá tomu, aké ťažké bude „zlomiť“ kľúč. Ak použijete inicializátor nezávislý od algoritmu, môžete určiť iba silu - akékoľvek hodnoty závislé od algoritmu predpokladajú rozumné predvolené hodnoty.

DSAKeyPairGenerator dsakeypairgenerator = (DSAKeyPairGenerator) keypairgenerator; DSAParams dsaparams = new DSAParams () {private BigInteger p = BigInteger (...); súkromný BigInteger q = BigInteger (...); súkromný BigInteger g = BigInteger (...); public BigInteger getP () {return p; } public BigInteger getQ () {return q; } public BigInteger getG () {return g; }}; dsakeypairgenerator.initialize (dsaparams, nový SecureRandom ());

Aj keď sú predvolené nastavenia zvyčajne dosť dobré, pre väčšiu kontrolu je k dispozícii. Predpokladajme, že ste použili motor na vytvorenie generátora kľúčov kompatibilných s DSA, ako v kóde vyššie. V zákulisí motor načítal a inštancoval inštanciu triedy, ktorá implementuje DSAKeyPairGenerator rozhranie. Ak použijeme generický generátor párov kľúčov, ktorý sme dostali DSAKeyPairGenerator, potom získame prístup k metóde inicializácie závislej od algoritmu.

Na inicializáciu generátora párov kľúčov DSA potrebujeme tri hodnoty: prime P, subprime Q, a základňu G. Tieto hodnoty sú zachytené v inštancii vnútornej triedy, ktorá je odovzdaná do inicializovať () metóda.

The SecureRandom trieda poskytuje bezpečný zdroj náhodných čísel použitých pri generovaní dvojice kľúčov.

návrat keypairgenerator.generateKeyPair ();

Posledný krok zahŕňa generovanie samotného páru kľúčov.

Predtým, ako prejdeme k digitálnym podpisom, pozrite sa na KeyTools, kompletný zdrojový kód programu, ktorý generuje pár kľúčov.

Podpis triedy

Vytvorenie a použitie inštancie Podpis triedy sa podstatne nelíši od ani jedného z dvoch predchádzajúcich príkladov. Rozdiely spočívajú v spôsobe použitia inštancie - buď na podpísanie, alebo na overenie správy.

Signature signature = Signature.getInstance ("DSA");

Rovnako ako predtým používame motor na získanie inštancie príslušného typu. To, čo urobíme ďalej, závisí od toho, či správu podpisujeme alebo neoverujeme.

signature.initSign (privatekey);

Aby sme mohli podpísať správu, musíme najskôr inicializovať inštanciu podpisu so súkromným kľúčom entity, ktorá podpisuje správu.

signature.initVerify (publickey);

Na overenie správy musíme inicializovať inštanciu podpisu s verejným kľúčom entity, ktorá tvrdí, že ju podpísala.

int n = 0; byte [] rgb = nový bajt [1 000]; while ((n = inputstreamMessage.read (rgb))> -1) {signature.update (rgb, 0, n); }

Ďalej, bez ohľadu na to, či podpisujeme alebo neoverujeme, musíme správu odovzdať cez generátor podpisov. Všimnete si, aký podobný je proces s predchádzajúcim príkladom generovania súhrnu správ.

Posledný krok spočíva v generovaní podpisu alebo overení podpisu.

rgb = signature.sign ();

Ak podpisujeme správu, podpísať () metóda vráti podpis.

signature.verify (rgbSignature);

Ak overujeme podpis, ktorý bol predtým vygenerovaný zo správy, musíme použiť znak overiť () metóda. Berie ako parameter predtým vygenerovaný podpis a určuje, či je alebo nie je stále platný.

Predtým, ako to zabalíme, pozrite sa na kompletný zdrojový kód Sign.java programu, ktorý podpisuje správu, a Verify.java, kompletný zdrojový kód programu, ktorý overuje správu.

Záver

Ak sa vyzbrojíte nástrojmi a technikami, ktoré som predstavil tento mesiac, budete viac než pripravení zabezpečiť svoje aplikácie. Vďaka Java Cryptography API je proces takmer nenáročný. Vydanie 1.2 súpravy Java Developers Kit sľubuje ešte viac. Zostaňte naladení.

Budúci mesiac sa vrátim na územie middleware. Zoberiem si trochu RMI, nejaké vlákna a kopu kódu a ukážem ti, ako si vytvoriť svoj vlastný middleware orientovaný na správy.

Todd Sundsted píše programy od chvíle, keď boli počítače dostupné v pohodlných modeloch pre stolné počítače. Aj keď sa Todd pôvodne zaujímal o budovanie aplikácií distribuovaných objektov v C ++, prešiel na programovací jazyk Java, keď sa stal jasnou voľbou pre tento druh vecí. Okrem písania je Todd prezidentom spoločnosti Etcee, ktorá ponúka služby v oblasti školenia, mentorstva, poradenstva a vývoja softvéru.

Získajte viac informácií o tejto téme

  • Stiahnite si kompletný zdrojový kód //www.javaworld.com/jw-01-1999/howto/jw-01-howto.zip
  • Prehľad Java Security API //www.javasoft.com/products/jdk/1.1/docs/guide/security/JavaSecurityOverview.html
  • Architektúra Java Cryptography //www.javasoft.com/products/jdk/1.1/docs/guide/security/CryptoSpec.html
  • Stránka spoločnosti Sun pre zabezpečenie Java //java.sun.com/security/index.html
  • Časté otázky RSA o kryptografii //www.rsa.com/rsalabs/faq/
  • Kryptografická politika a informácie //www.crypto.com/
  • Prečítajte si Toddove predchádzajúce stĺpce Java s pokynmi //www.javaworld.com/topicalindex/jw-ti-howto.html

Tento príbeh „In Java we trust“ pôvodne publikoval server JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found