You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:05:01