Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言验证Amazon SNS签名#_C#_Cryptography_Amazon Sns - Fatal编程技术网

C# 用C语言验证Amazon SNS签名#

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

我有一个ASP.NET端点,在那里我可以接收Amazon SNS消息。我想验证我收到的签名以及这些消息,并按照指南尝试匹配C#中的Java代码。以下是我到目前为止所做的(我只对验证通知感兴趣,而不是订阅确认):

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()