Kryptographie in Java: Verschlüsselung und Hashing – vollständiger Leitfaden
Kryptographie ist die grundlegende Basis für die Sicherheit moderner Anwendungen. In Java ist eine leistungsstarke und flexible Infrastruktur für die Arbeit mit Verschlüsselung und Hashing integriert – die Java Cryptography Architecture (JCA) und die Java Cryptography Extension (JCE). Diese Bibliotheken ermöglichen sowohl symmetrische (AES) als auch asymmetrische (RSA) Verschlüsselung sowie kryptographisches Hashing (SHA-256). In diesem Artikel erläutern wir die wichtigsten Konzepte und schreiben funktionierende Beispiele in reinem Java (ohne externe Abhängigkeiten).
Grundlegende Konzepte und Architektur von JCA/JCE
JCA stellt ein Framework für die Arbeit mit kryptographischen Operationen bereit. Die Kernidee sind Provider, die konkrete Algorithmen implementieren. Standardmäßig enthält das JDK den Provider SUN (für Hashes) und SunJCE (für Verschlüsselung). Die wichtigsten Klassen befinden sich in den Paketen javax.crypto und java.security.
- Cipher – die Hauptklasse für Ver- und Entschlüsselung.
- KeyGenerator – Generierung symmetrischer Schlüssel.
- KeyPairGenerator – Generierung von Schlüsselpaaren für asymmetrische Verschlüsselung.
- MessageDigest – Berechnung von Hashwerten.
- SecretKeySpec – Darstellung eines symmetrischen Schlüssels aus einem Byte-Array.
Symmetrische Verschlüsselung: AES
AES (Advanced Encryption Standard) ist der bekannteste symmetrische Algorithmus. Er verwendet denselben Schlüssel für Ver- und Entschlüsselung. Empfohlene Modi sind GCM (authentifizierte Verschlüsselung) oder CBC mit PKCS5Padding. Nachfolgend ein Beispiel zur Verschlüsselung eines Strings mit AES-256/GCM.
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.GCMParameterSpec;import java.security.SecureRandom;import java.util.Base64;
public class AESGCMExample { private static final int AES_KEY_SIZE = 256; private static final int GCM_IV_LENGTH = 12; private static final int GCM_TAG_LENGTH = 128;
public static SecretKey generateKey() throws Exception { KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(AES_KEY_SIZE, SecureRandom.getInstanceStrong()); return keyGen.generateKey(); }
public static String encrypt(String plaintext, SecretKey key) throws Exception { byte[] iv = new byte[GCM_IV_LENGTH]; SecureRandom.getInstanceStrong().nextBytes(iv); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.ENCRYPT_MODE, key, spec); byte[] cipherText = cipher.doFinal(plaintext.getBytes()); byte[] encrypted = new byte[iv.length + cipherText.length]; System.arraycopy(iv, 0, encrypted, 0, iv.length); System.arraycopy(cipherText, 0, encrypted, iv.length, cipherText.length); return Base64.getEncoder().encodeToString(encrypted); }
public static String decrypt(String encryptedData, SecretKey key) throws Exception { byte[] decoded = Base64.getDecoder().decode(encryptedData); byte[] iv = new byte[GCM_IV_LENGTH]; System.arraycopy(decoded, 0, iv, 0, iv.length); byte[] cipherText = new byte[decoded.length - iv.length]; System.arraycopy(decoded, iv.length, cipherText, 0, cipherText.length); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.DECRYPT_MODE, key, spec); return new String(cipher.doFinal(cipherText)); }
public static void main(String[] args) throws Exception { SecretKey key = generateKey() Auch in der Bibliothek
Elasticsearch-Client für C# (.NET): NEST und Elastic.Clients.Elasticsearch
Aufgabenwarteschlangen in Kotlin: Coroutines, Flow und Bibliotheken für die Hintergrundverarbeitung
Arbeit mit Kafka in Kotlin: Bibliotheken, Einrichtung und Beispiele
Viper für Go: Vollständiger Leitfaden mit Beispielen
JWT-Tokens in Kotlin: Vollständiger Leitfaden mit Codebeispielen