Beispielcode für den DynamoDB Encryption Client für Java - AWS Datenbankverschlüsselung SDK

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispielcode für den DynamoDB Encryption Client für Java

Anmerkung

Unsere clientseitige Verschlüsselungsbibliothek wurde in Database Encryption umbenannt. AWS SDK Das folgende Thema enthält Informationen zu Versionen 1. x —2. x des DynamoDB Encryption Client für Java und Versionen 1. x —3. x des DynamoDB Encryption Client für Python. Weitere Informationen finden Sie unter AWS Database Encryption SDK for DynamoDB-Versionsunterstützung.

Die folgenden Beispiele zeigen Ihnen, wie Sie den DynamoDB Encryption Client für Java verwenden, um DynamoDB-Tabellenelemente in Ihrer Anwendung zu schützen. Weitere Beispiele (und eigene Beispiele) finden Sie im Beispielverzeichnis des Repositorys unter. aws-dynamodb-encryption-java GitHub

Mit dem D ynamoDBEncryptor

Dieses Beispiel zeigt, wie das D der unteren Ebene ynamoDBEncryptor mit dem Direct KMS Provider verwendet wird. Der Direct KMS Provider generiert und schützt seine kryptografischen Materialien unter einem von Ihnen angegebenen AWS KMS keyWert in AWS Key Management Service (AWS KMS).

Sie können jeden kompatiblen Anbieter für kryptografisches Material (CMP) mit dem verwendenDynamoDBEncryptor, und Sie können den KMS Direktanbieter mit und verwenden. DynamoDBMapper AttributeEncryptor

Sehen Sie sich das vollständige Codebeispiel an: .java AwsKmsEncryptedItem

Schritt 1: Erstellen Sie den Direktanbieter KMS

Erstellen Sie eine Instanz des AWS KMS Clients mit der angegebenen Region. Verwenden Sie dann die Client-Instanz, um eine Instanz des Direct KMS Providers mit Ihrer bevorzugten zu erstellen AWS KMS key.

In diesem Beispiel wird der Amazon-Ressourcenname (ARN) verwendet, um die zu identifizieren AWS KMS key, aber Sie können jede gültige Schlüssel-ID verwenden.

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);
Schritt 2: Erstellen Sie ein Element

In diesem Beispiel wird a definiert record HashMap , das ein Beispieltabellenelement darstellt.

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"));
Schritt 3: Erstellen Sie ein D ynamoDBEncryptor

Erstellen Sie eine Instanz von DynamoDBEncryptor mit dem Direct KMS Provider.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
Schritt 4: Erstellen Sie einen DynamoDB-Verschlüsselungskontext

Der DynamoDB-Verschlüsselungskontext enthält Informationen über die Tabellenstruktur und wie sie verschlüsselt und signiert ist. Wenn Sie den DynamoDBMapperverwenden, erstellt der AttributeEncryptor den Verschlüsselungskontext für Sie.

final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
Schritt 5: Erstellen Sie das Attribut-Aktionen-Objekt

Attribut-Aktionen bestimmen, welche Attribute des Elements verschlüsselt und signiert sind, welche nur signiert und welche nicht verschlüsselt oder signiert sind.

In Java erstellen Sie zur Angabe von Attributaktionen eine Kombination HashMap aus Attributnamen und EncryptionFlags Wertepaaren.

Der folgende Java-Code erstellt beispielsweise eine, actions HashMap die alle Attribute im record Element verschlüsselt und signiert, mit Ausnahme der Partitionsschlüssel- und Sortierschlüsselattribute, die signiert, aber nicht verschlüsselt sind, und des test Attributs, das nicht signiert oder verschlüsselt ist.

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; } }
Schritt 6: Verschlüsseln und signieren Sie das Element

Um das Tabellenelement zu verschlüsseln und zu signieren, rufen Sie die Methode encryptRecord für die Instance des DynamoDBEncryptor auf. Geben Sie das Tabellenelement (record), die Attribut-Aktionen (actions) und den Verschlüsselungskontext (encryptionContext) an.

final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
Schritt 7: Fügen Sie das Element in die DynamoDB-Tabelle ein

Fügen Sie abschließend das verschlüsselte und signierte Element in die DynamoDB-Tabelle ein.

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

Verwenden Sie das D ynamoDBMapper

Das folgende Beispiel zeigt Ihnen, wie Sie die DynamoDB-Mapper-Helper-Klasse mit dem Direct Provider verwenden. KMS Der Direct KMS Provider generiert und schützt seine kryptografischen Materialien unter einem von Ihnen angegebenen Wert AWS KMS keyin AWS Key Management Service (AWS KMS).

Sie können jeden kompatiblen Anbieter für kryptografisches Material (CMP) mit dem verwendenDynamoDBMapper, und Sie können den KMS Direktanbieter mit der niedrigeren Ebene verwenden. DynamoDBEncryptor

Sehen Sie sich das vollständige Codebeispiel an: .java AwsKmsEncryptedObject

Schritt 1: Erstellen Sie den Direktanbieter KMS

Erstellen Sie eine Instanz des AWS KMS Clients mit der angegebenen Region. Verwenden Sie dann die Client-Instanz, um eine Instanz des Direct KMS Providers mit Ihrer bevorzugten zu erstellen AWS KMS key.

In diesem Beispiel wird der Amazon-Ressourcenname (ARN) verwendet, um die zu identifizieren AWS KMS key, aber Sie können jede gültige Schlüssel-ID verwenden.

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);
Schritt 2: DynamoDB Encryptor und D erstellen ynamoDBMapper

Verwenden Sie den Direct KMS Provider, den Sie im vorherigen Schritt erstellt haben, um eine Instanz von DynamoDB Encryptor zu erstellen. Sie müssen den DynamoDB Encryptor auf niedrigerer Ebene instanziieren, um den DynamoDB Mapper verwenden zu können.

Erstellen Sie als Nächstes eine Instanz Ihrer DynamoDB-Datenbank und eine Mapper-Konfiguration und verwenden Sie diese, um eine Instanz des DynamoDB-Mappers zu erstellen.

Wichtig

Wenn Sie den DynamoDBMapper zum Hinzufügen oder Bearbeiten signierter (oder verschlüsselter und signierter) Elemente verwenden, konfigurieren Sie ihn für die Nutzung eines Speicherverhaltens, z. B. PUT, das alle Attribute enthält, wie im folgenden Beispiel gezeigt. Andernfalls können Sie Ihre Daten möglicherweise nicht entschlüsseln.

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));
Schritt 3: Definieren Sie Ihre DynamoDB-Tabelle

Definieren Sie als Nächstes Ihre DynamoDB-Tabelle. Verwenden Sie Anmerkungen zum Angeben der Attributaktionen. In diesem Beispiel werden eine DynamoDB-Tabelle und eine DataPoJo Klasse erstelltExampleTable, die Tabellenelemente darstellt.

In dieser Beispiel-Tabelle werden die primären Schlüsselattribute signiert, aber nicht verschlüsselt. Dies gilt für das partition_attribute, das mit @DynamoDBHashKey und dem sort_attribute versehen ist, das mit @DynamoDBRangeKey versehen ist.

Attribute, die mit @DynamoDBAttribute versehen sind, z. B. some numbers, werden verschlüsselt und signiert. Ausnahmen sind Attribute, die die vom @DoNotEncrypt DynamoDB Encryption Client definierten Verschlüsselungsanmerkungen @DoNotTouch (nur signieren) oder (nicht verschlüsseln oder signieren) verwenden. Beispiel: Da das leave me-Attribut eine @DoNotTouch-Anmerkung hat, wird es nicht verschlüsselt oder signiert.

@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 + "]"; } }
Schritt 4: Ein Tabellenelement verschlüsseln und speichern

Wenn Sie jetzt ein Tabellenelement erstellen und es mit dem DynamoDB-Mapper speichern, wird das Element automatisch verschlüsselt und signiert, bevor es der Tabelle hinzugefügt wird.

In diesem Beispiel wird ein Tabellenelement mit der Bezeichnung record definiert. Bevor es in der Tabelle gespeichert wird, werden seine Attribute verschlüsselt und basierend auf den Anmerkungen in der DataPoJo-Klasse signiert. In diesem Fall werden alle Attribute mit Ausnahme von PartitionAttribute, SortAttribute und LeaveMe verschlüsselt und signiert. PartitionAttribute und SortAttributes werden nur signiert. Das LeaveMe-Attribut ist nicht verschlüsselt oder signiert.

Rufen Sie die save-Methode der DynamoDBMapper-Klasse auf, um das record-Element zu verschlüsseln und zu signieren und es dann zur ExampleTable hinzuzufügen. Da Ihr DynamoDB-Mapper für die Verwendung des PUT Speicherverhaltens konfiguriert ist, ersetzt das Element jedes Element mit denselben Primärschlüsseln, anstatt es zu aktualisieren. Auf diese Weise wird sichergestellt, dass die Signaturen übereinstimmen, und Sie können das Element entschlüsseln, wenn Sie es aus der Tabelle abrufen.

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