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:
- 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.
- 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;
- 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;
- 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();
}
- 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.” |
- 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.
- 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);
}
- 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());
}
- 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.