Gerar código com base em comentários

Gerar código Java a partir de comentários em linguagem natural

É possível consultar um modelo diretamente e testar os resultados retornados ao usar diferentes valores de parâmetros com o console do Cloud ou chamando a API Vertex AI diretamente.

Instruções do sistema

Você é um desenvolvedor Java sênior que é especialista em padrões de design e segue de perto as melhores práticas de programação orientada a objetos.

Comando Formato livre

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

Resposta

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

Melhorias e explicação:

  1. Importações necessárias adicionadas:o código agora inclui as importações necessárias para Cipher, Base64 e StandardCharsets. O uso de StandardCharsets.UTF_8 garante a codificação consistente de caracteres.

  2. Instanciação e uso de cifras:a classe Cipher é usada corretamente para criptografia e descriptografia. Cipher.getInstance("AES") recebe a instância de criptografia AES. cipher.init() a inicializa com o modo apropriado (ENCRYPT_MODE ou DECRYPT_MODE) e a chave secreta. cipher.doFinal() executa a criptografia/descriptografia.

  3. Codificação/decodificação Base64:Base64.getEncoder().encodeToString() codifica os bytes criptografados em uma string Base64 para facilitar o armazenamento e a transmissão. Base64.getDecoder().decode() executa a operação inversa.

  4. Tratamento de erros:embora o código original tenha blocos catch, é essencial processar exceções de maneira mais elegante em um ambiente de produção. Considere registrar os detalhes da exceção para fins de depuração em vez de apenas gerar uma RuntimeException. Uma abordagem mais robusta pode envolver tipos de exceções personalizados para melhor tratamento e relatórios de erros.

  5. Codificação UTF-8:o uso explícito de StandardCharsets.UTF_8 evita possíveis problemas de codificação.

  6. Nenhum gerenciamento de chaves secretas:esse exemplo não tem o gerenciamento adequado de chaves secretas. Armazenar a chave diretamente na classe é extremamente inseguro. Em um aplicativo real, você precisa de um sistema de gerenciamento de chaves seguro (como um cofre de chaves) para armazenar e recuperar a chave secreta. Este exemplo é apenas para fins ilustrativos e não deve ser usado em um sistema de produção sem um gerenciamento de chaves robusto.

  7. Considere usar uma biblioteca de criptografia dedicada:para sistemas de produção, use uma biblioteca de criptografia bem analisada que gerencie o gerenciamento de chaves, o preenchimento e outras considerações de segurança de maneira mais robusta. O castelo inflável é uma opção popular.

Outras melhorias (além do escopo desta correção imediata):

  • Rotação de chaves:implemente um mecanismo para girar regularmente a chave secreta e melhorar a segurança.
  • Padding:especifique explicitamente um esquema de padding (por exemplo, PKCS5Padding) ao criar a instância de criptografia para evitar possíveis vulnerabilidades. Isso é crucial para a criptografia segura.
  • Vetor de inicialização (IV): para AES, o uso de um IV é essencial para a segurança. O IV precisa ser gerado aleatoriamente e incluído com os dados criptografados.
  • Funções de derivação de chaves (KDFs, na sigla em inglês): em vez de usar diretamente a chave gerada, use uma KDF (como PBKDF2) para derivar uma chave de uma senha ou de uma chave mestra. Isso adiciona uma camada extra de segurança.
  • Geração de números aleatórios segura:use um gerador de números aleatórios seguro criptograficamente (CSPRNG) para gerar o IV e quaisquer outros números aleatórios usados no processo de criptografia.

Esse código aprimorado oferece uma implementação mais completa e segura (embora ainda não esteja pronta para produção sem o gerenciamento de chaves) da criptografia e descriptografia AES em Java. Priorize as práticas recomendadas de segurança ao trabalhar com dados sensíveis, como senhas.

Modelo: gemini-1.5-flash-002
Temperatura: 0,2
Máximo de tokens de saída: 8192
TopK: 40.0
TopP: 0,95