Modul 32 · Migration Deep Dive · Stufe 5 Enterprise Runtime

Kryptografie

deterministische AES-ECB-Demo wird nachvollziehbar in AES-GCM mit PBKDF2, Salt und IV überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.

Security GatewayValue Object
1 → 2Produktionsdateien
28 → 54Java-Zeilen
1 → 1Testdateien
0 / 0Dependencies entfernt / neu
NIEDRIGRisiko · Score 1

Was sich konkret ändert

DimensionLegacyModernMigrationskonsequenz
Programmiermodellimperativ / ohne Framework-Annotationenexplizite Java-AbstraktionenAnnotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen.
Abhängigkeiten1 direkte Dependencies1 direkte Dependencies0 neu, 0 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen.
Öffentliche API2 erkannte Methoden5 erkannte MethodenMethoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag.
Datenmodellclass LegacyAesEcbclass AesGcmService, record EncryptedPayloadFeldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet.
FehlerverhaltenLegacy-Exceptions und Rückgabewerteexplizitere Fach-/Framework-FehlerabbildungFehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden.
TestsBestands- und Golden-Master-TestsUnit-, Slice-, Contract- und IntegrationstestsDer Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt.
BetriebLegacy-Start/Lifecyclemodernes Packaging, Health und externe KonfigurationKein Rollback auf unsichere Schreibverfahren; Migration von Bestandsdaten kontrollieren.
RollbackLegacy-Artefakt bleibt unverändertModern-Artefakt getrennt deploybarKein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein.

Fachlicher Vertrag: unverändert zu erhalten

  • Neue Verschlüsselung bietet Vertraulichkeit und Integrität.
  • Nonce/IV wird pro Nachricht eindeutig erzeugt.
  • Schlüsselmaterial und Passwörter werden nicht geloggt oder hart codiert.

Hauptrisiko und Testfokus

confidentiality/integrity failure and nonce misuse

tamper, wrong key, nonce uniqueness and empty payload tests

Die Modernisierung gilt erst als abgeschlossen, wenn der fachliche Vertrag automatisiert belegt ist.

Verbindliches Code- und Rollenmapping

Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.

Legacy-Rolle / DateiModern-Rolle / DateiBedeutung
LegacyAesEcb.javaAesGcmService.java + EncryptedPayload.javaDeterministische Verschlüsselung wird authentifizierte, versionierbare Payload.

Legacy-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
LegacyAesEcb.javaclass LegacyAesEcbString encrypt(String text, String password)
String decrypt(String value, String password)
Security Gateway (Legacy-Antipattern) – bündelt Kryptografie, verwendet absichtlich unsicheres ECB.28

Modern-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
AesGcmService.javaclass AesGcmServiceEncryptedPayload encrypt(String text, char[] password)
String decrypt(EncryptedPayload p, char[] password)
Security Gateway31
EncryptedPayload.javarecord EncryptedPayloadbyte[] salt()
byte[] iv()
byte[] cipherText()
Value Object23

Dependency- und Laufzeitmigration

StatusDependencyVersionScopePrüfung
BEIBEHALTENorg.junit.jupiter:junit-jupiterBOM/Parent → BOM/Parenttest → testGemeinsame Dependency; Version und Scope im effektiven POM prüfen.
Direkte POM-Daten ersetzen keinen erfolgreichen Online-Build mit transitiver SBOM- und CVE-Prüfung.

Vorher-/Nachher-Codebelege

Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.

Legacy
LegacyAesEcb.java
Modern
AesGcmService.java + EncryptedPayload.java

Migrationsbedeutung: Deterministische Verschlüsselung wird authentifizierte, versionierbare Payload.

Legacy-Code

projects/32-crypto/legacy/src/main/java/at/aydin/lab/crypto/legacy/LegacyAesEcb.java

package at.aydin.lab.crypto.legacy;

// Design Pattern: Security Gateway (Legacy-Antipattern) – bündelt Kryptografie, verwendet absichtlich unsicheres ECB.
import javax.crypto.*;
import javax.crypto.spec.*;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.*;

/** Lern-Antipattern: AES/ECB ist deterministisch und für produktive Daten ungeeignet. */
public final class LegacyAesEcb {
    private SecretKey key(String password) throws Exception {
        return new SecretKeySpec(Arrays.copyOf(MessageDigest.getInstance("SHA-256").digest(password.getBytes(StandardCharsets.UTF_8)),
            16), "AES");
    }

    public String encrypt(String text, String password) throws Exception {
        Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
        c.init(Cipher.ENCRYPT_MODE, key(password));
        return Base64.getEncoder().encodeToString(c.doFinal(text.getBytes(StandardCharsets.UTF_8)));
    }

    public String decrypt(String value, String password) throws Exception {
        Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
        c.init(Cipher.DECRYPT_MODE, key(password));
        return new String(c.doFinal(Base64.getDecoder().decode(value)), StandardCharsets.UTF_8);
    }
}

Modern-Code

projects/32-crypto/modern/src/main/java/at/aydin/lab/crypto/modern/AesGcmService.java

package at.aydin.lab.crypto.modern;

import javax.crypto.*;
import javax.crypto.spec.*;
import java.nio.charset.StandardCharsets;
import java.security.*;

// Design Pattern: Security Gateway
// Zweck: Sichere kryptografische Parameter werden zentral erzwungen.
public final class AesGcmService {
    private final SecureRandom random = new SecureRandom();
    private SecretKey key(char[] password, byte[] salt) throws Exception {
        var f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        return new SecretKeySpec(f.generateSecret(new PBEKeySpec(password, salt, 120_000, 256)).getEncoded(), "AES");
    }

    public EncryptedPayload encrypt(String text, char[] password) throws Exception {
        byte[] salt = new byte[16], iv = new byte[12];
        random.nextBytes(salt);
        random.nextBytes(iv);
        Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
        c.init(Cipher.ENCRYPT_MODE, key(password, salt), new GCMParameterSpec(128, iv));
        return new EncryptedPayload(salt, iv, c.doFinal(text.getBytes(StandardCharsets.UTF_8)));
    }

    public String decrypt(EncryptedPayload p, char[] password) throws Exception {
        Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
        c.init(Cipher.DECRYPT_MODE, key(password, p.salt()), new GCMParameterSpec(128, p.iv()));
        return new String(c.doFinal(p.cipherText()), StandardCharsets.UTF_8);
    }
}

Modern-Code

projects/32-crypto/modern/src/main/java/at/aydin/lab/crypto/modern/EncryptedPayload.java

package at.aydin.lab.crypto.modern;

// Design Pattern: Value Object
// Zweck: Ciphertext, Salt und IV bleiben als untrennbare verschlüsselte Nutzlast zusammen.
public record EncryptedPayload(byte[] salt, byte[] iv, byte[] cipherText) {
    public EncryptedPayload {
        salt = salt.clone();
        iv = iv.clone();
        cipherText = cipherText.clone();
    }

    public byte[] salt() {
        return salt.clone();
    }

    public byte[] iv() {
        return iv.clone();
    }

    public byte[] cipherText() {
        return cipherText.clone();
    }
}

Umsetzungsplan mit Qualitäts-Gates

  1. Arbeitspaket 1
    Bestandsdaten und AES/ECB-Nutzung inventarisieren; keine stille In-place-Konvertierung. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  2. Arbeitspaket 2
    EncryptedPayload mit Version, Salt, IV und Ciphertext definieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  3. Arbeitspaket 3
    AesGcmService mit SecureRandom und authentifizierter Verschlüsselung implementieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  4. Arbeitspaket 4
    PBKDF2-Parameter und Key-Management als Betriebsentscheidung dokumentieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  5. Arbeitspaket 5
    Read-old/write-new beziehungsweise expliziten Re-encryption-Job planen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  6. Arbeitspaket 6
    Tamper-, Wrong-key-, Nonce- und Migrationstests ausführen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.

Konkreter Test- und Abnahmekatalog

IDEbenePrüfungerforderlicher Nachweis
32-CRYPTO-A01Integration/ContractManipulierter Ciphertext wird sicher abgewiesen.Automatisierter Test und CI-Protokoll
32-CRYPTO-A02Integration/ContractGleicher Klartext erzeugt unterschiedliche Payloads.Automatisierter Test und CI-Protokoll
32-CRYPTO-A03Integration/ContractLegacy-Daten können kontrolliert gelesen/migriert werden.Automatisierter Test und CI-Protokoll
32-CRYPTO-A04Integration/ContractKeine ECB-Neuschreibungen.Automatisierter Test und CI-Protokoll
32-CRYPTO-A05Integration/ContractKey-Rotation und Formatversion sind vorgesehen.Automatisierter Test und CI-Protokoll
32-CRYPTO-T01UnitFachlogik ohne Container oder externen Dienst testen.Unit-Test
32-CRYPTO-T02RegressionLegacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen.Vergleichsreport
32-CRYPTO-T03NegativeFehlerhafte, leere und grenzwertige Eingaben prüfen.Negativtest
32-CRYPTO-T04OperationsStart, Health, Shutdown und Konfigurationsfehler prüfen.Deployment-/Startprotokoll
32-CRYPTO-T05SecurityManipulation, falsche Schlüssel/Tags und Rückwärtslesbarkeit prüfen.Security-Test
32-CRYPTO-F01Fokustamper, wrong key, nonce uniqueness and empty payload testsModulspezifischer Testreport

Risikoregister des Moduls

RisikoAuswirkungGegenmaßnahmeGate
confidentiality/integrity failure and nonce misuseNIEDRIGtamper, wrong key, nonce uniqueness and empty payload testsvor Cutover

Konfiguration und Ressourcen

Keine zusätzlichen Ressourcen.

Rollback und Koexistenz

Write-new darf nicht auf unsichere ECB-Schreibweise zurückfallen; nur ein zeitlich begrenzter Legacy-Decryptor bleibt für Bestandsdaten.

Abbruchkriterien

  • Fachlicher Golden-Master weicht ab.
  • Daten-, Nachrichten- oder API-Kompatibilität ist ungeklärt.
  • Fehlerquote, Latenz oder Ressourcenverbrauch überschreiten das vereinbarte Limit.
  • Monitoring oder Rückfallpfad ist nicht funktionsfähig.

Definition of Done

Direkte Arbeitslinks

⌂ Cockpit