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 ?? ""))
});
不幸的是它失败了,因为签名没有经过验证。如果我将这两个调用一个接一个地放置,并将 VerifyRequest
的 Signature
设置为 signReponse.Signature
验证成功。
这让我相信它与要存储在数据库中的签名流的 encoding/decoding 有关。我尝试了 Encoding
.
中可用的所有编码
我是不是漏掉了一些概念性的东西?这种情况下签名应该如何存储?
您似乎将签名解释为一系列 Unicode 代码点(使用 Unicode.GetString(byte[])
)。不是。它只是二进制数据。可能应该用 Convert.ToBase64String(byte[])
编码。
我有一个 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 ?? ""))
});
不幸的是它失败了,因为签名没有经过验证。如果我将这两个调用一个接一个地放置,并将 VerifyRequest
的 Signature
设置为 signReponse.Signature
验证成功。
这让我相信它与要存储在数据库中的签名流的 encoding/decoding 有关。我尝试了 Encoding
.
我是不是漏掉了一些概念性的东西?这种情况下签名应该如何存储?
您似乎将签名解释为一系列 Unicode 代码点(使用 Unicode.GetString(byte[])
)。不是。它只是二进制数据。可能应该用 Convert.ToBase64String(byte[])
编码。