Kryptographie in Java: Verschlüsselung und Hashing
In der modernen Welt der Informationssicherheit spielt Kryptographie eine Schlüsselrolle. Java bietet leistungsstarke integrierte Werkzeuge zur Umsetzung kryptographischer Operationen über die Java Cryptography Architecture (JCA) und die Java Cryptography Extension (JCE). In diesem Artikel werden wir die grundlegenden Mechanismen im Detail erläutern: symmetrische Verschlüsselung, asymmetrische Verschlüsselung und Hashing, sowie praktische Codebeispiele liefern.
Grundlegende Konzepte der Kryptographie
Bevor wir zum Code übergehen, ist es wichtig, den Unterschied zwischen den grundlegenden kryptographischen Primitiven zu verstehen:
- Symmetrische Verschlüsselung – verwendet denselben Schlüssel zum Verschlüsseln und Entschlüsseln von Daten. Schnell, erfordert jedoch eine sichere Schlüsselübertragung.
- Asymmetrische Verschlüsselung – verwendet ein Schlüsselpaar: einen öffentlichen (zum Verschlüsseln) und einen privaten (zum Entschlüsseln). Langsamer, löst aber das Problem des Schlüsselaustauschs.
- Hashing – irreversible Umwandlung von Daten in eine Zeichenkette fester Länge. Wird zur Integritätsprüfung und zur Speicherung von Passwörtern verwendet.
Symmetrische AES-Verschlüsselung in Java
AES (Advanced Encryption Standard) ist der beliebteste symmetrische Algorithmus. In Java erfolgt die Arbeit damit über die Klasse Cipher. Betrachten wir ein Beispiel für die Ver- und Entschlüsselung einer Zeichenkette:
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;
public class AesExample { public static void main(String[] args) throws Exception { // Generierung eines AES-128-Schlüssels KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey secretKey = keyGen.generateKey(); // Ursprüngliche Nachricht String originalMessage = "Привет, криптография!"; System.out.println("Ursprüngliche Nachricht: " + originalMessage); // Verschlüsselung Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(originalMessage.getBytes("UTF-8")); String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Verschlüsselte Nachricht: " + encryptedMessage); // Entschlüsselung cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage)); String decryptedMessage = new String(decryptedBytes, "UTF-8"); System.out.println("Entschlüsselte Nachricht: " + decryptedMessage); }}Im Beispiel wird der ECB-Modus (Electronic Codebook) mit PKCS5Padding-Auffüllung verwendet. Für die Produktion wird empfohlen, sicherere Modi wie CBC oder GCM zu verwenden.
Asymmetrische RSA-Verschlüsselung
RSA ist der klassische asymmetrische Algorithmus. In Java werden für die Arbeit damit die Klassen KeyPairGenerator und Cipher verwendet. Wichtig zu beachten: RSA kann nur Daten bis zur Schlüsselgröße (normalerweise 2048 Bit) verschlüsseln. Für größere Datenmengen wird RSA mit symmetrischer Verschlüsselung kombiniert (Hybridschema).
import javax.crypto.Cipher;import java.security.*;import java.util.Base64;
public class RsaExample { public static void main(String[] args) throws Exception { // Generierung eines RSA-2048-Schlüsselpaars KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String secretMessage = "Секретные данные"; System.out.println("Ursprüngliche Nachricht: " + secretMessage); // Verschlüsselung mit öffentlichem Schlüssel