Programavimas

„Java“ mes pasitikime

Pasitiki visais? Nepasitikėk niekuo? Skamba šiek tiek taip „X-Files“, bet kalbant apie konfidencialią informaciją, žinoti, kuo tu pasitiki, yra taip pat svarbu, kaip žinoti, kuo tu jais pasitiki. Ši koncepcija yra tokia pat svarbi programoms, kaip ir žmonėms. Galų gale mes pateikėme paraiškas savo informacijos saugotojams ir išteklių valdytojams. Tai tiesa visoje įmonėje - programose yra svarbiausios informacijos apie mūsų verslą ir klientus - ir tai yra darbalaukyje. Negaliu jums pasakyti, kiek kartų manęs klausė, kaip parašyti programėlę, kuri nuskaito vartotojo diską, kad vienas vartotojas galėtų vadovauti kito vartotojo naršyklei ar užfiksuoti privačią informaciją.

„Java“, būdama tinklo kūrimo platforma, turėjo spręsti pasitikėjimo problemą. Rezultatas yra „Java Security API“ ir „Java Cryptography Architecture“.

Trumpas žvilgsnis atgal

Prieš giliai nardydamas API, kodą ir komentarus, norėčiau trumpai apžvelgti praėjusio mėnesio diskusijas. Jei prisijungiate prie mūsų pirmą kartą, galbūt norėsite sukurti atsarginę mėnesio kopiją ir perskaityti „Pasirašyta ir pristatyta: įvadas į saugumą ir autentifikavimą“. Šiame stulpelyje pateikiama išsami visų terminų ir sąvokų, kurias naudosiu šį mėnesį, įvadas.

Saugumas ir autentifikavimas sprendžia du esminius klausimus: įrodyti pranešimą sukūrė konkretus subjektas, o įrodyti, kad pranešimas nebuvo sugadintas jį sukūrus. Vienas iš būdų pasiekti abu šiuos tikslus yra skaitmeninių parašų naudojimas.

Skaitmeniniai parašai labai priklauso nuo kriptografijos šakos, vadinamos viešojo rakto kriptografija. Viešojo rakto algoritmams būdinga tai, kad jie remiasi suderinta raktų pora (vienas privatus ir vienas viešas), o ne vienu raktu. Subjektas saugo savo privataus rakto paslaptį, tačiau viešąjį raktą suteikia galimybę naudotis.

Skaitmeninio parašo algoritmas kaip įvestį priima pranešimą ir subjekto privatų raktą ir sukuria skaitmeninį parašą. Skaitmeninis parašas sukurtas taip, kad kiekvienas galėtų paimti subjekto viešąjį raktą ir juo patikrinti, ar subjektas iš tikrųjų pasirašė atitinkamą pranešimą. Be to, jei originalus pranešimas buvo sugadintas, parašo nebegalima patikrinti. Skaitmeniniai parašai suteikia dar vieną pranašumą: kai subjektas pasirašo ir išplatina pranešimą, jo iniciatorius negali paneigti, kad jis pasirašė pranešimą (nepaisant to, kad jo privatus raktas nebuvo pavogtas).

Variklių ir tiekėjų

„Java“ kriptografijos API apibrėžia „Java“ rinkinį saugumui ir autentifikavimui. „Java“ kriptografijos architektūroje (JCA) aprašoma, kaip naudoti API. Siekdama užtikrinti aukščiausią tiek kūrėjo, tiek galutinio vartotojo lankstumą, JCA vadovaujasi dviem pagrindiniais principais:

  1. Architektūra turėtų palaikyti algoritmo nepriklausomumą ir išplėtimą. Kūrėjas turi mokėti rašyti programas per daug nepririšdamas jų prie konkretaus algoritmo. Be to, kuriant naujus algoritmus, jie turi būti lengvai integruoti su esamais algoritmais.

  2. Architektūra turėtų padėti įgyvendinti nepriklausomumą ir sąveiką. Kūrėjas turi sugebėti rašyti programas nepririšdamas jų prie konkretaus pardavėjo algoritmo įgyvendinimo. Be to, turi sąveikauti įvairių tiekėjų pateikti algoritmo diegimai.

Norėdami patenkinti šiuos du reikalavimus, „Java Cryptography API“ kūrėjai savo dizainą grindė variklių ir tiekėjų sistema.

Varikliai gamina pranešimų santraukos generatorių, skaitmeninio parašo ir raktų porų generatorių egzempliorius. Kiekvienas egzempliorius naudojamas atitinkamai funkcijai atlikti.

JCA kanoninis variklis yra klasė, suteikianti statinį metodą (ar metodus), pavadintą „getInstance“ (), kuris pateikia klasės egzempliorių, įgyvendinantį kriptografiškai reikšmingą algoritmą. „getInstance“ () metodas yra tiek vieno, tiek dviejų argumentų forma. Abiem atvejais pirmasis argumentas yra algoritmo pavadinimas. JCA pateikia standartinių pavadinimų sąrašą, nors ne visi bus pateikti konkrečiame leidime. Antrasis argumentas parenka teikėją.

SUN teikėjas

Tik vienas teikėjas - SAULĖ - tiekiamas JDK 1.1. SUN teikia ir NIST skaitmeninio parašo algoritmo (DSA), ir MD5 ir NIST SHA-1 pranešimų santraukos algoritmų įgyvendinimą.

Klasės „MessageDigest“

Pradėsime nuo kodo, kuris sugeneruoja pranešimo santrauką iš pranešimo.

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

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

Kaip minėjau vos prieš akimirką, „getInstance“ () metodas yra dviejų skonių. Pirmajam reikia nurodyti tik algoritmą. Antrasis reikalauja nurodyti ir algoritmą, ir teikėją. Abu jie pateikia klasės egzempliorių, įgyvendinantį SHA algoritmą.

Tada mes perduodame pranešimą per pranešimų santraukos generatorių.

int n = 0; baitas [] rgb = naujas baitas [1000]; while ((n = inputstreamMessage.read (rgb))> -1) {messagedigest.update (rgb, 0, n); }

Manome, kad pranešimas yra prieinamas kaip įvesties srautas. Šis kodas gerai tinka dideliems nežinomo ilgio pranešimams. atnaujinti () metodas taip pat priima vieną baitą kaip kelių baitų ilgio pranešimų argumentą ir fiksuoto arba nuspėjamo dydžio pranešimų baitų masyvą.

rgb = messagedigest.digest ();

Paskutinis žingsnis yra pats pranešimo sugeneravimas. Gautas santrauka užkoduota baitų masyvu.

Kaip matote, JCA patogiai slepia visas žemo lygio įgyvendinimo ir algoritmų specifines detales, leidžiančias dirbti aukštesniu, abstraktesniu lygiu.

Žinoma, viena iš tokio abstraktaus požiūrio rizikų yra didesnė tikimybė, kad nepripažinsime klaidingos išvesties, atsiradusios dėl klaidų. Atsižvelgiant į kriptografijos vaidmenį, tai gali būti reikšminga problema.

Apsvarstykite toliau nurodytą naujinimo eilutės klaidą „po vieną“:

int n = 0; baitas [] rgb = naujas baitas [1000]; while ((n = inputstreamMessage.read (rgb))> -1) {messagedigest.update (rgb, 0, n - 1); }

„C“, „C ++“ ir „Java“ programuotojai taip dažnai naudoja „idėja-riba – vienas“ idėją, kad jos vedimas tampa beveik automatinis - net ir tada, kai tai nėra tikslinga. Aukščiau pateiktas kodas bus sukompiliuotas, o vykdomasis failas veiks be klaidų ar įspėjimų, tačiau gautas pranešimo santrauka bus neteisinga.

Laimei, JCA yra gerai apgalvotas ir gerai suprojektuotas, todėl galimos spąstai, kaip antai aukščiau, yra gana reti.

Prieš pereidami prie raktų porų generatorių, pasidomėkite

„MessageDigestGenerator“, pilnas programos, generuojančios pranešimų santrauką, šaltinio kodas.

Klasės „KeyPairGenerator“

Norėdami sukurti skaitmeninį parašą (ir užšifruoti duomenis), mums reikia raktų.

Raktų generavimas, nepriklausomai nuo algoritmų, nėra iš esmės sunkesnis nei kurti ir naudoti pranešimo santrauką.

KeyPairGenerator keypairgenerator = KeyPairGenerator.getInstance („DSA“);

Kaip ir aukščiau pateiktame pranešimo santraukos pavyzdyje, šis kodas sukuria klasės egzempliorių, kuris generuoja su DSA suderinamus raktus. Antrasis (jei reikia) argumentas nurodo paslaugų teikėją.

Sukūrus raktų porų generatoriaus egzempliorių, jį reikia inicijuoti. Mes galime inicijuoti raktų porų generatorius vienu iš dviejų būdų: nepriklausomi nuo algoritmų arba priklausomi nuo algoritmų. Kurį metodą naudojate, priklauso nuo to, kiek norite valdyti galutinį rezultatą.

keypairgenerator.initialize (1024, naujas „SecureRandom“);

Skirtingais algoritmais paremti raktai skiriasi tuo, kaip jie sugeneruojami, tačiau jie turi vieną bendrą parametrą - rakto jėga. Stiprumas yra santykinis terminas, kuris maždaug atitinka tai, kaip sunku bus „sulaužyti“. Jei naudojate nuo algoritmo nepriklausomą inicializatorių, galite nurodyti tik stiprumą - bet kurios nuo algoritmo priklausomos vertės prisiima pagrįstus numatytuosius nustatymus.

DSAKeyPairGenerator dsakeypairgenerator = (DSAKeyPairGenerator) klavišų poros generatorius; DSAParams dsaparams = new DSAParams () {private BigInteger p = BigInteger (...); privatus BigInteger q = BigInteger (...); privatus BigIntegeris g = BigIntegeris (...); public BigInteger getP () {return p; } public BigInteger getQ () {return q; } public BigInteger getG () {return g; }}; dsakeypairgenerator.initialize (dsaparams, naujas SecureRandom ());

Nors numatytieji nustatymai paprastai yra pakankamai geri, jei jums reikia daugiau kontrolės, jis yra prieinamas. Tarkime, kad naudojote variklį kurdami su DSA suderinamų raktų generatorių, kaip nurodyta aukščiau pateiktame kode. Užkulisiuose variklis įkėlė ir išprovokavo klasės pavyzdį, kuris įgyvendina „DSAKeyPairGenerator“ sąsaja. Jei mes mesti bendrą raktų porų generatorių, kurį gavome „DSAKeyPairGenerator“, tada mes prieiname prie algoritmo priklausantį inicializavimo metodą.

Norint inicijuoti DSA raktų porų generatorių, mums reikia trijų reikšmių: pirminio P, subprime Q, ir pagrindas G. Šios vertės fiksuojamos vidinės klasės egzemplioriuje, kuris perduodamas inicijuoti () metodas.

„SecureRandom“ klasė suteikia saugų atsitiktinių skaičių šaltinį, naudojamą generuojant raktų poras.

grąžinti keypairgenerator.generateKeyPair ();

Paskutinis žingsnis apima pačios raktų poros generavimą.

Prieš pereidami prie skaitmeninių parašų, pažvelkite į „KeyTools“ - visą programos, generuojančios raktų porą, šaltinio kodą.

Klasės parašas

Programos egzemplioriaus sukūrimas ir naudojimas Parašas klasė iš esmės nesiskiria nuo abiejų ankstesnių pavyzdžių. Skirtumai slypi to, kaip egzempliorius naudojamas - pasirašyti arba patvirtinti pranešimą.

Parašo parašas = Signature.getInstance („DSA“);

Kaip ir anksčiau, mes naudojame variklį, kad gautume atitinkamo tipo egzempliorių. Tai, ką darysime toliau, priklauso nuo to, ar mes pasirašome, ar nepatvirtiname pranešimą.

parašas.initSign (privatekey);

Norėdami pasirašyti pranešimą, pirmiausia turime inicijuoti parašo egzempliorių su subjekto, kuris pasirašo pranešimą, privačiu raktu.

parašas.initVerify (publickey);

Kad patikrintume pranešimą, turime inicijuoti parašo egzempliorių su subjekto, kuris teigia pasirašęs pranešimą, viešuoju raktu.

int n = 0; baitas [] rgb = naujas baitas [1000]; while ((n = inputstreamMessage.read (rgb))> -1) {parašas.update (rgb, 0, n); }

Toliau, nepaisant to, ar mes pasirašome, ar ne, mes turime perduoti pranešimą per parašų generatorių. Jūs pastebėsite, koks procesas yra panašus į ankstesnį pranešimo santraukos generavimo pavyzdį.

Paskutinis žingsnis - parašo sugeneravimas arba parašo patikrinimas.

rgb = parašas.pasirašymas ();

Jei pasirašome pranešimą, ženklas () metodas grąžina parašą.

parašas.patvirtinti (rgbSignature);

Jei mes tikriname parašą, sugeneruotą iš pranešimo, turime naudoti patikrinti () metodas. Kaip parametrą jis paima anksčiau sugeneruotą parašą ir nustato, ar jis vis dar galioja.

Prieš baigdami viską apžvelgti „Sign.java“, visą programos, kuri pasirašo pranešimą, šaltinio kodą ir „Verify.java“, visą programos, kuri patikrina pranešimą, šaltinio kodą.

Išvada

Jei apsiginklinsite įrankiais ir metodais, kuriuos pateikiau šį mėnesį, būsite pasirengę apsaugoti savo programas. „Java“ kriptografijos API daro procesą beveik be vargo. „Java Developers Kit“ 1.2 leidimas žada dar daugiau. Sekite naujienas.

Kitą mėnesį grįšiu į tarpinių programų teritoriją. Paimsiu šiek tiek RMI, šiek tiek gijų ir kodo kaupo ir parodysiu, kaip sukurti savo į pranešimą orientuotą tarpinę programinę įrangą.

Toddas Sundstedas rašė programas nuo tada, kai kompiuteriai tapo prieinami patogiais darbalaukio modeliais. Nors Toddas iš pradžių domėjosi platinamų objektų programų kūrimu C ++, Toddas perėjo prie „Java“ programavimo kalbos, kai tai tapo akivaizdžiu pasirinkimu tokiems dalykams. Be rašymo, Toddas yra „Etcee“, siūlančios mokymo, mentorystės, konsultavimo ir programinės įrangos kūrimo paslaugas, prezidentas.

Sužinokite daugiau apie šią temą

  • Atsisiųskite visą šaltinio kodą //www.javaworld.com/jw-01-1999/howto/jw-01-howto.zip
  • „Java Security“ API apžvalga //www.javasoft.com/products/jdk/1.1/docs/guide/security/JavaSecurityOverview.html
  • „Java“ kriptografijos architektūra //www.javasoft.com/products/jdk/1.1/docs/guide/security/CryptoSpec.html
  • „Sun“ „Java“ saugos puslapis //java.sun.com/security/index.html
  • RSA DUK apie kriptografiją //www.rsa.com/rsalabs/faq/
  • Kriptografijos politika ir informacija //www.crypto.com/
  • Perskaitykite ankstesnius Toddo „How-To Java“ stulpelius //www.javaworld.com/topicalindex/jw-ti-howto.html

Šią istoriją „Mes pasitikime„ Java ““ iš pradžių paskelbė „JavaWorld“.

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