es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problemas con el método ecdsa.VerifyData().

Estoy tratando de verificar algunos datos con una clave pública utilizando el método ecdsa.VerifyData(), que estoy firmando con una clave privada y me está devolviendo un valor falso y no sé por qué.

Estos son los métodos para firmar y verificar los datos:

    public byte[] SignData(byte[] dataValue)
    {
        X509Certificate2 privateKey = new X509Certificate2(privateKeyPfxFile);

        //Encryptando/Firmando un hash
        using (ECDsa ecdsa = privateKey.GetECDsaPrivateKey())
        {
            if (ecdsa == null) throw new Exception("No es un certificado ECDSA o no tiene clave privada");

            return ecdsa.SignData(dataValue, HashAlgorithmName.SHA256);
        }
    }
    public bool VerifyData(byte[] dataValue, byte[] dataSigned)
    {
        byte[] mycertCer = Properties.Resources.mycertCer;
        X509Certificate2 publicKey = new X509Certificate2(mycertCer);

        //Comprobando el hash y la firma
        using (ECDsa ecdsa = publicKey.GetECDsaPublicKey())
        {
            if (ecdsa == null) throw new Exception("No es un certificado ECDSA o no tiene clave privada");

            return ecdsa.VerifyData(dataValue, dataSigned, HashAlgorithmName.SHA256);
        }
    }

Así es como creo las claves:

    public void CreateAsymmetricKeysPair(string path, string keyName)
    {
        var ecdsa = ECDsa.Create(); // generar par de claves asimétricas
        var req = new CertificateRequest("cn=localhost", ecdsa, HashAlgorithmName.SHA256);
        var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(5));

        // Crear PFX (PKCS #12) con la clave privada
        File.WriteAllBytes(Path.Join(path, keyName + ".pfx"), cert.Export(X509ContentType.Pfx));

        // Crear CER codificada en Base 64 (sólo la clave pública)
        File.WriteAllText(Path.Join(path,keyName + ".cer"),
            "-----BEGIN CERTIFICATE-----\r\n" 
            + Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks)
            + "\r\n-----END CERTIFICATE-----");
    }

Este es mi test unitario en el que recibo un valor falso:

    private const string rawText = "test";

    [Fact]
    public void OnSignData_DoReturnSignature_WhenValidStream()
    {
        //Arrange
        var rawBytes = Encoding.UTF8.GetBytes(rawText);

        //Act
        var signature = licenseService.SignData(rawBytes);
        var isValid = licenseService.VerifyData(rawBytes, signature);

        //Assert
        Assert.True(isValid);
    }

¿Me estoy perdiendo algo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Podrían haber múltiples razones para la falsa respuesta del método ecdsa.VerifyData().

    Primero, revise si las llaves públicas y privadas han sido creadas y cargadas correctamente. Asegúrese de que las llaves públicas y privadas son una pareja válida y que se corresponden entre sí.

    Segundo, revise si los valores de los datos que se firmaron y los datos son los mismos durante la verificación. El método VerifyData() compara la firma con los datos provistos utilizando el algoritmo de hash especificado. Asegúrese de que se utilice el mismo algoritmo de hash para la firma y la verificación de los datos.

    Tercero, revise si hubo alguna modificación hecha a los datos o la firma. Cualquier modificación a los datos o firma causará que la verificación falle.

    Por último, revise la codificación utilizada durante la generación y verificación de la firma. Asegúrese de que se utilice la misma codificación para la generación y verificación de la firma.

    En resumen, revise la pareja de llaves, datos, algoritmo de hash, codificación y cualquier modificación hecha a los datos o firma durante la verificación de la firma.

Comments are closed.