C# 用C语言验证Amazon SNS签名#
我有一个ASP.NET端点,在那里我可以接收Amazon SNS消息。我想验证我收到的签名以及这些消息,并按照指南尝试匹配C#中的Java代码。以下是我到目前为止所做的(我只对验证通知感兴趣,而不是订阅确认):C# 用C语言验证Amazon SNS签名#,c#,cryptography,amazon-sns,C#,Cryptography,Amazon Sns,我有一个ASP.NET端点,在那里我可以接收Amazon SNS消息。我想验证我收到的签名以及这些消息,并按照指南尝试匹配C#中的Java代码。以下是我到目前为止所做的(我只对验证通知感兴趣,而不是订阅确认): rsa.VerifyData()步骤返回false。我也用Java构建了这个示例,在这里,它可以很好地处理我试图验证的相同消息,以及我用于C#的相同证书 就我所知,这两个程序的不同之处就在这里。C#GetMessageBytesbyte数组返回637个字节,而Java等效的getMess
rsa.VerifyData()
步骤返回false。我也用Java构建了这个示例,在这里,它可以很好地处理我试图验证的相同消息,以及我用于C#的相同证书
就我所知,这两个程序的不同之处就在这里。C#GetMessageBytes
byte数组返回637个字节,而Java等效的getMessageBytesToSign
返回627个字节。不幸的是,出于安全原因,我无法在此发布消息内容。默认情况下,我的Java设置使用windows-1252字符集,但即使我将C#编码更改为字节数组大小仍为637。我对编码以及C#和Java之间的差异没有太多经验,所以我不知道这是否有什么重要意义
关于如何更改我的C#有什么想法吗?Java代码以
\n
结尾。C版本(StringBuilder.AppendLine()
)使用\r\n
它以这种方式为我工作:
var sb = new StringBuilder();
sb.Append("Message\n");
sb.Append(notificationWrapper.Message).Append("\n");
sb.Append("MessageId\n");
sb.Append(notificationWrapper.MessageId).Append("\n");
if (notificationWrapper.Subject != null)
{
sb.Append("Subject\n");
sb.Append(notificationWrapper.Subject).Append("\n");
}
sb.Append("Timestamp\n");
sb.Append(notificationWrapper.Timestamp).Append("\n");
sb.Append("TopicArn\n");
sb.Append(notificationWrapper.TopicArn).Append("\n");
sb.Append("Type\n");
sb.Append(notificationWrapper.Type).Append("\n");
return Encoding.UTF8.GetBytes(sb.ToString());
胡乱猜测,但可能Java代码使用\n换行符和C#使用\r\n?我已经检查过,它们都使用\r\n。我检查了您链接到的Java代码,它只是使用了\n ntoskrnl是正确的。例如:stringToSign=“Message\n”;
msg.MessageId
,msg.Timestamp
等的类型是什么。?时间可以用许多不同的方式格式化为字符串。例如,Guid与相同。但是10个字节的差异可能与您有10个AppendLine
的事实相匹配,因此您是否绝对确定\r\n
是正确的(@ntoskrnl的注释)?您可以检查sb.ToString().Any(ch=>ch>sbyte.MaxValue)
。如果是这种情况,UTF-8应该提供比Windows-1252更多的字节。如果不是这样,所有的东西都是ASCII,但是你仍然应该考虑使用<代码>编码。GetEncoding(“WiDOWS 1252”)GetBytes(SB ToString())< /代码>。我猜他可以做一个扩展<代码>公共静态StringBuilder AppendUnixLine(这个String Bu建器自己,字符串值){返回自。附加(value)。附加(“\n”);}< /Cord>
var sb = new StringBuilder();
sb.Append("Message\n");
sb.Append(notificationWrapper.Message).Append("\n");
sb.Append("MessageId\n");
sb.Append(notificationWrapper.MessageId).Append("\n");
if (notificationWrapper.Subject != null)
{
sb.Append("Subject\n");
sb.Append(notificationWrapper.Subject).Append("\n");
}
sb.Append("Timestamp\n");
sb.Append(notificationWrapper.Timestamp).Append("\n");
sb.Append("TopicArn\n");
sb.Append(notificationWrapper.TopicArn).Append("\n");
sb.Append("Type\n");
sb.Append(notificationWrapper.Type).Append("\n");
return Encoding.UTF8.GetBytes(sb.ToString());
Amazon.SimpleNotificationService.Util.Message.ParseMessage(SNS_MESSAGE).IsMessageSignatureValid()