Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis
Vorwort
1 Neues in Java 8 und Java 7
2 Fortgeschrittene String-Verarbeitung
3 Threads und nebenläufige Programmierung
4 Datenstrukturen und Algorithmen
5 Raum und Zeit
6 Dateien, Verzeichnisse und Dateizugriffe
7 Datenströme
8 Die eXtensible Markup Language (XML)
9 Dateiformate
10 Grafische Oberflächen mit Swing
11 Grafikprogrammierung
12 JavaFX
13 Netzwerkprogrammierung
14 Verteilte Programmierung mit RMI
15 RESTful und SOAP-Web-Services
16 Technologien für die Infrastruktur
17 Typen, Reflection und Annotationen
18 Dynamische Übersetzung und Skriptsprachen
19 Logging und Monitoring
20 Sicherheitskonzepte
21 Datenbankmanagement mit JDBC
22 Java Native Interface (JNI)
23 Dienstprogramme für die Java-Umgebung
Stichwortverzeichnis

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 20 Sicherheitskonzepte
Pfeil 20.1 Zentrale Elemente der Java-Sicherheit
Pfeil 20.1.1 Sichere Java Virtual Machine
Pfeil 20.1.2 Der Sandkasten (Sandbox)
Pfeil 20.1.3 Security-API der Java SE
Pfeil 20.1.4 Cryptographic Service Providers
Pfeil 20.2 Sicherheitsmanager (Security-Manager)
Pfeil 20.2.1 Der Sicherheitsmanager bei Applets
Pfeil 20.2.2 Sicherheitsmanager aktivieren
Pfeil 20.2.3 Rechte durch Policy-Dateien vergeben
Pfeil 20.2.4 Erstellen von Rechtedateien mit dem grafischen Policy-Tool
Pfeil 20.2.5 Kritik an den Policies
Pfeil 20.3 Signierung
Pfeil 20.3.1 Warum signieren?
Pfeil 20.3.2 Digitale Ausweise und die Zertifizierungsstelle
Pfeil 20.3.3 Mit keytool Schlüssel erzeugen
Pfeil 20.3.4 Signieren mit jarsigner
Pfeil 20.4 Kryptografische Hashfunktion
Pfeil 20.4.1 Die MDx-Reihe
Pfeil 20.4.2 Secure Hash Algorithm (SHA)
Pfeil 20.4.3 Mit der Security-API einen Fingerabdruck berechnen
Pfeil 20.4.4 Die Klasse MessageDigest
Pfeil 20.5 Verschlüsseln von Daten(-strömen) *
Pfeil 20.5.1 Den Schlüssel, bitte
Pfeil 20.5.2 Verschlüsseln mit Cipher
Pfeil 20.5.3 Verschlüsseln von Datenströmen
Pfeil 20.6 Zum Weiterlesen
 
Zum Seitenanfang

20.5Verschlüsseln von Daten(-strömen) * Zur vorigen ÜberschriftZur nächsten Überschrift

Kryptografie unterscheidet zwischen asymmetrischer und symmetrischer Verschlüsselung. Ist die Kommunikation asymmetrisch, sind zwei Schlüssel nötig: ein öffentlicher und ein privater. Bei der symmetrischen Verschlüsselung ist nur ein Schlüssel erforderlich, der bei der Ver- und Entschlüsselung gleich ist. Bekanntester Vertreter der symmetrischen Verschlüsselung ist DES (Data Encryption Standard), der allerdings wegen seiner geringen Schlüssellänge nicht mehr aktuell ist. DES wurde 1981 in den USA als ANSI-Standard normiert. Bei den asymmetrischen Verfahren ist die RSA-Verschlüsselung die bekannteste. Ihre Sicherheit basiert auf dem mathematischen Problem, für eine große Ganzzahl eine Primfaktorzerlegung zu finden. Asymmetrische Verschlüsselung ist im Vergleich zu symmetrischen Verschlüsselungen langsam.

 
Zum Seitenanfang

20.5.1Den Schlüssel, bitte Zur vorigen ÜberschriftZur nächsten Überschrift

Jeder Schlüssel, sei er privat oder öffentlich, implementiert die Basisschnittstelle java.security.Key. Von dieser Schnittstelle gibt es Unterschnittstellen, etwa PublicKey, PrivateKey für die asymmetrischen Schlüssel oder SecretKey für den symmetrischen Schlüssel. Von diesen Schnittstellen existieren weitere Unterschnittstellen.

Schlüssel aus der Fabrik

Um Schlüssel zu erzeugen, gibt es zwei Fabriken: KeyGenerator erzeugt symmetrische Schlüssel und KeyPairGenerator asymmetrische. Der Fabrikmethode getInstance(String) ist dabei eine Kennung zu übergeben, die für den Algorithmus steht.

Listing 20.9com/tutego/security/crypto/KeyGeneratorDemo.java, main()

KeyGenerator kg = KeyGenerator.getInstance( "DES" );
KeyPairGenerator kpg = KeyPairGenerator.getInstance( "RSA" );

Der nächste Schritt sieht eine Initialisierung des Schlüssels mit zufälligen Werten vor. Ohne Initialisierung kann jeder Provider unterschiedlich verfahren.

kg.init( 56 ); // nicht größer als 56!
kpg.initialize( 1024 );

Nicht besonders schlau ist, dass einmal bei javax.crypto.KeyGenerator die Methode init(…) heißt und dann einmal initialize(…) bei java.security.KeyPairGenerator.Beiden Methoden lässt sich noch ein Zufallszahlengenerator mitgeben, doch intern ist das SecureRandom schon sehr gut. Kryptografische Angaben kann ein Objekt vom Typ AlgorithmParameterSpec einführen.

Der letzte Schritt besteht im Erfragen der Schlüssel:

SecretKey secKey = kg.generateKey();
KeyPair keyPair = kpg.genKeyPair();

Bei einer Ausgabe des symmetrischen Schlüssels über System.out.println(…) kommt nicht viel Sinnvolles heraus, doch bei den privaten und öffentlichen Schlüsseln, die keyPair mit getPublic() und getPrivate() offenlegt, implementieren PublicKey und PrivateKey eine ansehnliche toString()-Methode:

System.out.println( keyPair.getPublic() );

Liefert:

SunJSSE RSA public key:
public exponent:
010001
modulus:
a8186ac3 03b9417e c0247c70 d225ae75 04d2fa3b 9b21e009 ca32a1f3 3cc7404f
aeb6df52 0aa4d9ab ae35a5d5 d7b30f38 ce670895 3234fab2 c67f1211 b9dab8d2
edda3a7b 710fbf86 0274a2a6 842c4d73 76fc2166 80ef1e82 36a949f9 8180c5c7
004cffdd c103b42b 9abf216d 5f797440 20b8ec52 afe44407 a871e1f7 0e27fec9

System.out.println(keyPair.getPrivate()) liefert eine noch längere Ausgabe mit Exponent, Modulo usw.

SecretKeySpec

Schlüssel für die symmetrische Verschlüsselung sind nichts anderes als Binärfelder. Die Klasse javax.crypto.spec.SecretKeySpec dient dem Erzeugen eines symmetrischen Schlüssels und erwartet im Konstruktor das Byte-Feld und den Algorithmus.

Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );

Für andere Typen existieren wiederum andere Klassen. Zum Beispiel erzeugt DSAPrivateKeySpec einen privaten Schlüssel aus einem anderen Schlüssel, zwei Primzahlen und einer Basis, die als BigInteger-Objekte angegeben sind.

 
Zum Seitenanfang

20.5.2Verschlüsseln mit Cipher Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse javax.crypto.Cipher bildet das Zentrum der JCE. Nachdem init(…) das Objekt mit einem Modus und Schlüssel initialisiert hat, lassen sich mit update(byte[]) Daten durchschleusen. doFinal() bzw. doFinal(byte[][, …])-Varianten runden das Ganze dann ab. Die Rückgabe ist immer ein verschlüsselter byte-Block:

Cipher cipher = Cipher.getInstance( "DES" );
cipher.init( Cipher.ENCRYPT_MODE, key );
byte[] verschlüsselt = cipher.doFinal( unverschlüsselt );

Beim Entschlüsseln wird der Cipher einfach in den Modus Cipher.DECRYPT_MODE gesetzt.

 
Zum Seitenanfang

20.5.3Verschlüsseln von Datenströmen Zur vorigen ÜberschriftZur nächsten Überschrift

Zum Verschlüsseln von Datenströmen bietet die Java-Bibliothek die praktischen Klassen javax.crypto.CipherInputStream und CipherOutputStream an. Sie erwarten ein Cipher-Objekt, das eine DES-Verschlüsselung durchführt:

Listing 20.10com/tutego/security/crypto/ReadWriteDES.java

package com.tutego.security.crypto;

import java.io.*;
import java.math.BigInteger;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

public class ReadWriteDES {

static void encode( byte[] bytes, OutputStream out, String pass )
throws GeneralSecurityException, IOException {
Cipher c = Cipher.getInstance( "DES" );
Key k = new SecretKeySpec( pass.getBytes(), "DES" );
c.init( Cipher.ENCRYPT_MODE, k );

try ( OutputStream cos = new CipherOutputStream( out, c ) ) {
cos.write( bytes );
}
}

static byte[] decode( InputStream is, String pass )
throws GeneralSecurityException, IOException {
Cipher c = Cipher.getInstance( "DES" );
Key k = new SecretKeySpec( pass.getBytes(), "DES" );
c.init( Cipher.DECRYPT_MODE, k );

ByteArrayOutputStream bos = new ByteArrayOutputStream( 1024 );

try ( CipherInputStream cis = new CipherInputStream( is, c ) ) {
for ( int b; (b = cis.read()) != -1; )
bos.write( b );
}

return bos.toByteArray();
}

public static void main( String[] args ) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
encode( "Das wird anders werden".getBytes(), out, "01234567" );

byte[] encoded = out.toByteArray();
String s = new BigInteger( encoded ).toString( 16 );
System.out.println( s );

byte[] decoded = new BigInteger( s, 16 ).toByteArray();
InputStream is = new ByteArrayInputStream( decoded );
System.out.println( new String( decode( is, "01234567" ) ) );
}
}

Unsere Methoden encode(…) und decode(…) leiten eine GeneralSecurityException an den Aufrufer weiter, eine Basisklasse von NoSuchAlgorithmException und NoSuchPaddingException; das sind zwei Ausnahmen, die der Cipher auslöst.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern