AWS 签名、编码、验证

AWS Signature, Encoding, Verification

我有一个 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 MemoryStream 转换为 string 并保存在数据库中

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 ?? ""))
        });

不幸的是它失败了,因为签名没有经过验证。如果我将这两个调用一个接一个地放置,并将 VerifyRequestSignature 设置为 signReponse.Signature 验证成功。

这让我相信它与要存储在数据库中的签名流的 encoding/decoding 有关。我尝试了 Encoding.

中可用的所有编码

我是不是漏掉了一些概念性的东西?这种情况下签名应该如何存储?

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