Membuat kode dari komentar

Membuat kode Java dari komentar dalam bahasa alami

Anda dapat membuat kueri model secara langsung dan menguji hasil yang ditampilkan saat menggunakan parameter value yang berbeda dengan Konsol Cloud, atau dengan memanggil Vertex AI API secara langsung.

Petunjuk sistem

Anda adalah developer Java senior yang ahli dalam pola desain dan mengikuti praktik pemrograman berorientasi objek terbaik dengan cermat.

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

Respons

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

Peningkatan dan Penjelasan:

  1. Menambahkan impor yang diperlukan: Kode kini menyertakan impor yang diperlukan untuk Cipher, Base64, dan StandardCharsets. Penggunaan StandardCharsets.UTF_8 memastikan encoding karakter yang konsisten.

  2. Pembuatan instance dan penggunaan cipher: Class Cipher digunakan dengan benar untuk enkripsi dan dekripsi. Cipher.getInstance("AES") mendapatkan instance cipher AES. cipher.init() menginisialisasi dengan mode yang sesuai (ENCRYPT_MODE atau DECRYPT_MODE) dan kunci rahasia. cipher.doFinal() melakukan enkripsi/dekripsi.

  3. Encoding/decoding Base64: Base64.getEncoder().encodeToString() mengenkode byte terenkripsi menjadi string Base64 untuk memudahkan penyimpanan dan transmisi. Base64.getDecoder().decode() melakukan operasi terbalik.

  4. Penanganan Error: Meskipun kode asli memiliki blok catch, Anda harus menangani pengecualian dengan lebih baik di lingkungan produksi. Pertimbangkan untuk mencatat detail pengecualian ke dalam log untuk tujuan proses debug, bukan hanya menampilkan RuntimeException. Pendekatan yang lebih andal mungkin melibatkan jenis pengecualian kustom untuk penanganan dan pelaporan error yang lebih baik.

  5. Encoding UTF-8: Menggunakan StandardCharsets.UTF_8 secara eksplisit akan mencegah potensi masalah encoding.

  6. Tidak Ada Pengelolaan Kunci Rahasia: Contoh ini tidak memiliki pengelolaan kunci rahasia yang tepat. Menyimpan kunci langsung dalam class sangat tidak aman. Dalam aplikasi di dunia nyata, Anda memerlukan sistem pengelolaan kunci yang aman (seperti key vault) untuk menyimpan dan mengambil kunci rahasia. Contoh ini hanya untuk tujuan ilustrasi dan tidak boleh digunakan dalam sistem produksi tanpa pengelolaan kunci yang andal.

  7. Pertimbangkan Library Kriptografi khusus: Untuk sistem produksi, pertimbangkan untuk menggunakan library kriptografi yang telah diseleksi dengan baik yang menangani pengelolaan kunci, padding, dan pertimbangan keamanan lainnya dengan lebih andal. Bouncy Castle adalah pilihan populer.

Peningkatan Lebih Lanjut (Di luar cakupan perbaikan langsung ini):

  • Rotasi Kunci: Terapkan mekanisme untuk memutar kunci rahasia secara berkala guna meningkatkan keamanan.
  • Padding: Menentukan skema padding secara eksplisit (mis., PKCS5Padding) saat membuat instance Cipher untuk menghindari potensi kerentanan. Hal ini sangat penting untuk enkripsi yang aman.
  • Initialization Vector (IV): Untuk AES, penggunaan IV sangat penting untuk keamanan. IV harus dibuat secara acak dan disertakan dengan data terenkripsi.
  • Fungsi Derivasi Kunci (KDF): Daripada langsung menggunakan kunci yang dihasilkan, pertimbangkan untuk menggunakan KDF (seperti PBKDF2) untuk mendapatkan kunci dari sandi atau kunci master. Tindakan ini akan menambahkan lapisan keamanan ekstra.
  • Pembuatan Angka Acak yang Aman: Pastikan Anda menggunakan generator angka acak (CSPRNG) yang aman secara kriptografis untuk membuat IV dan angka acak lainnya yang digunakan dalam proses enkripsi.

Kode yang ditingkatkan ini memberikan penerapan enkripsi dan dekripsi AES yang lebih lengkap dan aman (meskipun masih belum siap produksi tanpa pengelolaan kunci) di Java. Jangan lupa untuk memprioritaskan praktik terbaik keamanan saat menangani data sensitif seperti sandi.

Model: gemini-1.5-flash-002
Suhu: 0,2
Token output maks: 8192
TopK: 40,0
TopP: 0,95