翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Java 用 Amazon DynamoDB 暗号化クライアントの使用方法
注記
クライアント側の暗号化ライブラリの名前が AWS Database Encryption に変更されましたSDK。次のトピックには、DynamoDB Encryption Client for Java のバージョン 1.x~2.x および DynamoDB Encryption Client for Python のバージョン 1.x~3.x に関する情報が記載されています。詳細については、「AWS Database Encryption SDK for DynamoDB バージョンサポート」を参照してください。
このトピックでは、Java での Amazon DynamoDB 暗号化クライアントの機能の一部について説明します。他のプログラミング言語には実装されていない機能も含まれます。
DynamoDB 暗号化クライアントでのプログラミングの詳細については、Java の例 、 aws-dynamodb-encryption-java repository
の の例
アイテム暗号化: AttributeEncryptor および DynamoDBEncryptor
Java の DynamoDB 暗号化クライアントには、下位レベルの DynamoDBEncryptor
AttributeEncryptor
は、DynamoDB 暗号化クライアントの AWS SDK for Java で DynamoDBMapper DynamoDB Encryptor
を使用するのに役立つヘルパークラスです。DynamoDBMapper
で AttributeEncryptor
を使用すると、項目の保存時に項目が透過的に暗号化および署名されます。また、項目のロード時に項目が透過的に検証および復号されます。
保存動作の設定
AttributeEncryptor
および DynamoDBMapper
を使用して、署名のみが行われた属性または暗号化および署名された属性を持つテーブル項目を追加またはレプリケートできます。これらのタスクでは、次の例に示すように、PUT
保存動作を使用するよう設定することをお勧めします。そのように設定しない場合、データを復号できないことがあります。
DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
テーブルの項目でモデル化された属性のみを更新するデフォルトの保存動作を使用する場合、モデル化されていない属性は署名に含まれず、テーブルの書き込みによって変更されません。その結果、モデル化されていない属性が含まれていないため、その後のすべての属性の読み取りでは、署名は検証されません。
また、CLOBBER
保存動作を使用することもできます。この動作は、オプティミスティックロックを無効にしてテーブルの項目を上書きするという点を除いて、PUT
保存動作と同じです。
署名エラーを防ぐために、AttributeEncryptor
が CLOBBER
または PUT
の保存動作で設定されていない DynamoDBMapper
とともに使用される場合、DynamoDB Encryption Client はランタイム例外をスローします。
例で使用されているこのコードを確認するには、「」のaws-dynamodb-encryption-java
リポジトリのD の使用ynamoDBMapper「」とAwsKmsEncryptedObject「.java
Java の属性アクション
属性アクションでは、暗号化されて署名された属性値、署名のみされた属性値、無視される属性値を指定します。属性アクションを指定するために使用する方法は、 DynamoDBMapper
と を使用するかAttributeEncryptor
、下位レベルの D ynamoDBEncryptor
重要
属性アクションを使用してテーブル項目を暗号化した後、データモデルから属性を追加または削除すると、署名の検証エラーが発生し、データの復号ができなくなることがあります。詳細な説明については、「データモデルの変更」を参照してください。
DynamoDBMapper
および AttributeEncryptor
を使用する場合は、注釈を使用して属性アクションを指定します。DynamoDB 暗号化クライアントは標準の DynamoDB 属性の注釈を使用して、属性を保護する方法を決定する属性のタイプを定義します。デフォルトでは、プライマリキーを除く属性がすべて暗号化されます。これらの属性は署名されますが、暗号化はされません。
注記
属性の値は @D 属性ynamoDBVersion注釈 で暗号化しないでください。ただし、署名することはできます (また、署名する必要があります)。それ以外の場合、その値を使用する条件によって、意図しない結果をもたらす場合があります。
// 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")
例外を指定するには、Java 用 Amazon DynamoDB 暗号化クライアントに定義されている暗号化注釈を使用します。クラスレベルで指定した場合は、クラスのデフォルト値になります。
// Sign only @DoNotEncrypt // Do nothing; not encrypted or signed @DoNotTouch
たとえば、これらの注釈で署名するが、PublicationYear
属性を暗号化しない場合は、ISBN
属性値を暗号化または署名しないでください。
// Sign only (override the default) @DoNotEncrypt @DynamoDBAttribute(attributeName="PublicationYear") // Do nothing (override the default) @DoNotTouch @DynamoDBAttribute(attributeName="ISBN")
DynamoDBEncryptorHashMap
オブジェクトを作成します。
属性アクションの有効な値は、列挙型の EncryptionFlags
で定義されています。ENCRYPT
と SIGN
を一緒に使用したり、SIGN
を単独で使用したりできます。また、両方除外することもできます。ただし、ENCRYPT
を単独で使用すると、DynamoDB 暗号化クライアントはエラーをスローします。未署名の属性を暗号化することはできません。
ENCRYPT SIGN
警告
プライマリキー属性を暗号化しないでください。DynamoDB でテーブル全体のスキャンを実行せずに項目を見つけられるように、プレーンテキストの状態を維持する必要があります。
暗号化コンテキストでプライマリキーを指定し、いずれかのプライマリキー属性の属性アクションで ENCRYPT
を指定した場合、DynamoDB 暗号化クライアントは例外をスローします。
例えば、次の Java コードは、record
項目内のすべての属性を暗号化して署名actions
HashMap する を作成します。例外は、署名されているが暗号化されていないパーティションキー属性とソートキー属性、および署名または暗号化されていない test
属性です。
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; } }
次に、 の encryptRecordDynamoDBEncryptor
、 attributeFlags
パラメータの値としてマップを指定します。たとえば、この encryptRecord
の呼び出しでは、actions
マップが使用されます。
// Encrypt the plaintext record final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
テーブル名の上書き
DynamoDB 暗号化クライアントでは、DynamoDB テーブルの名前は、暗号化メソッドおよび復号メソッドに渡される DynamoDB 暗号化コンテキストの要素です。テーブル項目を暗号化または署名すると、テーブル名を含む DynamoDB 暗号化コンテキストが暗号化テキストに暗号でバインドされます。復号メソッドに渡される DynamoDB 暗号化コンテキストが、暗号化メソッドに渡された DynamoDB 暗号化コンテキストと一致しない場合、復号オペレーションは失敗します。
テーブルのバックアップやpoint-in-time 復旧の実行時など、テーブルの名前が変更されることがあります。これらの項目の署名を復号または検証する際、元のテーブル名を含む、項目の暗号化と署名に使用されたのと同じ DynamoDB 暗号化コンテキストを渡す必要があります。現在のテーブル名は必要ありません。
DynamoDBEncryptor
を使用する場合、DynamoDB 暗号化コンテキストを手動で組み立てます。ただし、DynamoDBMapper
を使用している場合は、AttributeEncryptor
によって現在のテーブル名を含む DynamoDB 暗号化コンテキストが作成されます。異なるテーブル名で暗号化コンテキストを作成するよう AttributeEncryptor
に指示するには、EncryptionContextOverrideOperator
を使用します。
例えば、次のコードは、暗号化マテリアルプロバイダー (CMP) と のインスタンスを作成しますDynamoDBEncryptor
。次に、DynamoDBEncryptor
の setEncryptionContextOverrideOperator
メソッドを呼び出します。これは、1 つのテーブル名を上書きする overrideEncryptionContextTableName
演算子を使用します。このように設定すると、AttributeEncryptor
によって oldTableName
の代わりに newTableName
を含む DynamoDB 暗号化コンテキストが作成されます。完全な例については、EncryptionContextOverridesWithDynamoDBMapper.java
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn); final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName( oldTableName, newTableName));
項目を復号および検証する DynamoDBMapper
の load メソッドを呼び出す際、元のテーブル名を指定します。
mapper.load(itemClass, DynamoDBMapperConfig.builder() .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName)) .build());
また、複数のテーブル名を上書きする overrideEncryptionContextTableNameUsingMap
演算子を使用することもできます。
テーブル名の上書き演算子は通常、データの復号と署名の検証に使用されます。ただし、それらの演算子を使用して、暗号化および署名時に DynamoDB 暗号化コンテキスト内のテーブル名を別の値に設定することができます。
DynamoDBEncryptor
を使用している場合は、テーブル名の上書き演算子を使用しないでください。代わりに、元のテーブル名で暗号化コンテキストを作成し、復号メソッドに送信します。