Fly and Enjoy .Net!

Un espacio para compartir la experiencia del desarrollo de aplicaciones

Criptografía: Firmas Digitales con .NET Framework
Continuando con la entrega de apuntes relacionados con criptografía, en esta nota nos apoyamos del conocimiento de algoritmos hash, para poder revisar la generación de firmas digitales.
 
Una de las aportaciones más interesantes de este tipo de algoritmos es la posibilidad de validar la autenticidad de un dato, es muy común encontrar su aplicación en la generación de contraseñas seguras.
 
Y para poder llegar a implementar algo como esto, los invito a dar un paseo por un ejemplo donde veamos como, a través de las clases de criptografía de .NET podemos hacer la generación de firmas digitales utilizando algoritmos hash y posteriormente realizar la validación del mismo.
 
Así que comencemos:
 
  1. Vamos a crear un proyecto de aplicación Windows en el lenguaje de su preferencia, donde la forma principal podría quedar como lo muestra la figura.
 
 
  1. En el código realizar la importación del espacio de nombres System.Security.Cryptography
 
            VB
     Imports System.Security.Cryptography
    
     CS
     using System.Security.Cryptography;
 
 
  1. Definimos los siguientes miembros de clase, donde su función dentro de nuestro ejemplo será la siguiente:
 
hashAlg= Encargado de la generación del valor hash
cryptoAlg= Encargado de la generación de la firma de acuerdo al valor hash
input= Cadena de entrada
inputData= Representación como un arreglo de bytes de la cadena de entrada
hashValue= Valor hash de la cadena de entrada
signature= Valor de la firma de acuerdo al hash resultante
match= Valor booleano que nos indica si el dato corresponde con el original
 
     VB
 
    Private hashAlg As SHA1
    Private cryptoAlg As RSACryptoServiceProvider
    Private input As String
    Private inputData As Byte()
    Private hashValue As Byte()
    Private signature As Byte()
    Private match As Boolean
 
CS
 
     private SHA1 hashAlg;
     private RSACryptoServiceProvider cryptoAlg;
     private string input;
     private byte[] inputData;
     private byte[] hashValue;
     private byte[] signature;
     private bool match;
 
 
  1. En el método constructor de la clase, creamos la instancia de nuestras clases SHA1 y RSACryptoServiceProvider.
 
 
VB
 
Public Sub New()
 
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        hashAlg = SHA1.Create()
        cryptoAlg = New RSACryptoServiceProvider()
 
        ' Add any initialization after the InitializeComponent() call.
 
    End Sub
 
 
CS
 
   public Form1()
        {
            InitializeComponent();
            hashAlg = SHA1.Create();
            cryptoAlg = new RSACryptoServiceProvider();
 
        }
 
 
  1. Ahora, se define un método, el cual será el encargado de crear el valor de la firma de acuerdo al hash generado.
 
VB
 
Private Function CreateSignature(ByVal data As Byte())
 
        hashValue = hashAlg.ComputeHash(data)
        signature = cryptoAlg.SignHash(hashValue, "1.3.14.3.2.26")
        Return signature
 
    End Function
 
 
CS
 
        private byte[] CreateSignature(byte[] data)
        {
           
            hashValue = hashAlg.ComputeHash(data);
            signature = cryptoAlg.SignHash(hashValue,"1.3.14.3.2.26");
            return signature;
 
        }
 
 
Como nos damos cuenta, en el método SignHash, se hace con el uso de dos parámetros, el primero de ellos es el valor hash generado y el segundo corresponde a una cadena que puede tomar los siguientes valores de acuerdo al algoritmo utilizado:
 
Algoritmo
Valor
SHA1
"1.3.14.3.2.26"
MD5
“1.2.840.113549.2.5.”
 
 
  1. El siguiente paso, será definir un método para verificar la firma generada y poder revisar si es válida o no.
 
 
VB
 
Private Function VerifySignature(ByVal data As Byte(), ByVal signature As Byte())
 
        hashValue = hashAlg.ComputeHash(data)
        match = cryptoAlg.VerifyHash(hashValue, "1.3.14.3.2.26", signature)
        Return match
 
    End Function
 
CS
        private bool VerifySignature(byte[] data, byte[] signature)
        {
            hashValue = hashAlg.ComputeHash(data);
            bool match = cryptoAlg.VerifyHash(hashValue, "1.3.14.3.2.26", signature);
            return match;
        }
 
Es importante resaltar que la llamada al método VerifyHash se realiza proporcionando como parámetros el valor del hash correspondiente, la firma generada y el valor del algoritmo utilizado.
 
  1. En el clic del botón "Crear Firma" mandamos llamar el método CreateSignature
 
VB
 
    Private Sub btnCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreate.Click
 
        input = textInput.Text
        inputData = System.Text.Encoding.UTF8.GetBytes(input)
        signature = CreateSignature(inputData)
        textSignature.Text = Convert.ToBase64String(signature)
 
 
    End Sub
 
 
CS
 
        private void btnCreate_Click(object sender, EventArgs e)
        {
            string input = textInput.Text;
            inputData = System.Text.Encoding.UTF8.GetBytes(input);
            signature = CreateSignature(inputData);
            textSignature.Text = Convert.ToBase64String(signature);
          
 
        }
 
 
 
  1. En el clic del botón "Validar Firma" mandamos llamar el método VerifySignature
 
VB
 
    Private Sub btnVerify_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerify.Click
 
        input = textValidateInput.Text
        inputData = System.Text.Encoding.UTF8.GetBytes(input)
        match = VerifySignature(inputData, signature)
 
        MessageBox.Show("Is valid? " & match.ToString())
 
 
 
    End Sub
 
CS
        private void btnVerify_Click(object sender, EventArgs e)
        {
            string input = textValidateInput.Text;
            byte[] inputdata = System.Text.Encoding.UTF8.GetBytes(input);
         match = VerifySignature(inputdata, signature);
 
            MessageBox.Show("Is valid? " + match.ToString());
 
        }
 
  1. Una vez que tenemos definidos los métodos anteriores podemos probar nuestro ejemplo, con el siguiente valor como entrada.
 
Input= P@ssw0rd
 
Al momento de dar cllc en Create el método estará generando la firma correspondiente de acuerdo a la cadena que se ha proporcionado como entrada.
 
Una vez creado esto,  será importante poder verificar que el dato original no ha sufrido alguna modificación y para esto comprobamos contra la validación de la misma.
 
En la sección de “verificar la firma” ingrese el mismo valor como dato de entrada y compruebe el resultado.
 
 
 
En la imagen podemos ver el resultado contra el valor proporcionado P@ssw0rd, el cual nos devuelve el valor de verdadero pues en efecto corresponde al dato original, cualquier otro dato nos devuelve un valor de falso.
 
Listo, el paseo está por llegar a su fin y en esta ocasión la experiencia nos deja como, a través de un ejemplo sencillo podemos revisar la implementación de algoritmos hash para la generación de firmas digitales.
 
Como siempre, esperando que esta nota sea de utilidad y lo puedan implementar para la generación de aplicaciones más seguras.
 
Es un gusto compartir, nos encontramos en la próxima.  
 
Published Thursday, May 10, 2007 8:17 PM por Marcos
Archivado en: ,

Comentarios

# re: Criptografía: Firmas Digitales con .NET Framework@ Monday, May 21, 2007 3:22 PM

Gracias por el artículo, es de gran utilidad para el sistema que estoy desarrollando.

Saludos

by juancho

# re: Criptografía: Firmas Digitales con .NET Framework@ Wednesday, May 23, 2007 11:31 PM

Es un gusto saber que te ha servido, finalmente es parte del propósito de este este espacio

by Marcos