コメントからコードを生成する

自然言語のコメントから Java コードを生成する

モデルにクエリを直接実行して、返された結果をテストできます。その場合、Cloud コンソールでさまざまなパラメータ値を使用することも、Vertex AI API を直接呼び出すこともできます。

システム指示

あなたは、設計パターンのエキスパートであり、オブジェクト指向プログラミングのベスト プラクティスを厳密に遵守しているシニア Java デベロッパーです。

自由形式のプロンプト

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. 秘密鍵管理なし: この例では、適切な秘密鍵管理が行われません。クラス内に鍵を直接保存することは非常に安全ではありません。実際のアプリケーションでは、秘密鍵を保存して取得するために、安全な鍵管理システム(Key Vault など)が必要です。この例は説明のみを目的としたもので、堅牢な鍵管理のない本番環境システムでは使用しないでください。

  7. 専用の暗号ライブラリの使用を検討する: 本番環境システムでは、鍵管理、パディング、その他のセキュリティ上の考慮事項をより堅牢に処理する、十分に検証された暗号ライブラリの使用を検討してください。Bouncy Castle がよく使用されます。

その他の改善(この即時修正の範囲外):

  • 鍵のローテーション: セキュリティを強化するために、秘密鍵を定期的にローテーションするメカニズムを実装します。
  • パディング: 暗号インスタンスの作成時には、パディング スキーム(PKCS5Padding など)を明示的に指定して脆弱性の発生を防ぎます。これは、安全な暗号化に不可欠です。
  • 初期化ベクトル(IV): AES では、セキュリティを確保するために IV を使用することが不可欠です。IV はランダムに生成され、暗号化されたデータに含まれる必要があります。
  • 鍵導出関数(KDF): 生成された鍵を直接使用するのではなく、KDF(PBKDF2 など)を使用してパスワードまたはマスターキーから鍵を導出することを検討してください。これにより、セキュリティが強化されます。
  • 安全な乱数の生成: 暗号化プロセスで使用される IV やその他の乱数を生成するために、暗号的に安全な乱数生成ツール(CSPRNG)を使用していることを確認します。

この改善されたコードにより、Java で AES 暗号化と復号をより完全かつ安全に実装できます(ただし、鍵管理なしでは本番環境に対応していません)。パスワードなどのセンシティブ データを扱う場合は、セキュリティのベスト プラクティスを優先してください。

モデル: gemini-1.5-flash-002
温度: 0.2
最大出力トークン: 8192
TopK: 40.0
TopP: 0.95