25

J'ai passé en revue de nombreux forums et exemples, mais aucun ne m'a aidé. J'ai besoin de vérifier la signature de n'importe quel webservice. J'ai le fichier test.crt avec la clé publique pour vérifier.Comment vérifier la signature, chargement de la clé publique à partir du fichier 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); 
} 

mais le résultat est toujours faux :(

J'ai un exemple OpenSSL.

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

J'ai créé une application simple qui génère une signature pour un texte et vérifie immédiatement. Vous pouvez le vérifier ici: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

Donc la méthode ci-dessus est plutôt ok. Êtes-vous sûr que vous utilisez des certificats appropriés pour signer et vérifier? –

+3

J'ai fait la même chose avec l'application web, donc ce n'est pas une chose web. Comment passez-vous une signature du service Web à votre application? –

Répondre

1

je soupçonne que l'utilisation UnicodeEncoding pourrait être la raison de l'échec Comme démontré ci-dessous les octets de ASCIIEncoding et UnicodeEncoding ne sont pas les mêmes pour la raison ASCII est un encodage 8 bits et dans Windows Unicode encodage est de 16 bits de large.Pour votre autre question Can not get signature vous avez utilisé le ASCIIEncoding.En supposant que la signature est calculée sur les octets ASCIIEncoding du texte/chaîne et v Ériger en utilisant UnicodeEncoding ne correspondra évidemment pas.

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

Sorties

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10 
Questions connexes