Autenticación de usuarios usando criptografía de .NET Framework
Almacenando contraseñas cifradas y autenticando usuarios en una base de datos con contraseñas cifradas.

Fecha: 09/Ene/2005 (07/Ene/05)
Autor: Serge Valsse (svalsse@hotmail.com)

 


Una de las formas más usadas para autenticar usuarios en una aplicación es la de pedir sus credenciales (login y password) en un formulario y verificar si son válidas en una base de datos.

El tema es entonces como resguardar los password de los usuarios en la base de datos. Para eso haremos uso de la criptografía. La criptografía nos permite combinar caracteres con significado en caracteres que carecen de significado, de modo que no puedan ser leídos por personas que no deben tener acceso a ellos.

La criptografía abarca muchos conceptos de seguridad, pero para el caso de mantener una contraseña a salvo nos interesa básicamente utilizar un algoritmo hash.

Aplicación de un Algoritmo Hash

Algoritmo hash es un algoritmo unidireccional que una vez se han transformado los datos, hace que resulte imposible recuperar el valor original. Existen diversas clases de algoritmos hash disponibles en .NET las más utilizadas son SHA1 y MD5.

Los dos algoritmos hash mencionados llevan a cabo la misma operación. Las diferencias entre ellos radican simplemente en el tamaño de la clave que se utiliza para crear el hash y el algoritmo utilizado. Cuanto mayor sea la clave utilizada, más fuerte será el cifrado. Por ejemplo, MD5 utiliza una clave de cifrado de un tamaño superior que SHA1; por tanto, MD5 resulta un hash más difícil de quebrantar.

El siguiente método escrito en C# retorna el valor hash utilizando el proveedor de servicios de criptografía SHA1 del parámetro tipo string proporcionado.

private string encriptarSHA1(string vsValue)
{
    System.Security.Cryptography.HashAlgorithm hashValue = new System.Security.Cryptography.SHA1CryptoServiceProvider();

    // Convert the original string to array of Bytes
    byte[] byteValue = System.Text.Encoding.UTF8.GetBytes(vsValue);

    // Compute the Hash, returns an array of Bytes
    byte[] byteHash = hashValue.ComputeHash(byteValue);

    hashValue.Clear();

    // Return a base 64 encoded string of the Hash value
    return (Convert.ToBase64String(byteHash));
}
Se puede utilizar entonces este método para comparar el valor de la contraseña cifrada almacenada en la base de datos con el valor retornado por esté método habiendo pasando como parámetro la contraseña digitada por el usuario que quiere autenticarse.

Almacenando contraseñas cifradas

Haciendo uso del método anterior veremos como podemos utilizar la criptografía para almacenar contraseñas cifradas para posteriormente utilizarlas en la autenticación de usuarios.

1. Crear un formulario que permita almacenar la clave de un usuario en la base de datos, este formulario puede ser una de las opciones en el mantenimiento de usuarios que normalmente se desarrolla para aplicaciones empresariales.


Figura 1. Ejemplo de formulario de cambio de password de usuarios.



2. Después de las validaciones respectivas utilizando el método encriptarSHA1() encripte la contraseña ingresada por el usuario y almacene ese valor en la base de datos.

Para el caso, supongamos que el control donde se ingresa el password se llama txtPassword, pase el valor de la propiedad Text del campo como parámetro del método encriptarSHA1().

    string passwordEncriptado = encriptarSHA1(this.txtPassword.Text);


Autenticando usuarios en una base de datos con contraseñas cifradas

La otra parte es teniendo las contraseñas cifradas en una base de datos, poder autenticar a un usuarios que solicita acceso a una aplicación.

1. Crear un formulario que pida las credenciales del usuario. Ya estamos familiarizados con este tipo de formularios.


Figura 2. Ejemplo de formulario de autenticación de usuarios.



2. Recuperar la contraseña que se encuentra cifrada en la base de datos y compararla con el resultado del método encriptarSHA1() habiendo pasado como parámetro el valor de la propiedad Text del control donde se ingreso el password, digamos que le hemos nombrado txtPassword nuevamente y que el valor de la contraseña cifrada que esta en la base de datos esta en una variable llamada valorBaseDatos.

    if (encriptarSHA1(this.txtPassword.Text) == valorBaseDatos)
    {
        MessageBox.Show("Usuario válido.");
    }
    else
    {
        MessageBox.Show("Acceso denegado.");
    }


3. Si ambos valores son iguales significa que el valor de la contraseña almacenado en la base de datos fue generado a partir de un valor string igual al proporcionado por el usuario que intenta autenticarse, de lo contrario el password es inválido.

Lo interesante aquí, es que de ninguna manera se conoce el valor original que generó el valor almacenado en la base de datos, ya que no se "desencripta" para compararse, sino que por el contrario se aplica el algoritmo hash al string que se quiere comparar.

Éxitos y si este artículo te sirvió en alguna medida no olvides calificarlo en la caja de PanoramaBox.

Serge Valsse
svalsse@hotmail.com


 


ir al índice