Encriptar contraseñas con SHA-2 de 256 bits
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:
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.
Arkaitz Arteaga
Latest posts by Arkaitz Arteaga (see all)
- Access: Encriptar contraseñas con SHA-256 utilizando biblioteca de clases .NET con C# - 4 mayo, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Cuarta parte. - 27 abril, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Aclaración. - 21 abril, 2014
- Utilizar biblioteca de clases .NET en Access. Tercera aproximación a la Interoperabilidad COM - 14 abril, 2014
- Vincular tablas en Access con Visual Basic - 11 abril, 2014
2 Respuestas a Encriptar contraseñas con SHA-2 de 256 bits
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.
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
Tienes razón, baila un 0. Pero bueno, el hash al final es correcto en ambos, es decir, conseguimos lo mismo aunque no sea el algoritmo exacto.
Un saludo y gracias.