使用AWS数据库加密SDK时遇KMS密文长度不匹配错误求助
解决AWS Database Encryption SDK的"Invalid ciphertext"错误
问题背景
使用AWS Database Encryption SDK时触发错误:"Invalid response from AWS KMS GeneratedDataKey: Invalid ciphertext"。调试Java版AWS SDK v2后确认:KMS API返回的CiphertextBlob长度为140,但SDK硬编码期望长度为184,导致校验失败。相关自动生成代码片段如下:
// KMSKeystoreOperations_Compile.__default.java 第84行 _1185_valueOrError2 = Wrappers_Compile.__default .<software.amazon.cryptography.keystore.internaldafny.types.Error>Need( software.amazon.cryptography.keystore.internaldafny.types.Error._typeDescriptor(), ( ( ((_1181_generateResponse).dtor_CiphertextBlob()).is_Some() ) && ( java.util.Objects.equals( java.math.BigInteger.valueOf( ((_1181_generateResponse).dtor_CiphertextBlob()).dtor_value().length() // 返回140 ), Structure_Compile.__default.KMS__GEN__KEY__NO__PLAINTEXT__LENGTH__32() // 常量值184 ) // 结果为FALSE ) ) && ( software.amazon.cryptography.services.kms.internaldafny.types.__default.IsValid__CiphertextType( ((_1181_generateResponse).dtor_CiphertextBlob()).dtor_value() ) ), software.amazon.cryptography.keystore.internaldafny.types.Error.create_KeyStoreException( dafny.DafnySequence.asString("Invalid response from AWS KMS GeneratedDataKey: Invalid ciphertext") ) );
当前使用HierarchicalKeyring搭配Localstack的local-kms服务,核心代码及依赖如下:
核心代码
KeyStore globalKeyStore = KeyStore.builder() .KeyStoreConfig( KeyStoreConfig.builder() .ddbClient(myDdbClient) .ddbTableName("my-table") .logicalKeyStoreName("my-table") .kmsClient(myKmsClient) .kmsConfiguration( KMSConfiguration.builder() .kmsKeyArn("arn:aws:kms:sa-east-1:000000000000:key/00000000-0000-0000-0000-000000000001") .build()) .build()) .build(); globalKeyStore.CreateKeyStore(CreateKeyStoreInput.builder().build()); String branchKey = globalKeyStore.CreateKey(CreateKeyInput.builder() .branchKeyIdentifier() .build()).branchKeyIdentifier();
依赖配置(Gradle)
implementation platform("software.amazon.awssdk:bom:2.19.1") implementation "software.amazon.awssdk:dynamodb-enhanced" implementation "software.amazon.cryptography:aws-database-encryption-sdk-dynamodb:3.0.0" implementation "software.amazon.cryptography:aws-cryptographic-material-providers:1.0.0" implementation "software.amazon.awssdk:kms"
解决思路
- 指定Localstack KMS密钥算法:AWS KMS默认的对称密钥算法(SYMMETRIC_DEFAULT)对应AES-256,生成的数据密钥密文长度约为184。Localstack可能默认使用AES-128,导致密文长度缩短。创建KMS密钥时显式指定算法为
SYMMETRIC_DEFAULT,确保与SDK预期一致。 - 升级Localstack版本:旧版本Localstack的KMS实现可能存在兼容性问题,无法准确模拟AWS KMS的密文返回格式。升级到最新稳定版,修复已知的模拟偏差。
- 校验依赖版本兼容性:当前AWS SDK BOM(2.19.1)与Database Encryption SDK(3.0.0)的版本组合可能存在不兼容。查看SDK官方文档,使用推荐的依赖版本搭配,例如将AWS SDK BOM升级到匹配的版本。
- 临时绕过长度校验(仅测试环境):若为测试需求,可临时修改自动生成代码中的
KMS__GEN__KEY__NO__PLAINTEXT__LENGTH__32()常量值为140,但此方案仅作临时测试用,生产环境严禁使用。 - 用真实AWS KMS验证:切换到真实AWS KMS服务测试,若错误消失,说明问题源于Localstack的KMS模拟实现,可向Localstack仓库提交Issue反馈兼容性问题。
内容的提问来源于stack exchange,提问作者Glauber Dantas
相关产品推荐
相关产品推荐

