首页 > 解决方案 > AWS 签名、编码、验证

问题描述

我有一个 POCO,我正在为使用 AWS KeyManagementService 生成签名

var signResponse= await client.SignAsync(new Amazon.KeyManagementService.Model.SignRequest()
        {
            KeyId = "keyid",
            MessageType = MessageType.RAW,
            SigningAlgorithm = SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256,
            Message = new System.IO.MemoryStream(JsonSerializer.Serialize(item).ToByteArray())
        });

然后我将 sig 转换MemoryStreamstring并保存在数据库中

string sig = Encoding.Unicode.GetString(response.Signature.ToArray());

在检索对象(另一个请求)后,我使用验证签名

var verifyResponse = await client.VerifyAsync(new Amazon.KeyManagementService.Model.VerifyRequest()
        {
            KeyId = "keyid",
            MessageType = MessageType.RAW,
            SigningAlgorithm = SigningAlgorithmSpec.RSASSA_PKCS1_V1_5_SHA_256,
            Message = new System.IO.MemoryStream(JsonSerializer.Serialize(item).ToByteArray()),
            Signature = new System.IO.MemoryStream(Encoding.Unicode.GetBytes(sig ?? ""))
        });

不幸的是它失败了,因为签名没有得到验证。如果我将这两个电话一个接一个地拨打,并将其设置为Signature验证成功。VerifyRequestsignReponse.Signature

这让我相信它与存储在数据库中的签名流的编码/解码有关。我尝试了所有可用的编码Encoding

我错过了一些概念性的东西吗?在这种情况下应该如何存储签名?

标签: c#amazon-web-servicesencodingrsakey-management

解决方案


您似乎将签名解释为一系列 Unicode 代码点(使用Unicode.GetString(byte[]))。它不是。这只是二进制数据。可能应该用它来编码Convert.ToBase64String(byte[])


推荐阅读