Java Language
Beveiliging en cryptografie
Zoeken…
Invoering
Beveiligingspraktijken in Java kunnen worden onderverdeeld in twee brede, vaag gedefinieerde categorieën; Java-platformbeveiliging en veilige Java-programmering.
Beveiligingspraktijken op Java-platform houden zich bezig met het beheer van de beveiliging en integriteit van de JVM. Het bevat onderwerpen als het beheer van JCE-providers en beveiligingsbeleid.
Beveiligde Java-programmeermethoden betreffen de beste manieren om veilige Java-programma's te schrijven. Het bevat onderwerpen als het gebruik van willekeurige getallen en cryptografie en het voorkomen van kwetsbaarheden.
Opmerkingen
Hoewel voorbeelden duidelijk moeten worden gemaakt, zijn enkele onderwerpen die moeten worden behandeld:
- Het concept / de structuur van de JCE-provider
- Lijstitem
De JCE
De Java Cryptography Extension (JCE) is een in de JVM ingebouwd framework waarmee ontwikkelaars cryptografie gemakkelijk en veilig in hun programma's kunnen gebruiken. Het doet dit door programmeurs een eenvoudige, draagbare interface te bieden, terwijl een systeem van JCE Providers wordt gebruikt om de onderliggende cryptografische bewerkingen veilig te implementeren.
Sleutels en sleutelbeheer
Hoewel de JCE cryptografische bewerkingen en het genereren van sleutels beveiligt, is het aan de ontwikkelaar om hun sleutels daadwerkelijk te beheren. Meer informatie moet hier worden verstrekt.
Een algemeen geaccepteerde best practice voor het verwerken van sleutels tijdens runtime is om ze alleen als byte
arrays op te slaan en nooit als tekenreeksen. Dit komt omdat Java-tekenreeksen onveranderlijk zijn en niet handmatig in het geheugen kunnen worden "gewist" of "op nul gezet"; terwijl een verwijzing naar een string kan worden verwijderd, blijft de exacte string in het geheugen totdat het geheugensegment wordt verzameld en hergebruikt. Een aanvaller zou een groot venster hebben waarin ze het geheugen van het programma kunnen dumpen en gemakkelijk de sleutel kunnen vinden. byte
arrays zijn daarentegen veranderlijk en kunnen hun inhoud overschrijven; het is een goed idee om uw sleutels op nul te zetten zodra u ze niet meer nodig hebt.
Gemeenschappelijke Java-kwetsbaarheden
Heeft inhoud nodig
Netwerkproblemen
Heeft inhoud nodig
Willekeur en jij
Heeft inhoud nodig
Voor de meeste toepassingen is de klasse java.utils.Random
een prima bron van "willekeurige" gegevens. Als u een willekeurig element uit een array moet kiezen, of een willekeurige tekenreeks moet genereren of een tijdelijke "unieke" identificatie moet maken, moet u waarschijnlijk Random
.
Veel cryptografische systemen vertrouwen echter op willekeur voor hun veiligheid, en de willekeur die door Random
wordt geboden, is gewoon niet van voldoende kwaliteit. Voor elke cryptografische bewerking die een willekeurige invoer vereist, moet u SecureRandom
plaats daarvan SecureRandom
gebruiken.
Hashing en validatie
Meer informatie nodig.
Een cryptografische hashfunctie is lid van een klasse functies met drie vitale eigenschappen; consistentie, uniciteit en onomkeerbaarheid.
Consistentie: gegeven dezelfde gegevens, retourneert een hashfunctie altijd dezelfde waarde. Dat wil zeggen, als X = Y, zal f (x) altijd gelijk zijn aan f (y) voor de hashfunctie f.
Uniciteit: Geen twee ingangen voor een hash-functie zullen ooit resulteren in dezelfde uitgang. Dat wil zeggen, als X! = Y, f (x)! = F (y), voor alle waarden van X en Y.
Onomkeerbaarheid: het is onpraktisch moeilijk, zo niet onmogelijk, om een hashfunctie te "omkeren". Dat wil zeggen, gegeven alleen f (X), er zou geen manier moeten zijn om de originele X te vinden door elke mogelijke waarde van X via de functie f (brute-force) te plaatsen. Er mag geen functie f1 zijn zodat f1 (f (X)) = X.
Veel functies missen ten minste een van deze attributen. Van MD5 en SHA1 is bijvoorbeeld bekend dat ze botsingen hebben, dat wil zeggen twee ingangen die dezelfde uitgang hebben, zodat ze niet uniek zijn. Sommige functies die op dit moment als veilig worden beschouwd, zijn SHA-256 en SHA-512.