Encriptar contraseñas con SHA-2 de 256 bits

Encriptar Contraseña

Como comentaba en el artículo dedicado a Dividir el proyecto, con el que iniciaba la serie de artículos dedicados a Medidas básicas de seguridad para aplicaciones Access, necesitamos crear un sistema de seguridad para nuestro proyecto y uno de los aspectos básicos y más importantes de nuestro sistema será el control e identificación de accesos .

En posteriores artículos iremos desarrollando nuestro sistema de control e identificación de accesos pero antes quería comentar un aspecto que me parece básico para cualquiera que quiera desarrollar una aplicación multiusuario segura, el manejo de contraseñas.

Nuestro sistema de seguridad puede ser todo lo potente que queráis, pero si las contraseñas viajan sin encriptar por la red, cualquier atacante malintencionado podría capturarlas y utilizarlas en nuestra contra. Para evitar esto, voy a explicar un posible método para no enviar por la red contraseñas en texto plano, utilizando para ello una función hash de las más seguras que hay actualmente, SHA-2 de 256 bits.

Como sabréis, (si no, revisáis un poco los enlaces anteriores), se puede calcular una función hash de cualquier cadena de texto y siempre será la misma, pero es imposible (siempre que no rompan el algoritmo criptográfico que en este caso no ha sido posible hasta la fecha) volver a la cadena original. Es decir, se puede encriptar pero no desencriptar. Por ello generalmente se utilizan funciones hash para comparación de archivos, para asegurarse de que contenido firmado digitalmente no ha sido modificado  y también para sistemas de identificación de usuarios.

El método es sencillo, la contraseña se almacena encriptada con una de las funciones hash (preferiblemente uno de los que no han sido atacados con éxito, MD5 y SHA1 no son del todo seguros), y cuando nuestro sistema de control e identificación de accesos compruebe el usuario y la contraseña, en vez de compararla con el texto que introduzca el usuario, se compara con la función hash de este. A ver si puedo explicarlo con un ejemplo:

Imaginemos que nuestra contraseña es “hola” (esperando que nunca lo sea…).

    • Calculamos la función hash con SHA-2 que sería: b221d9dbb083a7f33428d7c2a3c3198ae925614d70210e28716ccaa7cd4ddb79
    • Guardamos ese hash en la base de datos
    • Cuando el usuario introduzca su contraseña, comparamos el hash de esa contraseña con el hash que tenemos guardado.

¿Sencillo verdad? Pues bien, ahora solo necesitamos una función que nos calcule el hash SHA-2 de nuestras contraseñas para después poder almacenarlas y compararlas. En nuestro caso vamos a utilizar un algoritmo de encriptación SHA-2 de 256 bits publicado por un usuario en un foro de encriptación y Access. Para hacerlo más sencillo, lo subo al servidor y simplemente tenéis que pegarlo en un módulo de Access:

SHA256

Una vez creado el módulo para encriptar con SHA-2, podemos utilizarlo teniendo en cuenta que se nos crea un array de 32 bytes que tendremos que transformar para poder almacenarlo en nuestra base de datos. Os pongo una función sencillita que pasándole nuestra contraseña, nos devuelve un string con el hash SHA-2 de 256 en hexadecimal:

 Public Function Hash_Contraseña(pass As String)
 Dim pw As String
 On Error GoTo algomalopasa
 '*****************************************************************************
 contraseña = SHA(pass)
 For i = LBound(contraseña) To UBound(contraseña)
 pw = pw + Hex(contraseña(i))
 Next
 '*****************************************************************************
 Hash_Contraseña = pw
 Exit Function
 algomalopasa:
 MsgBox ("Error al encriptar contraseña, consulte con el administrador"), vbCritical, "Error"
 End Function

Después, dentro de nuestro sistema de control e identificación accesos, para crear la contraseña con nuestro algoritmo, simplemente tendríamos que llamar a nuestra función Hash_Contraseña y pasarle el texto plano que ha escrito nuestro usuario. Para compararlas lo haríamos de la misma forma.

Con esto hemos conseguido que nuestro proyecto sea mucho más seguro ya que aunque un atacante malintencionado consiga capturar nuestra contraseña, nunca podrá desencriptarla, impidiendo así su acceso a los datos. Es decir, que nuestra contraseña nunca viajará como texto plano por nuestra red, viajará encriptada por uno de los algoritmos de encriptación más potentes de la actualidad.

The following two tabs change content below.
Arkaitz Arteaga
Llevo más de 10 años programando, sobre todo en Visual Basic y con bases de datos Access. Para mí, VBA y Access siguen siendo herramientas muy potentes. He desarrollado varios proyectos con PHP y MySql. Si sumo las webs que he tenido, probablemente pasaría de 100. Ahora prefiero dedicar todo mi esfuerzo a este blog (aunque sigo manteniendo unas cuantas...). Trabajo en la administración pública (si, soy funcionario), pero he trabajado en pequeñas empresas e incluso en una "grande" de las telecomunicaciones. Ultimamente estoy bastante metido en abrirme nuevos horizontes con C# y .NET. Renovarse o morir!

2 Respuestas a Encriptar contraseñas con SHA-2 de 256 bits

  1. Jav Ala dice:

    Antes de nada felicitarte por esta web y sobre todo, por compartir tus conocimientos, yo solo soy un simple usuario , no obstante, he estado mirando la Public Function Hash_Contraseña que has puesto, la ejecute como tal y obtenia un resultado diferente a lo que deberia de salir para la contraseña “hola”

    Si ejecutamos la funcion tal y como la has escrito obtenemos:
    B221D9DBB083A7F33428D7C2A3C3198AE925614D7021E28716CCAA7CD4DDB790

    Pero si la modificamos de esta manera:

    ‘Public Function Hash_Contraseña(pass As String)

    Dim pw As String
    On Error GoTo algomalopasa

    contraseña = SHA(pass)

    For i = LBound(contraseña) To UBound(contraseña)

    ‘*****************************************************************************
    If Len(Hex(contraseña(i))) = 1 Then
    pw = pw + “0” + Hex(contraseña(i))
    Else
    pw = pw + Hex(contraseña(i))
    End If

    Next

    pw = Left(pw, 64)
    ‘*****************************************************************************

    Hash_Contraseña = pw

    Exit Function

    algomalopasa:
    MsgBox (“Error al encriptar contraseña, consulte con el administrador”), vbCritical, “Error”
    End Function

    si obtenemos lo que se deberia de obtener:

    B221D9DBB083A7F33428D7C2A3C3198AE925614D70210E28716CCAA7CD4DDB79

    Puede parecer la misma cadena, pero no lo es.

    Gracias por compartirlo con nosotros.
    Un Saludo

Deja un comentario