Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan Amazon DynamoDB Encryption Client untuk Java
catatan
Pustaka enkripsi sisi klien kami diubah namanya menjadi Enkripsi Database. AWS SDK Topik berikut memberikan informasi tentang versi 1. x —2. x dari DynamoDB Encryption Client untuk Java dan versi 1. x —3. x dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat Enkripsi AWS Database SDK untuk dukungan versi DynamoDB.
Topik ini menjelaskan beberapa fitur DynamoDB Encryption Client di Java yang mungkin tidak ditemukan dalam implementasi bahasa pemrograman lainnya.
Untuk detail tentang pemrograman dengan Klien Enkripsi DynamoDB, lihat contoh Java, contoh di aws-dynamodb-encryption-java repository
aktif, dan Javadoc untuk Klien Enkripsi DynamoDB. GitHub
Enkripsi item: AttributeEncryptor dan D ynamoDBEncryptor
Klien Enkripsi DynamoDB di Java memiliki dua enkripsi item: D tingkat rendah dan file. ynamoDBEncryptor AttributeEncryptor
AttributeEncryptor
Ini adalah kelas pembantu yang membantu Anda menggunakan D ynamoDBMapper dalam AWS SDK for Java dengan di DynamoDB DynamoDB Encryptor
Encryption Client. Saat Anda menggunakan AttributeEncryptor
dengan DynamoDBMapper
, item tersebut secara transparan mengenkripsi dan menandatangani item Anda saat Anda menyimpannya. Item ini juga secara transparan memverifikasi dan mendekripsi item Anda ketika Anda memuatnya.
Mengonfigurasi perilaku penyimpanan
Anda dapat menggunakan AttributeEncryptor
dan DynamoDBMapper
untuk menambah atau mengganti item tabel dengan atribut yang ditandatangani saja atau dienkripsi dan ditandatangani. Untuk tugas-tugas ini, kami sarankan Anda mengonfigurasinya untuk menggunakan perilaku penyimpanan PUT
, seperti yang ditunjukkan dalam contoh berikut. Jika tidak, Anda mungkin tidak dapat mendekripsi data.
DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
Jika Anda menggunakan perilaku penyimpanan default, yang hanya memperbarui atribut yang dimodelkan dalam item tabel, atribut yang tidak dimodelkan tidak disertakan dalam tanda tangan, dan tidak diubah oleh penulisan tabel. Akibatnya, pada pembacaan semua atribut nanti, tanda tangan tidak akan memvalidasi, karena tidak menyertakan atribut yang tidak dimodelkan.
Anda juga dapat menggunakan perilaku penyimpanan CLOBBER
. Perilaku ini identik dengan perilaku penyimpanan PUT
kecuali pada bagian perilaku ini menonaktifkan penguncian optimis dan menimpa item dalam tabel.
Untuk mencegah kesalahan tanda tangan, Klien Enkripsi DynamoDB melempar pengecualian runtime jika AttributeEncryptor
digunakan dengan DynamoDBMapper
yang tidak dikonfigurasi dengan perilaku penyimpanan atau. CLOBBER
PUT
Untuk melihat kode ini digunakan dalam contoh, lihat Menggunakan D ynamoDBMapper dan AwsKmsEncryptedObjectcontoh.javaaws-dynamodb-encryption-java
repositori di. GitHub
Tindakan atribut di Java
Tindakan atribut menentukan mana nilai atribut yang dienkripsi dan ditandatangani, mana yang hanya ditandatangani, dan mana yang diabaikan. Metode yang Anda gunakan untuk menentukan tindakan atribut tergantung pada apakah Anda menggunakan DynamoDBMapper
danAttributeEncryptor
, atau tingkat yang lebih rendah D. ynamoDBEncryptor
penting
Setelah Anda menggunakan tindakan atribut untuk mengenkripsi item tabel Anda, menambahkan atau menghapus atribut dari model data Anda dapat menyebabkan kesalahan validasi tanda tangan yang mencegah Anda mendekripsi data Anda. Untuk penjelasan detail, lihat Mengubah model data Anda.
Saat Anda menggunakan DynamoDBMapper
dan AttributeEncryptor
, Anda menggunakan anotasi untuk menentukan tindakan atribut. DynamoDB Encryption Client menggunakan anotasi atribut DynamoDB standar yang menentukan jenis atribut untuk menentukan cara melindungi atribut. Secara default, semua atribut dienkripsi dan ditandatangani kecuali kunci utama, yang ditandatangani tetapi tidak dienkripsi.
catatan
Jangan mengenkripsi nilai atribut dengan anotasi ynamoDBVersion Atribut @D, meskipun Anda dapat (dan harus) menandatanganinya. Jika dilakukan, syarat yang menggunakan nilai tersebut akan memiliki efek yang tidak diinginkan.
// Attributes are encrypted and signed @DynamoDBAttribute(attributeName="Description") // Partition keys are signed but not encrypted @DynamoDBHashKey(attributeName="Title") // Sort keys are signed but not encrypted @DynamoDBRangeKey(attributeName="Author")
Untuk menentukan pengecualian, gunakan anotasi enkripsi yang didefinisikan dalam DynamoDB Encryption Client untuk Java. Jika Anda menentukannya di tingkat kelas, pengecualian itu menjadi nilai default untuk kelas tersebut.
// Sign only @DoNotEncrypt // Do nothing; not encrypted or signed @DoNotTouch
Sebagai contoh, anotasi ini menandatangani tetapi tidak mengenkripsi atribut PublicationYear
, dan tidak mengenkripsi atau menandatangani nilai atribut ISBN
.
// Sign only (override the default) @DoNotEncrypt @DynamoDBAttribute(attributeName="PublicationYear") // Do nothing (override the default) @DoNotTouch @DynamoDBAttribute(attributeName="ISBN")
Untuk menentukan tindakan atribut saat Anda menggunakan D ynamoDBEncryptorHashMap
objek di mana pasangan nama-nilai mewakili nama atribut dan tindakan yang ditentukan.
Nilai-nilai yang valid adalah untuk tindakan atribut yang didefinisikan dalam jenis EncryptionFlags
yang disebutkan. Anda dapat menggunakan ENCRYPT
dan SIGN
secara bersamaan, menggunakan SIGN
saja, atau tidak menggunakan keduanya. Namun, jika Anda menggunakan ENCRYPT
saja, DynamoDB Encryption Client menyebabkan kesalahan. Anda tidak dapat mengenkripsi atribut yang tidak Anda tanda tangani.
ENCRYPT SIGN
Awas
Jangan mengenkripsi atribut kunci utama. Atribut tersebut harus tetap dalam plaintext sehingga DynamoDB dapat menemukan item tanpa memindai keseluruhan tabel.
Jika Anda menentukan kunci utama dalam konteks enkripsi dan kemudian menetapkan ENCRYPT
dalam tindakan atribut untuk atribut kunci utama, DynamoDB Encryption Client membuat pengecualian.
Misalnya, kode Java berikut membuat actions
HashMap yang mengenkripsi dan menandatangani semua atribut dalam item. record
Pengecualiannya adalah atribut kunci partisi dan kunci penyortiran, yang ditandatangani tetapi tidak dienkripsi, dan atribut test
, yang tidak ditandatangani atau dienkripsi.
final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN); final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN); final Map<String, Set<EncryptionFlags>> actions = new HashMap<>(); for (final String attributeName : record.keySet()) { switch (attributeName) { case partitionKeyName: // no break; falls through to next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Don't encrypt or sign break; default: // Encrypt and sign everything else actions.put(attributeName, encryptAndSign); break; } }
Kemudian, ketika Anda memanggil encryptRecordDynamoDBEncryptor
, tentukan peta sebagai nilai attributeFlags
parameter. Sebagai contoh, panggilan untuk encryptRecord
ini menggunakan peta actions
.
// Encrypt the plaintext record final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
Menimpa nama tabel
Pada DynamoDB Encryption Client, nama tabel DynamoDB adalah elemen konteks enkripsi DynamoDB yang diteruskan ke metode enkripsi dan dekripsi. Ketika Anda mengenkripsi atau menandatangani item tabel, konteks enkripsi DynamoDB, termasuk nama tabel, secara kriptografis terikat pada ciphertext. Jika konteks enkripsi DynamoDB yang diteruskan ke metode dekripsi tidak cocok dengan konteks enkripsi DynamoDB yang diteruskan ke metode enkripsi, operasi dekripsi gagal.
Kadang-kadang, nama tabel berubah, seperti ketika Anda membuat cadangan tabel atau melakukan point-in-time pemulihan. Ketika Anda mendekripsi atau memverifikasi tanda tangan item ini, Anda harus menggunakan konteks enkripsi DynamoDB yang sama yang digunakan untuk mengenkripsi dan menandatangani item, termasuk nama tabel asli. Nama tabel saat ini tidak diperlukan.
Saat Anda menggunakan DynamoDBEncryptor
, Anda menyusun konteks enkripsi DynamoDB secara manual. Namun, jika Anda menggunakan DynamoDBMapper
, AttributeEncryptor
membuat konteks enkripsi DynamoDB untuk Anda, termasuk nama tabel saat ini. Untuk memerintahkan AttributeEncryptor
agar membuat konteks enkripsi dengan nama tabel yang berbeda, gunakan EncryptionContextOverrideOperator
.
Misalnya, kode berikut membuat contoh penyedia bahan kriptografi (CMP) dan. DynamoDBEncryptor
Kemudian kode itu memanggil metode setEncryptionContextOverrideOperator
pada DynamoDBEncryptor
. Kode itu menggunakan operator overrideEncryptionContextTableName
, yang menimpa satu nama tabel. Ketika dikonfigurasi dengan cara ini, AttributeEncryptor
membuat konteks enkripsi DynamoDB yang mencakup newTableName
menggantikan oldTableName
. Untuk contoh lengkap, lihat EncryptionContextOverridesWithDynamoDBMapper.java.
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn); final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName( oldTableName, newTableName));
Ketika Anda memanggil metode beban pada DynamoDBMapper
, yang mendekripsi dan memverifikasi item, Anda menentukan nama tabel asli.
mapper.load(itemClass, DynamoDBMapperConfig.builder() .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName)) .build());
Anda juga dapat menggunakan operator overrideEncryptionContextTableNameUsingMap
, yang menimpa beberapa nama tabel.
Operator penimpa nama tabel biasanya digunakan ketika mendekripsi data dan memverifikasi tanda tangan. Namun, Anda dapat menggunakannya untuk menetapkan nama tabel dalam konteks enkripsi DynamoDB dengan nilai yang berbeda saat mengenkripsi dan menandatangani.
Jangan gunakan operator penimpa nama tabel jika Anda menggunakan DynamoDBEncryptor
. Sebaliknya, buatlah konteks enkripsi dengan nama tabel asli dan kirimkan ke metode dekripsi.