c# - 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 转换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 ?? ""))
});
不幸的是它失败了,因为签名没有得到验证。如果我将这两个电话一个接一个地拨打,并将其设置为Signature
验证成功。VerifyRequest
signReponse.Signature
这让我相信它与存储在数据库中的签名流的编码/解码有关。我尝试了所有可用的编码Encoding
。
我错过了一些概念性的东西吗?在这种情况下应该如何存储签名?
解决方案
您似乎将签名解释为一系列 Unicode 代码点(使用Unicode.GetString(byte[])
)。它不是。这只是二进制数据。可能应该用它来编码Convert.ToBase64String(byte[])
。
推荐阅读
- ios - 为什么 UITableView 在重新加载数据时会缓存单元格?
- python - python 中有哪些可用的模块,例如 http 和 idlelib?
- android - 无法使用 Firebase 数据库在导航标题中显示配置文件图像
- python - odeint 方程组的动态生成
- java - 从 jpanel 中删除组件时出现 NullPointerException
- python - 使用日期时间过滤 json 结果 - 排除周末 - Python
- java - 使用 datastax 收听 cassandra 数据库
- javascript - Vue - 动态创建使用例如 v-on:click 的 div
- symfony - 与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错
- javascript - 在react-redux、redux-thunk中依次调用多个action