Generare codice dai commenti

Genera codice Java da commenti in linguaggio naturale

Puoi eseguire query direttamente su un modello e testare i risultati restituiti quando utilizzi valori di parametro diversi con la console Cloud o chiamando direttamente l'API Vertex AI.

Istruzioni di sistema

Sei uno sviluppatore Java senior esperto di pattern di progettazione e segui attentamente le best practice di programmazione orientata agli oggetti.

Prompt in formato libero

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);
        }
    }
}

Risposta

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);
        }
    }
}

Miglioramenti e spiegazione:

  1. Sono state aggiunte le importazioni necessarie: il codice ora include le importazioni necessarie per Cipher, Base64 e StandardCharsets. L'utilizzo di StandardCharsets.UTF_8 garantisce una codifica dei caratteri coerente.

  2. Istanziazione e utilizzo della crittografia: la classe Cipher viene utilizzata correttamente sia per la crittografia che per la decrittografia. Cipher.getInstance("AES") recupera l'istanza della crittografia AES. cipher.init() lo inizializza con la modalità appropriata (ENCRYPT_MODE o DECRYPT_MODE) e la chiave segreta. cipher.doFinal() esegue la crittografia/decrittografia.

  3. Codifica/decodifica Base64: Base64.getEncoder().encodeToString() codifica i byte criptati in una stringa Base64 per facilitarne l'archiviazione e la trasmissione. Base64.getDecoder().decode() esegue l'operazione inversa.

  4. Gestione degli errori: anche se il codice originale aveva blocchi catch, è fondamentale gestire le eccezioni in modo più elegante in un ambiente di produzione. Valuta la possibilità di registrare i dettagli dell'eccezione a scopo di debug anziché lanciare semplicemente un RuntimeException. Un approccio più solido potrebbe prevedere tipi di eccezioni personalizzate per una gestione e una generazione di report sugli errori migliori.

  5. Codifica UTF-8: l'utilizzo esplicito di StandardCharsets.UTF_8 evita potenziali problemi di codifica.

  6. Nessuna gestione delle chiavi private: questo esempio manca di una gestione adeguata delle chiavi private. Memorizzare la chiave direttamente all'interno del corso è estremamente pericoloso. In un'applicazione reale, è necessario un sistema di gestione delle chiavi sicuro (come una cassetta di sicurezza) per archiviare e recuperare la chiave segreta. Questo esempio è solo a scopo illustrativo e non deve essere utilizzato in un sistema di produzione privo di una solida gestione delle chiavi.

  7. Valuta la possibilità di utilizzare una libreria di crittografia dedicata: per i sistemi di produzione, valuta la possibilità di utilizzare una libreria di crittografia ben verificata che gestisca in modo più affidabile la gestione delle chiavi, il padding e altri aspetti di sicurezza. Il castello gonfiabile è una scelta molto popolare.

Ulteriori miglioramenti (al di fuori dell'ambito di questa correzione immediata):

  • Rotazione delle chiavi: implementa un meccanismo per ruotare regolarmente la chiave segreta al fine di migliorare la sicurezza.
  • Spaziatura interna: specifica esplicitamente uno schema di spaziatura interna (ad es. PKCS5Padding) quando crei l'istanza Cipher per evitare potenziali vulnerabilità. Questo è fondamentale per una crittografia sicura.
  • Vettore di inizializzazione (IV): per AES, l'utilizzo di un IV è essenziale per la sicurezza. L'IV dovrebbe essere generato in modo casuale e incluso con i dati criptati.
  • Funzioni di derivazione delle chiavi (KDF): anziché utilizzare direttamente la chiave generata, valuta la possibilità di utilizzare una KDF (come PBKDF2) per ricavare una chiave da una password o una chiave principale. Questa impostazione aggiunge un ulteriore livello di sicurezza.
  • Generare numeri casuali sicuri: assicurati di utilizzare un generatore di numeri casuali (CSPRNG) sicuro dal punto di vista crittografico per generare l'IV e tutti gli altri numeri casuali utilizzati nel processo di crittografia.

Questo codice migliorato fornisce un'implementazione più completa e sicura (anche se non pronta per la produzione senza gestione delle chiavi) della crittografia e della decrittografia AES in Java. Ricorda di dare la priorità alle best practice di sicurezza quando lavori con dati sensibili come le password.

Modello: gemini-1.5-flash-002
Temperatura: 0,2
Numero massimo di token di output: 8192
TopK: 40,0
TopP: 0,95