25

Ich habe viele Foren und Beispiele durchgesehen, aber keine hat mir geholfen. Ich muss die Signatur von jedem Webservice überprüfen. Ich habe test.crt Datei mit öffentlichem Schlüssel für überprüfen.So überprüfen Sie die Signatur und laden den öffentlichen Schlüssel aus der CRT-Datei?

static bool Verify(string text, string signature) 
{ 
    X509Certificate2 cert = new X509Certificate2(
     HttpContext.Current.Server.MapPath("test-server.cert")); 
    RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key; 

    // Hash the data 
    SHA1Managed sha1 = new SHA1Managed(); 
    UnicodeEncoding encoding = new UnicodeEncoding(); 
    byte[] data = encoding.GetBytes(text); 
    byte[] sign = Convert.FromBase64String(signature); 
    byte[] hash = sha1.ComputeHash(data); 

    return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign); 
} 

Aber Ergebnis ist immer falsch :(

Ich habe ein OpenSSL. Beispiel:

openssl base64 -d -in signature -out signature.bin 
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway 
+0

habe ich eine einfache Anwendung, die eine Signatur für einen Text erzeugt und überprüft es sofort. Sie können es hier überprüfen: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

So ist die obige Methode eher in Ordnung. Sind Sie sicher, dass Sie richtige Zertifikate zum Signieren und Verifizieren verwenden? –

+3

Ich habe das gleiche mit der Web-App gemacht, also ist es keine Web-Sache. Wie übermittelst du eine Signatur vom Webservice an deine App? –

Antwort

1

Ich vermute, dass die Verwendung Unicodeen der Grund für Ausfälle sein könnte, wie unter der Bytes ASCIIEncoding demonstriert und UnicodeEncoding sind nicht gleich, weil ASCII eine 8-Bit-Codierung ist und in Windows Unicode-Codierung 16 Bit breit ist.In Ihrer anderen Frage Can not get signature haben Sie die ASCIIEncoding.So angenommen, Signatur wird auf den ASCIIEncoding Bytes des Textes/Zeichenfolge und v berechnet Erify mit UnicodeEncoding wird offensichtlich nicht übereinstimmen.

string text = "Hello"; 
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length); 
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length); 

Ausgänge

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10