25

Ho esaminato molti forum ed esempi, ma nessuno mi ha aiutato. Ho bisogno di verificare la firma da qualsiasi webservice. Ho un file test.crt con chiave pubblica per la verifica.Come verificare la firma, caricando il TASTO PUBBLICO dal file CRT?

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); 
} 

Ma risultato è sempre falsa :(

Ho un esempio OpenSSL:.

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

Ho creato una semplice applicazione che genera una firma per un testo e subito la verifica. Puoi controllare qui: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

Quindi il metodo sopra è piuttosto ok. Sei sicuro di utilizzare i certificati appropriati per la firma e la verifica? –

+3

Ho fatto lo stesso con l'app Web, quindi non è una cosa del web. Come passi una firma dal servizio web alla tua app? –

risposta

1

ho il sospetto l'uso UnicodeEncoding potrebbe essere il motivo per i guasti Come dimostrato al di sotto del byte di ASCIIEncoding e UnicodeEncoding non sono gli stessi per il motivo ASCII è una codifica a 8 bit e in Windows Unicode la codifica è a 16 bit. Nell'altra domanda Can not get signature hai utilizzato ASCIIEncoding. Quindi assumendo che la firma sia calcolata sui byte di codifica ASCIIE del testo/stringa e v erificare usando UnicodeEncoding ovviamente non corrisponderà.

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

uscite

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10 
Problemi correlati