Programmēšana

Java valodā mēs uzticamies

Uzticaties visiem? Neuzticies nevienam? Izklausās mazliet kā X faili, bet, kas attiecas uz konfidenciālu informāciju, zināt, kam jūs uzticaties, ir tikpat svarīgi, kā zināt, kam jūs viņiem uzticaties. Šī koncepcija ir tikpat svarīga lietojumprogrammām kā cilvēkiem. Galu galā mēs esam iesnieguši pieteikumus par mūsu informācijas glabātājiem un mūsu resursu pārvaldniekiem. Tā ir taisnība visā uzņēmumā - lietojumprogrammās ir kritiska informācija par mūsu biznesu un klientiem - un tā ir arī uz darbvirsmas. Es nevaru pateikt, cik reizes man ir jautāts, kā uzrakstīt sīklietotni, kas skenē lietotāja disku, lai viens lietotājs varētu komandēt cita lietotāja pārlūkprogrammu vai tvert privātu informāciju.

Java, tā kā tā ir tīkla attīstības platforma, ir nācies risināt uzticības problēmu. Rezultāts ir Java Security API un Java kriptogrāfijas arhitektūra.

Īss skatiens atpakaļ

Pirms es pilnīgi ienirstu API, kodā un komentāros, es vēlētos īsi pārskatīt pagājušā mēneša diskusiju. Ja pievienojaties mums pirmo reizi, iespējams, vēlēsities dublēt mēnesi un izlasīt sadaļu “Parakstīts un piegādāts: ievads drošībai un autentifikācijai”. Šajā slejā ir sniegts pilnīgs visu šo mēnesi izmantoto terminu un jēdzienu ievads.

Drošība un autentifikācija risina divas būtiskas problēmas: ziņojuma pierādīšanu ir izveidojusi konkrēta entītija, un ziņojuma pierādīšana pēc tās izveides netika traucēta. Viens veids, kā sasniegt abus šos mērķus, ir digitālo parakstu izmantošana.

Digitālie paraksti ir ļoti atkarīgi no kriptogrāfijas nozares, kas pazīstama kā publiskās atslēgas kriptogrāfija. Publiskās atslēgas algoritmus raksturo fakts, ka tie balstās uz saskaņotu atslēgu pāri (viena privāta un viena publiska), nevis vienu atslēgu. Uzņēmums glabā savu privāto atslēgu noslēpumā, bet dara pieejamu savu publisko atslēgu.

Digitālā paraksta algoritms kā ievadi ņem ziņojumu un entītijas privāto atslēgu un ģenerē ciparparakstu. Digitālais paraksts ir izveidots tā, lai ikviens varētu paņemt entītijas publisko atslēgu un izmantot to, lai pārliecinātos, ka entītija tiešām ir parakstījusi attiecīgo ziņojumu. Turklāt, ja sākotnējais ziņojums ir sagrozīts, parakstu vairs nevar pārbaudīt. Digitālie paraksti sniedz vēl vienu labumu: tiklīdz uzņēmums ir parakstījis un izplatījis ziņojumu, tā autors nevar noliegt, ka viņš ir parakstījis ziņojumu (vienalga nepretendējot uz viņa vai viņas privātās atslēgas nozagšanu).

No dzinējiem un piegādātājiem

Java kriptogrāfijas API definē Java rīkkopu drošībai un autentifikācijai. Java kriptogrāfijas arhitektūrā (JCA) ir aprakstīts, kā izmantot API. Lai nodrošinātu visaugstāko elastību gan izstrādātājam, gan gala lietotājam, JCA ietver divus pamatprincipus:

  1. Arhitektūrai jāatbalsta algoritmu neatkarība un paplašināmība. Izstrādātājam jāspēj rakstīt lietojumprogrammas, nesaistot tās pārāk cieši ar konkrētu algoritmu. Turklāt, izstrādājot jaunus algoritmus, tie ir viegli jāintegrē ar esošajiem algoritmiem.

  2. Arhitektūrai būtu jāatbalsta ieviešanas neatkarība un savietojamība. Izstrādātājam jāspēj rakstīt lietojumprogrammas, nesaistot tās ar konkrētu pārdevēja algoritma ieviešanu. Turklāt jāsadarbojas dažādu piegādātāju nodrošinātiem algoritmiem.

Lai apmierinātu šīs divas prasības, Java kriptogrāfijas API izstrādātāji savu dizainu pamatoja ar dzinēju un nodrošinātāju sistēmu.

Dzinēji ražo ziņojumu apkopošanas ģeneratoru, digitālā paraksta ģeneratoru un atslēgu pāra ģeneratoru gadījumus. Katrs gadījums tiek izmantots atbilstošās funkcijas veikšanai.

JCA kanoniskais dzinējs ir klase, kas nodrošina nosauktu statisko metodi (vai metodes) getInstance (), kas atgriež klases eksemplāru, kas ievieš kriptogrāfiski nozīmīgu algoritmu. The getInstance () metode ir gan viena, gan divu argumentu formā. Abos gadījumos pirmais arguments ir algoritma nosaukums. JCA sniedz standarta nosaukumu sarakstu, lai gan ne visi tiks sniegti nevienā konkrētā laidienā. Otrais arguments izvēlas pakalpojumu sniedzēju.

SUN pakalpojumu sniedzējs

Tikai viens pakalpojumu sniedzējs - SUN - tiek piegādāts JDK 1.1. SUN nodrošina gan NIST digitālā paraksta algoritma (DSA), gan MD5 un NIST SHA-1 ziņojumu apkopojuma algoritmu ieviešanu.

Klases MessageDigest

Mēs sāksim apskatīt kodu, kas ģenerē ziņojuma īssavilkumu.

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

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

Kā es minēju tikai pirms brīža, getInstance () metode ir divu garšu. Pirmajam ir nepieciešams norādīt tikai algoritmu. Otrais prasa norādīt gan algoritmu, gan nodrošinātāju. Abi atgriež klases eksemplāru, kas ievieš SHA algoritmu.

Tālāk mēs nododam ziņojumu caur ziņu apkopojuma ģeneratoru.

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

Šeit mēs pieņemam, ka ziņojums ir pieejams kā ievades straume. Šis kods labi darbojas lielos nezināmā garuma ziņojumos. The Atjaunināt() metode arī pieņem vienu baitu kā argumentu dažu baitu gariem ziņojumiem un fiksētu vai paredzamu izmēru ziņojumu baitu masīvu.

rgb = messagedigest.digest ();

Pēdējais solis ir pats ziņas sagremošanas ģenerēšana. Iegūtais īssavilkums tiek kodēts baitu masīvā.

Kā redzat, JCA ērti slēpj visas zemā līmeņa ieviešanas un algoritmiem raksturīgās detaļas, ļaujot strādāt augstākā, abstraktākā līmenī.

Protams, viens no šādas abstraktas pieejas riskiem ir palielināta varbūtība, ka mēs neatzīsim kļūdainu izlaidi. Ņemot vērā kriptogrāfijas lomu, tā var būt būtiska problēma.

Apsveriet kļūdu “pa vienam” zemāk esošajā atjaunināšanas rindiņā:

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

C, C ++ un Java programmētāji ierobežojumu-mīnus-viena idiomu izmanto tik bieži, ka tā rakstīšana kļūst gandrīz automātiska - pat tad, ja tā nav piemērota. Iepriekš minētais kods tiks apkopots, un izpildāmā programma darbosies bez kļūdām vai brīdinājumiem, taču iegūtais ziņu apkopojums būs nepareizs.

Par laimi, JCA ir labi pārdomāts un labi izstrādāts, padarot iespējamās kļūmes, piemēram, iepriekš minētās, salīdzinoši reti.

Pirms pārejam pie atslēgu pāra ģeneratoriem, ieskatieties

MessageDigestGenerator - pilns programmas avots, kas ģenerē ziņojumu apkopojumu.

Klases KeyPairGenerator

Lai ģenerētu digitālo parakstu (un šifrētu datus), mums ir nepieciešamas atslēgas.

Atslēgu ģenerēšana no algoritmiem neatkarīgā formā nav būtiski grūtāka nekā ziņu apkopojuma izveide un izmantošana.

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

Tāpat kā iepriekš ziņojuma īssavilkuma piemērā, šis kods izveido klases gadījumu, kas ģenerē ar DSA saderīgas atslēgas. Otrais (ja nepieciešams) arguments norāda pakalpojumu sniedzēju.

Pēc tam, kad ir izveidots atslēgu pāra ģeneratora gadījums, tas ir jāinicializē. Mēs varam inicializēt atslēgu pāra ģeneratorus vienā no diviem veidiem: neatkarīgs no algoritma vai atkarīgs no algoritma. Kuru metodi izmantojat, ir atkarīgs no kontroles apjoma, kuru vēlaties iegūt par galīgo rezultātu.

keypairgenerator.initialize (1024, jauns SecureRandom ());

Atslēgas, kuru pamatā ir dažādi algoritmi, atšķiras pēc to ģenerēšanas veida, taču tām ir viens kopīgs parametrs - atslēgas spēks. Spēks ir relatīvs termins, kas aptuveni atbilst tam, cik grūti būs atslābināties. Ja izmantojat no algoritmiem neatkarīgu inicializētāju, varat norādīt tikai stiprumu - jebkuras no algoritmiem atkarīgās vērtības pieņem pieņemamus noklusējumus.

DSAKeyPairGenerator dsakeypairgenerator = (DSAKeyPairGenerator) taustiņu pāru ģenerators; DSAParams dsaparams = new DSAParams () {private BigInteger p = BigInteger (...); privāts BigInteger q = BigInteger (...); privāts BigInteger g = BigInteger (...); publiskais BigInteger getP () {return p; } public BigInteger getQ () {return q; } public BigInteger getG () {return g; }}; dsakeypairgenerator.initialize (dsaparams, jauns SecureRandom ());

Lai gan noklusējumi parasti ir pietiekami labi, ja jums nepieciešama lielāka kontrole, tā ir pieejama. Pieņemsim, ka jūs izmantojāt motoru, lai izveidotu ar DSA saderīgu atslēgu ģeneratoru, kā norādīts iepriekš esošajā kodā. Aiz ainas motors ielādēja un radīja piemēru no klases, kas īsteno DSAKeyPairGenerator interfeiss. Ja mēs nodosim saņemto vispārīgo atslēgu pāra ģeneratoru DSAKeyPairGenerator, tad mēs iegūstam piekļuvi no algoritma atkarīgai inicializācijas metodei.

Lai inicializētu DSA atslēgu pāra ģeneratoru, mums ir nepieciešamas trīs vērtības: galvenā P, subprime Q, un pamats G. Šīs vērtības tiek uztvertas iekšējās klases instancē, kas tiek nodota palaist() metodi.

The SecureRandom klase nodrošina drošu nejaušu skaitļu avotu, ko izmanto atslēgu pāra ģenerēšanā.

atgriezties keypairgenerator.generateKeyPair ();

Pēdējais solis ir pats atslēgas pāra ģenerēšana.

Pirms pārejam pie digitālajiem parakstiem, ieskatieties KeyTools - pilnā avota kodā programmai, kas ģenerē atslēgu pāri.

Klases paraksts

Windows eksemplāra izveide un izmantošana Paraksts klase būtiski neatšķiras no abiem iepriekšējiem piemēriem. Atšķirības slēpjas instances lietošanā - vai nu parakstīt, vai arī pārbaudīt ziņojumu.

Paraksta paraksts = Signature.getInstance ("DSA");

Tāpat kā iepriekš, mēs izmantojam motoru, lai iegūtu atbilstoša tipa gadījumu. Tas, ko mēs darīsim tālāk, ir atkarīgs no tā, vai mēs parakstām vai verificējam ziņojumu.

paraksts.initSign (privatekey);

Lai parakstītu ziņojumu, mums vispirms ir jāinicializē paraksta instance ar tās personas privāto atslēgu, kura paraksta ziņojumu.

paraksts.initVerify (publickey);

Lai pārbaudītu ziņojumu, mums ir jāinicializē paraksta gadījums ar tās vienības publisko atslēgu, kura apgalvo, ka tā parakstīja ziņojumu.

int n = 0; baits [] rgb = jauns baits [1000]; while ((n = inputstreamMessage.read (rgb))> -1) {paraksts.update (rgb, 0, n); }

Pēc tam, neatkarīgi no tā, vai mēs parakstāmies vai nepārbaudām, mums jānodod ziņojums caur parakstu ģeneratoru. Jūs ievērosiet, cik process ir līdzīgs iepriekšējam ziņu īssavilkuma ģenerēšanas piemēram.

Pēdējais solis ir paraksta ģenerēšana vai paraksta pārbaude.

rgb = paraksts.paraksts ();

Ja mēs parakstām ziņojumu, zīme () metode atgriež parakstu.

paraksts.verificēt (rgbSignature);

Ja mēs pārbaudām parakstu, kas iepriekš ģenerēts no ziņojuma, mums jāizmanto pārbaudīt () metodi. Tas kā parametru ņem iepriekš ģenerēto parakstu un nosaka, vai tas joprojām ir derīgs.

Pirms mēs iesakām lietas, apskatiet Sign.java, pilnu programmas avota kodu, kas paraksta ziņojumu, un Verify.java, pilnu programmas kodu, kas pārbauda ziņojumu.

Secinājums

Ja jūs apbruņosities ar rīkiem un paņēmieniem, kurus es šomēnes prezentēju, jūs būsiet vairāk nekā gatavs aizsargāt savas lietojumprogrammas. Java kriptogrāfijas API padara procesu gandrīz bez piepūles. Java Developers Kit 1.2 izlaidums sola vēl vairāk. Sekojiet līdzi.

Nākamajā mēnesī es atgriezīšos starpprogrammatūras teritorijā. Es paņemšu nelielu RMI, dažus pavedienus un koda kaudzi un parādīšu, kā izveidot pats uz ziņojumu orientētu starpprogrammatūru.

Kopš datori kļuva pieejami ērtos galddatoru modeļos, Tods Sundsteds raksta programmas. Lai gan Tods sākotnēji interesējās par izplatītu objektu lietojumprogrammu izveidi C ++, Tods pārgāja uz Java programmēšanas valodu, kad tā kļuva par acīmredzamu izvēli šāda veida lietām. Papildus rakstam Tods ir Etcee prezidents, kas piedāvā apmācības, mentoringa, konsultāciju un programmatūras izstrādes pakalpojumus.

Uzziniet vairāk par šo tēmu

  • Lejupielādējiet pilnu pirmkodu //www.javaworld.com/jw-01-1999/howto/jw-01-howto.zip
  • Java drošības API pārskats //www.javasoft.com/products/jdk/1.1/docs/guide/security/JavaSecurityOverview.html
  • Java kriptogrāfijas arhitektūra //www.javasoft.com/products/jdk/1.1/docs/guide/security/CryptoSpec.html
  • Sun Java Java lapa //java.sun.com/security/index.html
  • RSA FAQ par kriptogrāfiju //www.rsa.com/rsalabs/faq/
  • Kriptogrāfijas politika un informācija //www.crypto.com/
  • Izlasiet Todda iepriekšējās How-To Java slejas //www.javaworld.com/topicalindex/jw-ti-howto.html

Šo stāstu “Mēs ticam Java valodā” sākotnēji publicēja JavaWorld.

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