sor*_*ist 5 c# cryptography amazon-sns
我有一个 ASP.NET 端点,用于接收 Amazon SNS 消息。我想验证我收到的签名以及这些消息,并按照http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.example.java.html 上的指南尝试匹配中的 Java 代码C#。这是我到目前为止所拥有的(我只对验证通知感兴趣,而不是订阅确认):
private X509Certificate2 cert;
// cert is from constructor...
private bool IsValidMessageSignature(AmazonMessage msg)
{
// Verify the signature
var rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
var msgBytes = GetMessageBytes(msg);
var signedBytes = Convert.FromBase64String(msg.Signature);
return rsa.VerifyData(msgBytes, CryptoConfig.MapNameToOID("SHA1"), signedBytes);
}
private byte[] GetMessageBytes(AmazonMessage msg)
{
// Construct message string
var sb = new StringBuilder();
sb.AppendLine("Message");
sb.AppendLine(msg.Message);
sb.AppendLine("MessageId");
sb.AppendLine(msg.MessageId);
if (msg.Subject != null)
{
sb.AppendLine("Subject");
sb.AppendLine(msg.Subject);
}
sb.AppendLine("Timestamp");
sb.AppendLine(msg.Timestamp);
sb.AppendLine("TopicArn");
sb.AppendLine(msg.TopicArn);
sb.AppendLine("Type");
sb.AppendLine(msg.Type);
return Encoding.UTF8.GetBytes(sb.ToString());
}
Run Code Online (Sandbox Code Playgroud)
该rsa.VerifyData()步骤返回 false。我也用 Java 构建了这个示例,在这里它与我试图验证的相同消息以及我用于 C# 的相同证书都可以正常工作。
据我所知,这就是这两个程序的不同之处。C#GetMessageBytes字节数组返回 637 个字节,而 Java 等效项getMessageBytesToSign返回 627 个字节。不幸的是,出于安全原因,我无法在此处发布消息内容。我的 Java 设置默认使用 windows-1252 字符集,但即使我将 C# 编码更改为字节数组的大小仍然是 637。我对编码以及 C# 和 Java 之间的差异没有那么熟悉,所以我不知道它是否有任何重要性。
关于如何更改我的 C# 的任何想法?
Amazon.SimpleNotificationService.Util.Message.ParseMessage(SNS_MESSAGE).IsMessageSignatureValid()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |