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.
Verwenden des 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.
In diesem Thema werden einige Funktionen des DynamoDB Encryption Client in Java erklärt, die in anderen Programmiersprachenimplementierungen möglicherweise nicht zu finden sind.
Einzelheiten zur Programmierung mit dem DynamoDB Encryption Client finden Sie in den Java-Beispielen, den Beispielen im aws-dynamodb-encryption-java repository
on GitHub und im Javadoc
Themen
Elementverschlüsseler: und D AttributeEncryptor ynamoDBEncryptor
Der DynamoDB Encryption Client in Java hat zwei Elementverschlüsseler: den untergeordneten D und den. ynamoDBEncryptor AttributeEncryptor
Die AttributeEncryptor
ist eine Hilfsklasse, die Ihnen hilft, das D ynamoDBMapper in der AWS SDK for Java mit dem DynamoDB Encryptor
im DynamoDB Encryption Client zu verwenden. Wenn Sie den AttributeEncryptor
mit dem DynamoDBMapper
verwenden, verschlüsselt und signiert er Ihre Elemente transparent, wenn Sie sie speichern. Außerdem werden Ihre Elemente transparent überprüft und entschlüsselt, wenn Sie sie laden.
Konfigurieren des Speicherverhaltens
Sie können das AttributeEncryptor
und verwendenDynamoDBMapper
, um Tabellenelemente mit Attributen hinzuzufügen oder zu ersetzen, die nur signiert oder verschlüsselt und signiert sind. Für diese Aufgaben wird empfohlen, dass Sie sie so konfigurieren, dass das PUT
-Speicherverhalten verwendet wird, wie im folgenden Beispiel gezeigt. Andernfalls können Sie Ihre Daten möglicherweise nicht entschlüsseln.
DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
Wenn Sie das standardmäßige Speicherverhalten verwenden, bei dem nur die Attribute aktualisiert werden, die im Tabellenelement modelliert sind, sind Attribute, die nicht modelliert sind, nicht in der Signatur enthalten und werden auch nicht durch Tabellenschreibvorgänge geändert. Daher wird die Signatur bei späteren Lesevorgängen aller Attribute nicht validiert, da sie keine nicht modellierten Attribute enthält.
Sie können auch das CLOBBER
-Speicherverhalten verwenden. Dieses Verhalten stimmt mit dem PUT
-Speicherverhalten überein, mit der Ausnahme, dass es die optimistische Sperre deaktiviert und das Element in der Tabelle überschreibt.
Um Signaturfehler zu vermeiden, löst der DynamoDB Encryption Client eine Laufzeitausnahme aus, wenn ein mit einem verwendet AttributeEncryptor
wirdDynamoDBMapper
, das nicht mit dem Speicherverhalten oder konfiguriert ist. CLOBBER
PUT
Wie dieser Code in einem Beispiel verwendet wird, finden Sie unter Verwenden Sie das D ynamoDBMapper und das AwsKmsEncryptedObject.java-Beispielaws-dynamodb-encryption-java
GitHub
Attributaktionen in Java
Attribut-Aktionen bestimmen, welche Attributwerte verschlüsselt und signiert, welche nur signiert und welche ignoriert werden. Die Methode, mit der Sie Attributaktionen angeben, hängt davon abAttributeEncryptor
, ob Sie das DynamoDBMapper
und oder das D auf niedrigerer Ebene verwenden. ynamoDBEncryptor
Wichtig
Nachdem Sie die Attributaktionen zum Verschlüsseln der Tabellenelemente verwendet haben, kann das Hinzufügen oder Entfernen von Attributen zu oder aus Ihrem Datenmodell einen Signaturvalidierungsfehler verursachen, der ein Entschlüsseln Ihrer Daten verhindert. Eine detaillierte Beschreibung finden Sie unter Ändern Ihres Datenmodells.
Bei Einsatz des DynamoDBMapper
und AttributeEncryptor
verwenden Sie Annotationen zum Angeben der Attributaktionen. Der DynamoDB Encryption Client verwendet die standardmäßigen DynamoDB-Attributanmerkungen, die den Attributtyp definieren, um zu bestimmen, wie ein Attribut geschützt werden soll. Standardmäßig sind alle Attribute verschlüsselt und signiert, mit Ausnahme der Primärschlüssel, die zwar signiert, aber nicht verschlüsselt sind.
Anmerkung
Verschlüsseln Sie den Wert von Attributen nicht mit der @D ynamoDBVersion -Attribut-Annotation, obwohl Sie sie signieren können (und sollten). Andernfalls haben Bedingungen, die ihren Wert verwenden, unbeabsichtigte Auswirkungen.
// 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")
Um Ausnahmen anzugeben, verwenden Sie die Verschlüsselungsanmerkungen, die im DynamoDB Encryption Client für Java definiert sind. Wenn Sie sie auf Klassenebene angeben, werden sie zum Standardwert für die Klasse.
// Sign only @DoNotEncrypt // Do nothing; not encrypted or signed @DoNotTouch
Beispielsweise signieren diese Annotationen das PublicationYear
-Attribut, verschlüsseln es aber nicht, und sie verschlüsseln und signieren den ISBN
-Attributwert nicht.
// Sign only (override the default) @DoNotEncrypt @DynamoDBAttribute(attributeName="PublicationYear") // Do nothing (override the default) @DoNotTouch @DynamoDBAttribute(attributeName="ISBN")
Um Attributaktionen anzugeben, wenn Sie das D ynamoDBEncryptorHashMap
Objekt, in dem die Name-Wert-Paare für Attributnamen und die angegebenen Aktionen stehen.
Die gültigen Werte für die Attribut-Aktionen sind unter im Aufzählungstyp EncryptionFlags
definiert. Sie können ENCRYPT
und SIGN
gemeinsam oder SIGN
alleine verwenden, oder beides weglassen. Wenn Sie den DynamoDB Encryption Client jedoch ENCRYPT
alleine verwenden, gibt er einen Fehler aus. Ein Attribut, das Sie nicht signieren, können Sie nicht verschlüsseln.
ENCRYPT SIGN
Warnung
Verschlüsseln Sie die primären Schlüsselattribute nicht. Sie müssen im Klartext bleiben, damit DynamoDB das Element finden kann, ohne einen vollständigen Tabellenscan ausführen zu müssen.
Wenn Sie einen Primärschlüssel im Verschlüsselungskontext angeben und dann ENCRYPT
in der Attributaktion für eines der Primärschlüsselattribute angeben, löst der DynamoDB Encryption Client eine Ausnahme aus.
Der folgende Java-Code erstellt beispielsweise eine actions
HashMap , die alle Attribute im Element verschlüsselt und signiert. record
Ausnahmen sind die Partitionsschlüssel- und Sortierschlüsselattribute, die zwar signiert, aber nicht verschlüsselt sind, sowie das test
-Attribut, das weder signiert noch 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: // 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; } }
Wenn Sie dann die encryptRecordDynamoDBEncryptor
, geben Sie die Map als Wert des attributeFlags
Parameters an. Der folgende Aufruf von encryptRecord
beispielsweise verwendet die actions
-Map.
// Encrypt the plaintext record final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
Überschreiben von Tabellennamen
Im DynamoDB Encryption Client ist der Name der DynamoDB-Tabelle ein Element des DynamoDB-Verschlüsselungskontextes, das an die Verschlüsselungs - und Entschlüsselungsmethoden übergeben wird. Wenn Sie Tabellenelemente verschlüsseln oder signieren, ist der DynamoDB-Verschlüsselungskontext, einschließlich des Tabellennamens, kryptografisch an den Chiffretext gebunden. Wenn der DynamoDB-Verschlüsselungskontext, der an die Entschlüsselungsmethode übergeben wird, nicht mit dem DynamoDB-Verschlüsselungskontext übereinstimmt, der an die Verschlüsselungsmethode übergeben wurde, schlägt der Entschlüsselungsvorgang fehl.
Gelegentlich ändert sich der Name einer Tabelle, z. B. wenn Sie eine Tabelle sichern oder eine Wiederherstellung durchführen. point-in-time Wenn Sie die Signatur dieser Elemente entschlüsseln oder überprüfen, müssen Sie denselben DynamoDB-Verschlüsselungskontext übergeben, der zum Verschlüsseln und Signieren der Elemente verwendet wurde, einschließlich des ursprünglichen Tabellennamens. Der aktuelle Tabellenname wird nicht benötigt.
Wenn Sie den verwendenDynamoDBEncryptor
, stellen Sie den DynamoDB-Verschlüsselungskontext manuell zusammen. Wenn Sie jedoch den verwenden, AttributeEncryptor
erstellt der den DynamoDBMapper
DynamoDB-Verschlüsselungskontext für Sie, einschließlich des aktuellen Tabellennamens. Um dem AttributeEncryptor
mitzuteilen, einen Verschlüsselungskontext mit einem anderen Tabellennamen zu erstellen, verwenden Sie den EncryptionContextOverrideOperator
.
Mit dem folgenden Code werden beispielsweise Instanzen des Anbieters für kryptografische Materialien (CMP) und des erstellt. DynamoDBEncryptor
Dann ruft er die Methode setEncryptionContextOverrideOperator
des DynamoDBEncryptor
auf. Er verwendet den Operator overrideEncryptionContextTableName
, der einen Tabellennamen überschreibt. Wenn es auf diese Weise konfiguriert ist, AttributeEncryptor
erstellt das einen DynamoDB-Verschlüsselungskontext, der anstelle von Folgendes umfasstnewTableName
. oldTableName
Ein vollständiges Beispiel finden Sie unter EncryptionContextOverridesWithDynamo DBMapper .java.
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn); final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName( oldTableName, newTableName));
Wenn Sie die Load-Methode von DynamoDBMapper
aufrufen, die das Element entschlüsselt und überprüft, geben Sie den ursprünglichen Tabellennamen an.
mapper.load(itemClass, DynamoDBMapperConfig.builder() .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName)) .build());
Sie können auch den Operator overrideEncryptionContextTableNameUsingMap
verwenden, der mehrere Tabellennamen überschreibt.
Beim Entschlüsseln von Daten und beim Überprüfen von Signaturen werden in der Regel Operatoren zum Überschreiben des Tabellennamens verwendet. Sie können sie jedoch verwenden, um den Tabellennamen im DynamoDB-Verschlüsselungskontext beim Verschlüsseln und Signieren auf einen anderen Wert festzulegen.
Setzen Sie nicht die Operatoren zum Überschreiben des Tabellennamens ein, wenn Sie den DynamoDBEncryptor
verwenden. Erstellen Sie stattdessen einen Verschlüsselungskontext mit dem ursprünglichen Tabellennamen und senden Sie ihn an die Entschlüsselungsmethode.