25

Revisé muchos foros y ejemplos, pero ninguno me ayudó. Necesito verificar la firma de cualquier servicio web. Tengo un archivo test.crt con clave pública para verificar.Cómo verificar la firma, cargar la clave pública ¿Desde el archivo 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); 
} 

Pero resultado es siempre falsa :(

Tengo un ejemplo OpenSSL:.

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

he creado una aplicación sencilla que genera una firma para un texto e inmediatamente se verifica. Puede verificarlo aquí: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

Por lo tanto, el método anterior es bastante correcto. ¿Estás seguro de que estás utilizando los certificados adecuados para firmar y verificar? –

+3

Hice lo mismo con la aplicación web, por lo que no es una cosa web. ¿Cómo pasa una firma del servicio web a su aplicación? –

Respuesta

1

sospecho que el uso UnicodeEncoding podría ser la razón de los fracasos como se demuestra a continuación los bytes de ASCIIEncoding y UnicodeEncoding no son iguales porque ASCII es una codificación de 8 bits y en Windows la codificación Unicode es de 16 bits de ancho. En su otra pregunta, Can not get signature, ha utilizado ASCIIEncoding. Por lo tanto, suponiendo que la firma se compute en los bytes de ASCIIEcoding del texto/cadena yv erify usando UnicodeEncoding obviamente no coincidirá.

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

salidas

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10 
Cuestiones relacionadas