Générer du code à partir de commentaires

Générer du code Java à partir de commentaires en langage naturel

Vous pouvez interroger un modèle directement et tester les résultats renvoyés lors de l'utilisation de différentes valeurs de paramètre en utilisant la console Cloud ou en appelant directement l'API Vertex AI.

Instructions système

Vous êtes un développeur Java senior, expert en modèles de conception, qui suit de près les bonnes pratiques de programmation orientée objet.

Requête Freeform

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

Réponse

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

Améliorations et explications :

  1. Importations nécessaires ajoutées : le code inclut désormais les importations nécessaires pour Cipher, Base64 et StandardCharsets. L'utilisation de StandardCharsets.UTF_8 garantit un encodage des caractères cohérent.

  2. Instanciation et utilisation du chiffrement : la classe Cipher est utilisée correctement pour le chiffrement et le déchiffrement. Cipher.getInstance("AES") obtient l'instance de chiffrement AES. cipher.init() l'initialise avec le mode approprié (ENCRYPT_MODE ou DECRYPT_MODE) et la clé secrète. cipher.doFinal() effectue le chiffrement/le déchiffrement.

  3. Encodage/Décodage Base64 : Base64.getEncoder().encodeToString() encode les octets chiffrés dans une chaîne Base64 pour faciliter le stockage et la transmission. Base64.getDecoder().decode() effectue l'opération inverse.

  4. Gestion des erreurs : bien que le code d'origine contienne des blocs catch, il est essentiel de gérer les exceptions de manière plus optimale dans un environnement de production. Envisagez de consigner les détails de l'exception à des fins de débogage au lieu de simplement générer une RuntimeException. Une approche plus robuste peut impliquer des types d'exceptions personnalisés pour une meilleure gestion des erreurs et des rapports.

  5. Encodage UTF-8 : l'utilisation explicite de StandardCharsets.UTF_8 permet d'éviter les problèmes d'encodage potentiels.

  6. Aucune gestion de clé secrète : cet exemple ne comporte pas de gestion de clé secrète appropriée. Il est extrêmement peu sûr de stocker la clé directement dans la classe. Dans une application réelle, vous avez besoin d'un système de gestion des clés sécurisé (comme un coffre de clés) pour stocker et récupérer la clé secrète. Cet exemple est fourni à titre d'illustration uniquement et ne doit pas être utilisé dans un système de production sans une gestion des clés robuste.

  7. Envisagez d'utiliser une bibliothèque de cryptographie dédiée : pour les systèmes de production, envisagez d'utiliser une bibliothèque de cryptographie bien contrôlée qui gère la gestion des clés, le padding (remplissage) et d'autres aspects de sécurité de manière plus robuste. Bouncy Castle est un choix populaire.

Autres améliorations (hors de la portée de ce correctif immédiat) :

  • Rotation des clés : implémentez un mécanisme permettant d'alterner régulièrement la clé secrète pour renforcer la sécurité.
  • Remplissage : spécifiez explicitement un schéma de remplissage (par exemple, PKCS5Padding) lors de la création de l'instance de chiffrement pour éviter les failles de sécurité potentielles. Ce point est essentiel pour un chiffrement sécurisé.
  • Vecteur d'initialisation (IV) : pour AES, l'utilisation d'un IV est essentielle pour la sécurité. L'IV doit être généré de manière aléatoire et inclus avec les données chiffrées.
  • Fonctions de dérivation de clé (KDF) : au lieu d'utiliser directement la clé générée, envisagez d'utiliser une KDF (comme PBKDF2) pour dériver une clé à partir d'un mot de passe ou d'une clé principale. Cette approche ajoute un niveau de sécurité supplémentaire.
  • Génération de nombres aléatoires sécurisés : assurez-vous d'utiliser un générateur de nombres aléatoires sécurisés cryptographiquement (CSPRNG) pour générer l'IV et tous les autres nombres aléatoires utilisés dans le processus de chiffrement.

Ce code amélioré fournit une implémentation plus complète et plus sécurisée (mais toujours pas prête pour la production sans gestion des clés) du chiffrement et du déchiffrement AES en Java. N'oubliez pas de privilégier les bonnes pratiques de sécurité lorsque vous travaillez avec des données sensibles telles que des mots de passe.

Modèle : gemini-1.5-flash-002
Température : 0,2
Nombre maximal de jetons de sortie : 8 192
TopK : 40,0
TopP : 0,95