2014-12-19 2 views
2

У меня есть конечная точка ASP.NET, где я получаю сообщения Amazon SNS. Я хочу проверить подписи, которые я получаю вместе с этими сообщениями, и выполнил руководство по адресу http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.example.java.html, пытаясь сопоставить код Java на C#. Вот то, что я до сих пор (я заинтересован только в проверке уведомлений, а не подтверждения подписки):Проверка подписи SNS от Amazon в 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()); 
} 

rsa.VerifyData() шаг возвращает ложь. Я также создал пример в Java, и здесь он отлично работает с тем же сообщением, которое я пытаюсь проверить, и тем же сертификатом, который я использую для C#.

Здесь две программы различаются, насколько я могу видеть. Байт-массив C# GetMessageBytes возвращает 637 байт, тогда как эквивалент Java getMessageBytesToSign возвращает 627 байт. К сожалению, я не могу опубликовать содержимое сообщения здесь по соображениям безопасности. В моей настройке Java по умолчанию используется кодировка windows-1252, но даже если я изменил кодировку C# на то, что размер байтового массива по-прежнему равен 637. Я не настолько разбираюсь в кодировании и различиях между C# и Java, поэтому я не знаю, имеет ли это значение.

Любые идеи относительно того, как изменить свой C#?

+3

Дикое предположение, но, возможно, Java-код использует \ n для новых строк, а C# использует \ r \ n? – ntoskrnl

+0

Я проверил, и они оба используют \ r \ n. –

+0

Я проверил код java, с которым вы связались, и просто использует \ n ntoskrnl правильно. ex: stringToSign = "Message \ n"; –

ответ

1

Код Java заканчивается линиями \n. Версия C# (StringBuilder.AppendLine()) использует \r\n.

+0

Я предполагаю, что он мог бы сделать расширение 'public static StringBuilder AppendUnixLine (этоStringBuilder self, string value) {return self.Append (значение) .Append ("\ n"); } ' –

Смежные вопросы