Saya sedang mengembangkan sistem rest api yang berjalan pada layanan EC2.

Persyaratan saya adalah

  1. mengenkripsi/mendekripsi pada teks biasa dengan AES256
  2. buat kunci dengan pbkdf2
  3. Simpan kunci di sistem cloud aws
  4. Jawa

Saya mencoba menggunakan KMS & Crypto sdk tetapi tidak berhasil. (mis) hasil nilai enkripsi berubah setiap kali saya memanggil metode dengan teks biasa yang sama.

Apakah Anda punya ide?

public String encrypt(String text) {
    String plaintext = text;
    try {
        ByteBuffer byteBuffer = getByteBuffer(plaintext);
        EncryptRequest encryptRequest = new EncryptRequest().withKeyId(key_arn).withPlaintext(byteBuffer);
        EncryptResult encryptResult = client.encrypt(encryptRequest);
        String ciphertext = getString(java.util.Base64.getEncoder().encode(encryptResult.getCiphertextBlob()));
        plaintext = ciphertext;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return plaintext;
}

public String decrypt(String text) {
    String bb = null;
    try {
         byte[] ciphertextBytes = text.getBytes();

        DecryptRequest request = new DecryptRequest();
        request.setCiphertextBlob(ByteBuffer.wrap(ciphertextBytes));

        DecryptResult result = client.decrypt(request);

        // Convert to byte array
        byte[] plaintext = new byte[result.getPlaintext().remaining()];
        ByteBuffer a = result.getPlaintext().get(plaintext);
        bb = getString(a);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bb;
}
0
Chloe 9 Juli 2020, 12:09

1 menjawab

Jawaban Terbaik

Ini adalah pertanyaan yang sulit dijawab dengan singkat karena ada banyak detail dan pengetahuan latar belakang yang masuk ke kripto dan menggunakan kemampuan kripto AWS dengan benar.

Pertama untuk pertanyaan spesifik Anda - nilai yang berbeda dari plaintext yang sama tidak apa-apa dan diharapkan. Encrypt mengembalikan nilai yang berbeda untuk teks biasa yang sama karena melampirkan data tambahan ke teks biasa, seperti Initialization Vector (IV). Ini adalah cara untuk memasukkan data non-deterministik dalam teks biasa dengan tepat sehingga Anda tidak mendapatkan teks sandi yang sama persis dari teks biasa yang sama saat menggunakan kunci yang sama.

Namun yang lebih penting, perhatikan bahwa Encrypt dan Decrypt bukan alat serba guna - alat ini dirancang untuk menangani muatan kecil (<8KB), khususnya Data Keys . Jadi ke mana Anda pergi dari sini akan tergantung pada jenis data yang Anda enkripsi. Jika Anda hanya perlu mendekripsi nilai kecil seperti sandi, Anda dapat melanjutkan dengan Encrypt/Decrypt, dan jangan khawatir bahwa dua operasi Encrypt menghasilkan teks sandi yang berbeda. Jika Anda perlu mengenkripsi file atau potongan data arbitrer lainnya, baca terus.

AWS mempromosikan gagasan Envelope Encryption, yang merupakan gagasan bahwa kunci yang digunakan untuk benar-benar mengen/dekripsi disimpan bersama data yang dilindunginya, dan dien/didekripsi sendiri melalui kunci master terpisah. Dalam kasus AWS, itu Customer Master Key (CMK), yang tidak pernah meninggalkan KMS.

Jadi, Anda dapat menggunakan Encrypt untuk mengenkripsi kunci enkripsi yang Anda buat, atau Anda dapat menggunakan metode AWS GenerateDataKey untuk 1) membuat kunci dan 2) mengenkripsinya untuk Anda. Itu akan mengembalikan versi kunci plaintext (base64) dan teks sandi. Gunakan plainteks di memori, simpan teks sandi ke disk.

Alur kerja yang lebih khas akan menjadi seperti:

  • Panggil GenerateDataKey - Anda perlu menentukan KeyId dan KeySpec (AES_128 atau AES_256). Ada juga opsi untuk menghasilkan kunci asimetris.
  • Hasilnya mencakup teks biasa dan versi terenkripsi dari kunci yang dihasilkan. Simpan versi terenkripsi.
  • Di lain waktu, panggil Decrypt saat Anda perlu menggunakan kunci.
  • Gunakan plaintext dari metode Decrypt itu sebagai kunci dalam kode kripto lokal Anda.

AWS sebenarnya menyediakan perpustakaan terpisah untuk melakukan semua itu untuk Anda - AWS Encryption SDK, dengan dukungan untuk berbagai bahasa termasuk Java. Saya tidak menggunakannya secara ekstensif, tetapi menyediakan kerangka kerja untuk melakukan enkripsi amplop melalui praktik terbaik (algoritme mana, kunci master vs. data, dll). Lihat (tautan di bawah).

Semoga ini membantu; enkripsi sulit untuk diperbaiki.

Untuk informasi lebih lanjut:

1
bimsapi 10 Juli 2020, 21:01