根据注释生成代码

从自然语言注释中生成 Java 代码

在对 Cloud 控制台使用不同参数值时,或通过直接调用 Vertex AI API,您可以直接查询模型,并测试返回的结果。

系统指令

您是一位设计模式专家,也是资深 Java 开发者,并且密切遵循面向对象编程最佳实践。

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

响应

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

改进和说明

  1. 添加了必要的导入项:代码现在包含 CipherBase64StandardCharsets 的必要导入项。使用 StandardCharsets.UTF_8 可确保字符编码保持一致。

  2. 密码实例化和用法:正确地将 Cipher 类用于加密和解密。Cipher.getInstance("AES") 获取 AES 密钥实例。cipher.init() 会使用适当的模式(ENCRYPT_MODE 或 DECRYPT_MODE)和密钥对其进行初始化。cipher.doFinal() 执行加密/解密。

  3. Base64 编码/解码Base64.getEncoder().encodeToString() 将加密的字节编码为 Base64 字符串,以便于存储和传输。Base64.getDecoder().decode() 执行相反的操作。

  4. 错误处理:虽然原始代码包含 catch 代码块,但在生产环境中更妥善地处理异常至关重要。考虑记录异常详情以进行调试,而不仅仅是抛出 RuntimeException。更强大的方法可能涉及自定义异常类型,以便更好地处理和报告错误。

  5. UTF-8 编码:明确使用 StandardCharsets.UTF_8 可防止出现潜在的编码问题。

  6. 无密钥管理:此示例缺少适当的密钥管理。直接在类中存储密钥非常不安全。在实际应用中,您需要一个安全的密钥管理系统(例如密钥保险柜)来存储和检索 Secret 密钥。此示例仅用于说明目的,不应在没有强大密钥管理的生产系统中使用。

  7. 考虑使用专用加密库:对于生产系统,请考虑使用经过严格审核的加密库,以更稳健的方式处理密钥管理、填充和其他安全注意事项。Bouncy Castle 是一个热门选择。

进一步增强功能(超出此临时修复范围)

  • 密钥轮替:实现一个机制,以便定期轮替密钥,从而提高安全性。
  • 填充:明确指定填充方案(例如,PKCS5Padding)时,以避免潜在的漏洞。这对于安全加密至关重要。
  • 初始化向量 (IV):对于 AES,使用 IV 对安全至关重要。IV 应随机生成,并包含在加密数据中。
  • 密钥派生函数 (KDF):请考虑使用 KDF(例如 PBKDF2)从密码或主密钥派生密钥,而不是直接使用生成的密钥。这增添了一层额外的安全保障。
  • 安全随机数生成:请确保使用采用加密保护的随机数生成器 (CSPRNG) 生成 IV 以及加密过程中使用的任何其他随机数。

此改进后的代码在 Java 中提供了更完整、更安全的 AES 加密和解密实现(但在没有密钥管理的情况下,该代码仍不适合用于生产环境)。在处理密码等敏感数据时,请务必优先考虑安全最佳实践。

型号: gemini-1.5-flash-002
温度: 0.2
输出令牌数量上限: 8192
TopK: 40.0
TopP: 0.95