Contoh kode untuk DynamoDB Encryption Client untuk Java - AWS Enkripsi Database SDK

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Contoh kode untuk 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.

Contoh berikut menunjukkan cara menggunakan DynamoDB Encryption Client untuk Java guna melindungi item tabel DynamoDB dalam aplikasi Anda. Anda dapat menemukan lebih banyak contoh (dan berkontribusi sendiri) di direktori contoh aws-dynamodb-encryption-javarepositori di. GitHub

Menggunakan D ynamoDBEncryptor

Contoh ini menunjukkan cara menggunakan D tingkat yang lebih rendah ynamoDBEncryptor dengan Direct KMS Provider. KMSPenyedia Langsung menghasilkan dan melindungi materi kriptografinya di bawah AWS KMS keyin AWS Key Management Service (AWS KMS) yang Anda tentukan.

Anda dapat menggunakan penyedia materi kriptografi yang kompatibel (CMP) denganDynamoDBEncryptor, dan Anda dapat menggunakan KMS Penyedia Langsung dengan DynamoDBMapper dan AttributeEncryptor.

Lihat contoh kode lengkapnya: AwsKmsEncryptedItem.java

Langkah 1: Buat KMS Penyedia Langsung

Buat instance AWS KMS klien dengan wilayah yang ditentukan. Kemudian, gunakan instance klien untuk membuat instance KMS Penyedia Langsung dengan pilihan Anda AWS KMS key.

Contoh ini menggunakan Amazon Resource Name (ARN) untuk mengidentifikasi AWS KMS key, tetapi Anda dapat menggunakan pengenal kunci yang valid.

final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
Langkah 2: Buat item

Contoh ini mendefinisikan record HashMap yang mewakili item tabel sampel.

final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map<String, AttributeValue> record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("value1")); record.put(sortKeyName, new AttributeValue().withN("55")); record.put("example", new AttributeValue().withS("data")); record.put("numbers", new AttributeValue().withN("99")); record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); record.put("test", new AttributeValue().withS("test-value"));
Langkah 3: Buat D ynamoDBEncryptor

Buat instance DynamoDBEncryptor dengan Direct KMS Provider.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
Langkah 4: Buat konteks enkripsi DynamoDB

Konteks enkripsi DynamoDB berisi informasi tentang struktur tabel dan bagaimana tabel itu dienkripsi dan ditandatangani. Jika Anda menggunakan DynamoDBMapper, AttributeEncryptor membuat konteks enkripsi untuk Anda.

final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
Langkah 5: Buat objek tindakan atribut

Tindakan atribut menentukan mana atribut item yang dienkripsi dan ditandatangani, mana yang hanya ditandatangani, dan mana yang tidak dienkripsi dan ditandatangani.

Di Java, untuk menentukan tindakan atribut, Anda membuat HashMap nama atribut dan pasangan EncryptionFlags nilai.

Misalnya, kode Java berikut membuat actions HashMap yang mengenkripsi dan menandatangani semua atribut dalam record item, kecuali untuk kunci partisi dan atribut kunci sortir, yang ditandatangani, tetapi tidak dienkripsi, dan test atribut, 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: // fall through to the next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Neither encrypted nor signed break; default: // Encrypt and sign all other attributes actions.put(attributeName, encryptAndSign); break; } }
Langkah 6: Enkripsi dan tanda tangani item

Untuk mengenkripsi dan menandatangani item tabel, panggil metode encryptRecord pada instans DynamoDBEncryptor. Tentukan item tabel (record), tindakan atribut (actions), dan konteks enkripsi (encryptionContext).

final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
Langkah 7: Masukkan item ke dalam tabel DynamoDB

Akhirnya, letakkan item yang dienkripsi dan ditandatangani ke dalam tabel DynamoDB.

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); ddb.putItem(tableName, encrypted_record);

Menggunakan D ynamoDBMapper

Contoh berikut menunjukkan cara menggunakan DynamoDB mapper helper class dengan Direct Provider. KMS KMSPenyedia Langsung menghasilkan dan melindungi materi kriptografinya di bawah AWS KMS keyin AWS Key Management Service (AWS KMS) yang Anda tentukan.

Anda dapat menggunakan penyedia materi kriptografi yang kompatibel (CMP) denganDynamoDBMapper, dan Anda dapat menggunakan KMS Penyedia Langsung dengan tingkat yang lebih rendahDynamoDBEncryptor.

Lihat contoh kode lengkapnya: AwsKmsEncryptedObject.java

Langkah 1: Buat KMS Penyedia Langsung

Buat instance AWS KMS klien dengan wilayah yang ditentukan. Kemudian, gunakan instance klien untuk membuat instance KMS Penyedia Langsung dengan pilihan Anda AWS KMS key.

Contoh ini menggunakan Amazon Resource Name (ARN) untuk mengidentifikasi AWS KMS key, tetapi Anda dapat menggunakan pengenal kunci yang valid.

final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
Langkah 2: Buat DynamoDB Encryptor dan D ynamoDBMapper

Gunakan Direct KMS Provider yang Anda buat pada langkah sebelumnya untuk membuat instance dari DynamoDB Encryptor. Anda perlu membuat instans bagi DynamoDB Encryptor yang tingkatnya lebih rendah untuk menggunakan DynamoDB Mapper.

Berikutnya, membuat sebuah instans dari database DynamoDB Anda dan konfigurasi mapper, dan menggunakannya untuk membuat sebuah instance dari DynamoDB Mapper.

penting

Saat menggunakan DynamoDBMapper untuk menambah atau mengedit item yang ditandatangani (atau dienkripsi dan ditandatangani), atur konfigurasinya untuk menggunakan perilaku penympanan, seperti PUT, yang mencakup semua atribut, seperti yang ditunjukkan dalam contoh berikut. Jika tidak, Anda mungkin tidak dapat mendekripsi data.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp) final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
Langkah 3: Tentukan tabel DynamoDB Anda

Selanjutnya, tentukan tabel DynamoDB Anda. Gunakan anotasi untuk menentukan tindakan atribut. Contoh ini membuat tabel DynamoDB, ExampleTable, dan kelas DataPoJo yang mewakili item tabel.

Dalam tabel contoh ini, atribut kunci utama akan ditandatangani tetapi tidak dienkripsi. Hal ini berlaku untuk partition_attribute, yang dianotasikan dengan @DynamoDBHashKey, dan sort_attribute, yang dianotasikan dengan @DynamoDBRangeKey.

Atribut yang dianotasikan dengan @DynamoDBAttribute, seperti some numbers, akan dienkripsi dan ditandatangani. Pengecualiannya mencakup atribut yang menggunakan anotasi enkripsi @DoNotEncrypt (hanya ditandatangani) atau @DoNotTouch (jangan dienkripsi atau ditandatangani) yang didefinisikan oleh DynamoDB Encryption Client. Sebagai contoh, karena atribut leave me memiliki anotasi @DoNotTouch, atribut ini tidak akan dienkripsi atau ditandatangani.

@DynamoDBTable(tableName = "ExampleTable") public static final class DataPoJo { private String partitionAttribute; private int sortAttribute; private String example; private long someNumbers; private byte[] someBinary; private String leaveMe; @DynamoDBHashKey(attributeName = "partition_attribute") public String getPartitionAttribute() { return partitionAttribute; } public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } @DynamoDBRangeKey(attributeName = "sort_attribute") public int getSortAttribute() { return sortAttribute; } public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } @DynamoDBAttribute(attributeName = "example") public String getExample() { return example; } public void setExample(String example) { this.example = example; } @DynamoDBAttribute(attributeName = "some numbers") public long getSomeNumbers() { return someNumbers; } public void setSomeNumbers(long someNumbers) { this.someNumbers = someNumbers; } @DynamoDBAttribute(attributeName = "and some binary") public byte[] getSomeBinary() { return someBinary; } public void setSomeBinary(byte[] someBinary) { this.someBinary = someBinary; } @DynamoDBAttribute(attributeName = "leave me") @DoNotTouch public String getLeaveMe() { return leaveMe; } public void setLeaveMe(String leaveMe) { this.leaveMe = leaveMe; } @Override public String toString() { return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute=" + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]"; } }
Langkah 4: Enkripsi dan simpan item tabel

Sekarang, ketika Anda membuat item tabel dan menggunakan DynamoDB Mapper untuk menyimpannya, item secara otomatis dienkripsi dan ditandatangani sebelum ditambahkan ke tabel.

Contoh ini mendefinisikan item tabel yang disebut record. Sebelum disimpan dalam tabel, atributnya dienkripsi dan ditandatangani berdasarkan anotasi di kelas DataPoJo. Dalam hal ini, semua atribut kecuali PartitionAttribute, SortAttribute, dan LeaveMe dienkripsi dan ditandatangani. PartitionAttribute dan SortAttributes hanya ditandatangani. Atribut LeaveMe tidak dienkripsi atau ditandatangani.

Untuk mengenkripsi dan menandatangani item record, dan kemudian menambahkannya ke ExampleTable, panggil metode save kelas DynamoDBMapper. Karena DynamoDB Mapper Anda dikonfigurasi untuk menggunakan perilaku penyimpanan PUT, item tersebut menggantikan semua item dengan kunci utama yang sama, bukan memperbaruinya. Hal ini memastikan tanda tangan cocok dan Anda dapat mendekripsi item ketika Anda mendapatkannya dari tabel.

DataPoJo record = new DataPoJo(); record.setPartitionAttribute("is this"); record.setSortAttribute(55); record.setExample("data"); record.setSomeNumbers(99); record.setSomeBinary(new byte[]{0x00, 0x01, 0x02}); record.setLeaveMe("alone"); mapper.save(record);