Genera código a partir de comentarios

Genera código Java a partir de comentarios en lenguaje natural

Puedes consultar un modelo directamente y probar los resultados que se muestran cuando usas valores de parámetros diferentes con la consola de Cloud o con una llamada directa a la API de Vertex AI.

Instrucciones del sistema

Eres un desarrollador sénior de Java que es experto en patrones de diseño y sigue de cerca las prácticas recomendadas de programación orientada a objetos.

Mensaje Formato libre

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

Respuesta

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

Mejoras y explicación:

  1. Se agregaron las importaciones necesarias: Ahora el código incluye las importaciones necesarias para Cipher, Base64 y StandardCharsets. El uso de StandardCharsets.UTF_8 garantiza una codificación de caracteres coherente.

  2. Creación de instancias y uso de algoritmos de cifrado: La clase Cipher se usa correctamente para la encriptación y la desencriptación. Cipher.getInstance("AES") obtiene la instancia del algoritmo de cifrado AES. cipher.init() lo inicializa con el modo apropiado (ENCRYPT_MODE o DECRYPT_MODE) y la clave secreta. cipher.doFinal() realiza la encriptación o desencriptación.

  3. Codificación y decodificación de Base64: Base64.getEncoder().encodeToString() codifica los bytes encriptados en una cadena Base64 para facilitar el almacenamiento y la transmisión. Base64.getDecoder().decode() realiza la operación inversa.

  4. Manejo de errores: Si bien el código original tenía bloques catch, es fundamental controlar las excepciones de forma más fluida en un entorno de producción. Considera registrar los detalles de la excepción para depurar en lugar de solo lanzar un RuntimeException. Un enfoque más sólido podría implicar tipos de excepciones personalizadas para mejorar el manejo y los informes de errores.

  5. Codificación UTF-8: El uso explícito de StandardCharsets.UTF_8 evita posibles problemas de codificación.

  6. Sin administración de claves secretas: Este ejemplo carece de una administración de claves secretas adecuada. Almacenar la clave directamente dentro de la clase es muy inseguro. En una aplicación real, necesitarías un sistema de administración de claves seguro (como un almacén de claves) para almacenar y recuperar la clave secreta. Este ejemplo es solo a modo de ejemplo y no debe usarse en un sistema de producción sin una administración de claves sólida.

  7. Considera usar una biblioteca de criptografía dedicada: Para los sistemas de producción, considera usar una biblioteca de criptografía bien revisada que controle la administración de claves, el padding y otras consideraciones de seguridad de manera más sólida. Bouncy Castle es una opción popular.

Otras mejoras (más allá del alcance de esta solución inmediata):

  • Rotación de claves: Implementa un mecanismo para rotar la clave secreta con regularidad y mejorar la seguridad.
  • Padding: Especifica de forma explícita un esquema de padding (p.ej., PKCS5Padding) cuando crees la instancia de Cipher para evitar posibles vulnerabilidades. Esto es fundamental para la encriptación segura.
  • Vector de inicialización (IV): En el caso de AES, usar un IV es esencial para la seguridad. El IV se debe generar de forma aleatoria y se debe incluir con los datos encriptados.
  • Funciones de derivación de claves (KDF): En lugar de usar directamente la clave generada, considera usar una KDF (como PBKDF2) para derivar una clave de una contraseña o una clave maestra. Esto agrega una capa de seguridad adicional.
  • Generación de números aleatorios seguros: Asegúrate de usar un generador de números aleatorios criptográficamente seguro (CSPRNG) para generar el IV y cualquier otro número aleatorio que se use en el proceso de encriptación.

Este código mejorado proporciona una implementación más completa y segura (aunque aún no está lista para producción sin administración de claves) de la encriptación y desencriptación de AES en Java. Recuerda priorizar las prácticas recomendadas de seguridad cuando trabajes con datos sensibles, como contraseñas.

Modelo: gemini-1.5-flash-002
Temperatura: 0.2
Cantidad máxima de tokens de salida: 8192
TopK: 40.0
TopP: 0.95