Sikkerhed er en af de vigtigste dele af applikationsudvikling. Java-sproget gør det nemt at udvikle sikre applikationer ved at tilbyde mange muligheder og funktioner, der gør applikationer sikre. Fordi det er et stort emne, skal denne artikel komme ind på nogle få nøgleaspekter af sikkerhedsfunktionerne og API'erne, der er tilgængelige på Java-platformen.
Oversigt
Java-platformen fra bunden er bygget med sikkerhed i tankerne. Den typesikre egenskab for sproget og automatisk affaldsindsamling angiver, at Java-arkitekturen forsøgte at opsuge sikkerhedsfunktioner lige fra sin kerne.
I de senere år har sikkerhed været et stort fokus. For eksempel arbejder moderne browsere på at begrænse eller reducere plug-in-understøttelse såsom Java, Silverlight og Flash, fordi de kan misbruges til at inkorporere ondskabsfuld kode i et harmløst udseende tilføjelse. Selvom Java-miljøet er rent, er applettens natur, at den downloader kode, der ikke er tillid til, fra det offentlige netværk. Dette kan være et stort sikkerhedsbrud. Også browserverdenen har ændret sig markant i de sidste par år. Det absolutte behov for Applet er blevet næsten forældet. Måske dette og primært den stigende sikkerhedsbekymring gjorde, at Applet blev udfaset fra Java 9.
Java Security Framework
Java Security-tjenester er blevet udvidet og omfatter et stort sæt applikationsprogrammeringsgrænseflader (API'er), værktøjer, en række implementeringer af sikkerhedsalgoritmer, mekanismer og protokoller. Dette giver et omfattende miljø til at udvikle sikre applikationer og administrere dem i overensstemmelse hermed.
Spændvidden af Java Security API er omfattende. Grundlaget for at udvikle en sikker applikation ligger i grænseflader til kryptografisk og offentlig nøgleinfrastruktur (PKI), flere interoperable fælles algoritmiske implementeringer og andre sikkerhedstjenester. Der er grænseflader til at udføre godkendelse og adgangskontrol. Dette gør det muligt for applikationer at beskytte sig mod uautoriseret adgang til beskyttede ressourcer.
Sprogsikkerhed
Til at begynde med er selve sproget bygget med en bekymring for at indsluse sikkerhed i sin kerne. Det enkleste eksempel er måske inkorporeringen af typesikkerhed. Skriv sikkert betyder, at programmer har begrænset adgang til hukommelse ved kørsel. Dette opnås ved kun at knytte hukommelse til Java-objekter. Objekter har en tilsvarende klasse, der definerer deres adfærd; dette sikrer, at programmet kun kan handle på det i henhold til den definerede adfærd. Denne idé giver genlyd med dynamisk typekontrol, men Java inkorporerer også kompleks statisk typekontrol, når det er muligt, for at bukke under begrænsningen af dens dynamiske modstykke. For eksempel er bytekodeverifikatoren en effektiv statisk typekontrol, der bruges på kompileringstidspunktet for at synliggøre enhver type fejl og proaktivt rapportere til udvikleren. Bytecode-verifikatoren sikrer, at en lovlig bytekode udføres ved at overholde Java-sprogspecifikationen. Udover dette tjekker den også for hukommelsesbrud, stak under/overløb, korrekte typecasts og så videre. Ud over dette er der modifikatorer som privat, beskyttet og offentlig for at hævde begrænset adgang.
Sikkerhedsudbydere
Tjenesterne fungerer som en udbyder af sikkerhed. De, når de er tilsluttet Java-platformen via standardgrænseflader, gør det nemt for applikationen at opnå sikkerhedstjenester. Fordelen ved denne mekanisme er, at udvikleren ikke behøver at kende til de indviklede detaljer og i stedet kan fokusere på at integrere sikkerhedsfunktionerne i applikationen. Denne idé er indkapslet i den abstrakte klasse kaldet java.security.Provider . Sikkerhedstjenesten fås gennem getInstance() metode leveret af Udbyderen . Der kan være konfigureret mange udbydere, hvor hver har et navn og et versionsnummer konfigureret i hver runtime, det er installeret i. Et program kan f.eks. få en bestemt beskedsammenfatningsalgoritme ved valgfrit at anmode en specifik udbyder om dens navn som følger:
MessageDigest messageDigest = MessageDigest.getInstance("MD5", "MyProvider1");
Kryptografi
Java kryptografiske API'er er fordelt på to pakker:java.security og javax.crypto . Java tilbyder en lang række kryptografiske tjenester ved at implementere en række kryptografiske algoritmer. Et par af dem er som følger:
- java.security.MessageDigest: Denne klasse giver implementeringen af en envejs-hash-funktion, der tager data i vilkårlig størrelse og udsender en hashværdi med fast længde. Algoritmen hedder SHA-1 eller SHA-256.
- java.security.Signatur: Denne klasse bruges til at levere funktionaliteten af en digital signaturalgoritme, såsom DSA-, RSA- eller DSA-algoritmer, ved hjælp af SHA-256-meddelelsessammenslutningsalgoritmen. En digital signatur bruges især til at sikre integriteten og ægtheden af digitale data.
- java.security.SecureRandom: Denne klasse giver funktionalitet til at generere et kryptografisk stærkt tilfældigt tal.
Public Key Infrastructure (PKI)
PKI-infrastrukturen muliggør sikker udveksling af data ved hjælp af offentlig nøglekryptering. Det omfatter nøgler, certifikater, offentlig nøglekryptering og digitale certifikater. Klasserne relateret til PKI er gemt i java.security og java.security.cert pakker.
Godkendelse
Godkendelse er processen med at bekræfte brugerens identitet. Java gør det muligt for applikationen at udføre brugergodkendelse ved hjælp af det pluggbare modul. Der er en klasse kaldet LoginContext i javax.security.auth.login pakke. Denne klasse instansieres med et navn og en CallbackHandler. LoginContext bruger navnet som et indeks til konfigurationen. Konfigurationen bestemmer det specifikke LoginModule (javax.security.auth.spi.LoginModule ). CallbackHandler videregives til LoginModule for at bede om brugernavn og adgangskode, f.eks. i en GUI.
Sikker kommunikation
Java-platformen implementerer SSL- og TLS-protokoller, som giver funktionalitet til meddelelsesintegritet, datakryptering og klient- og servergodkendelse. Dette kan bruges til at bane en sikker passage af datakommunikation mellem peers oven på HTTP- eller TCP/IP-protokollen. API-understøttelsen til implementeringen kan findes i javax.net.ssl pakke. Der er mange støtteklasser; for eksempel SSLSocket klasse er en udvidelse af java.net.Socket klasse for at give en sikker socket ved hjælp af SSL/TLS-protokol. Dette er intet andet end en normal stream-socket med et ekstra lag af beskyttelse over transportlagprotokollen (TCP).
Adgangskontrol
Adgangskontrolklassen beskytter adgang til følsomme ressourcer såsom lokale filer. java.lang.SecurityManager klasse formidler al adgang. Denne klasse tillader applikationen at implementere en sikkerhedspolitik. Derfor kan en mulig usikker operation være begrænset i forsøget, og applikationen har således fuld kontrol over tilladte operationer.
Konklusion
Dette er en hurtig tur over Java-platformens sikkerhedsfunktioner, -funktionalitet og API'er. Java giver omfattende support til at implementere sikkerhed i en applikation, hvor udviklere kan være lykkeligt uvidende om de kompleksiteter, der er involveret i at implementere dem, men alligevel høste fordelene. Dette udnytter hurtig og effektiv levering af produktet uden at skulle bygge alt fra bunden.
Referencer
- Java API-dokumentation
- Java-sikkerhedsoversigt