Code aus Kommentaren generieren

Java-Code aus Kommentaren in natürlicher Sprache generieren

Sie können ein Modell direkt abfragen und die zurückgegebenen Ergebnisse testen, wenn Sie verschiedene Parameterwerte mit der Cloud Console oder durch direkten Aufruf der Vertex AI API verwenden.

Systemanweisungen

Du bist leitender Java-Entwickler, der sich mit Designmustern auskennt und die Best Practices der objektorientierten Programmierung genau befolgt.

Freeform-Prompt

package org.com.passwordmanager.service;

import org.springframework.stereotype.Service;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

@Service
public class EncryptionService {

    private final SecretKey secretKey;

    public EncryptionService() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);
        secretKey = keyGen.generateKey();
    }

    public String encrypt(String data) {
        try {
            // Create and initialize a Cipher instance for AES encryption
            // Encrypt the data bytes using the Cipher instance
            // Encode the encrypted bytes to a Base64 string and return the result
            // <WRITE CODE HERE>
        } catch (Exception e) {
            throw new RuntimeException("Encryption error", e);
        }
    }

    public String decrypt(String encryptedData) {
        try {
            // Create and initialize a Cipher instance for AES decryption
            // Decode the Base64 string to get the encrypted bytes
            // Decrypt the encrypted bytes
            // Convert decrypted bytes to a string and return the result
            // <WRITE CODE HERE>
        } catch (Exception e) {
            throw new RuntimeException("Decryption error", e);
        }
    }
}

Antwort

package org.com.passwordmanager.service;

import org.springframework.stereotype.Service;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

@Service
public class EncryptionService {

    private final SecretKey secretKey;

    public EncryptionService() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);
        secretKey = keyGen.generateKey();
    }

    public String encrypt(String data) {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            throw new RuntimeException("Encryption error", e);
        }
    }

    public String decrypt(String encryptedData) {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
            byte[] decryptedBytes = cipher.doFinal(decodedBytes);
            return new String(decryptedBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new RuntimeException("Decryption error", e);
        }
    }
}

Verbesserungen und Erläuterung:

  1. Erforderliche Importe hinzugefügt: Der Code enthält jetzt die erforderlichen Importe für Cipher, Base64 und StandardCharsets. Durch die Verwendung von StandardCharsets.UTF_8 wird eine einheitliche Zeichencodierung gewährleistet.

  2. Verschlüsselung – Instanziierung und Verwendung: Die Klasse Cipher wird sowohl für die Verschlüsselung als auch für die Entschlüsselung korrekt verwendet. Cipher.getInstance("AES") ruft die AES-Verschlüsselungsinstanz ab. cipher.init() initialisiert sie mit dem entsprechenden Modus (ENCRYPT_MODE oder DECRYPT_MODE) und dem Secret-Schlüssel. cipher.doFinal() führt die Verschlüsselung/Entschlüsselung durch.

  3. Base64-Codierung/Dekodierung: Base64.getEncoder().encodeToString() codiert die verschlüsselten Bytes in einen Base64-String, um sie leichter speichern und übertragen zu können. Base64.getDecoder().decode() führt den umgekehrten Vorgang aus.

  4. Fehlerbehandlung: Der ursprüngliche Code enthielt catch-Blöcke. In einer Produktionsumgebung ist es jedoch wichtig, Ausnahmen nutzerfreundlicher zu verarbeiten. Sie sollten die Details der Ausnahme zu Debugging-Zwecken protokollieren, anstatt einfach eine RuntimeException auszugeben. Ein robusterer Ansatz könnte benutzerdefinierte Ausnahmetypen für eine bessere Fehlerbehandlung und ‑berichterstattung beinhalten.

  5. UTF-8-Codierung: Wenn Sie StandardCharsets.UTF_8 explizit verwenden, können potenzielle Codierungsprobleme vermieden werden.

  6. Keine Secret-Schlüsselverwaltung: In diesem Beispiel fehlt eine ordnungsgemäße Secret-Schlüsselverwaltung. Das Speichern des Schlüssels direkt in der Klasse ist extrem unsicher. In einem realen Anwendungsszenario benötigen Sie ein Sicherheitsschlüsselverwaltungssystem (z. B. einen Key Vault), um den Secret-Schlüssel zu speichern und abzurufen. Dieses Beispiel dient nur zur Veranschaulichung und sollte nicht in einem Produktionssystem ohne robuste Schlüsselverwaltung verwendet werden.

  7. Dedizierte Kryptografiebibliothek verwenden: Für Produktionssysteme sollten Sie eine gut geprüfte Kryptografiebibliothek verwenden, die Schlüsselverwaltung, Padding und andere Sicherheitsaspekte robuster handhabt. Bouncy Castle ist eine beliebte Wahl.

Weitere Verbesserungen (nicht Teil dieser sofortigen Korrektur):

  • Schlüsselrotation: Implementieren Sie einen Mechanismus, um den Secret-Schlüssel regelmäßig zu rotieren und so die Sicherheit zu erhöhen.
  • Padding: Geben Sie ein Padding-Schema explizit an (z. B. PKCS5Padding), wenn Sie die Verschlüsselungsinstanz erstellen, um potenzielle Sicherheitslücken zu vermeiden. Dies ist für eine sichere Verschlüsselung entscheidend.
  • Initialisierungsvektor (IV): Bei AES ist die Verwendung eines IV für die Sicherheit unerlässlich. Der IV sollte zufällig generiert und in die verschlüsselten Daten eingefügt werden.
  • Schlüsselableitungsfunktionen (KDFs): Anstatt den generierten Schlüssel direkt zu verwenden, können Sie eine KDF (z. B. PBKDF2) verwenden, um einen Schlüssel aus einem Passwort oder einem Masterschlüssel abzuleiten. Dies erhöht die Sicherheit zusätzlich.
  • Sichere Generierung von Zufallszahlen: Verwenden Sie einen kryptografisch sicheren Zufallszahlengenerator (CSPRNG) zum Generieren des IV und aller anderen Zufallszahlen, die beim Verschlüsselungsprozess verwendet werden.

Dieser verbesserte Code bietet eine vollständigere und sicherere (aber ohne Schlüsselverwaltung noch nicht produktionsbereite) Implementierung der AES-Verschlüsselung und ‑Entschlüsselung in Java. Denken Sie daran, bei der Arbeit mit sensiblen Daten wie Passwörtern die Best Practices für die Sicherheit zu priorisieren.

Modell: gemini-1.5-flash-002
Temperatur: 0,2
Max. Ausgabetokens: 8.192
TopK: 40,0
TopP: 0,95