Kryptographie in Java: Verschlüsselung und Hashing – praktischer Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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()

Empfehlungen