Como bien sabéis no es una buena costumbre guardar las contraseñas de los usuarios en una base de datos en texto plano, para evitar esto he programado una posible solución. La solución que os pongo a continuación es fácil de implementar en vuestras aplicaciones y se puede complicar todo lo que se quiera, bastará con poner una iteración, y en vez de guardar un carácter por uno, se guardarán tres por cada uno introducido, de esta forma incrementamos la seguridad de nuestras contraseñas. Como podréis comprobar es una forma casera de no tener las contraseñas en texto plano utilizando dos funciones.
Os dejo unas pantallas y un vídeo para que veáis como cifrar un password, guardarlo en una base de datos y recuperarlo descifrando la contraseña guardada en la tabla usuarios.
He visto que hay muchos usuarios interesados por este tema y en la implementación anterior cifraba los datos pero no los guardaba en una base de datos por lo que no nos sirve para una tabla usuarios.
Aquí tenéis unos pantallazos de las funciones y de como queda en la aplicación funcionando.
Carga array con los datos del cifrado.
El primer bucle carga el array de entrada con los códigos ascii del 31 al 126, creo que es suficiente con estos de la exclamación ! a la ~.
En el segundo bucle cargo los mismos datos pero al revés, del 126 al 31, para que no coincidan a la hora de cifrar.
Cifrando la contraseña introducida por el usuario.
Por cada carácter introducido en la contraseña busco su coincidencia en el array de cifrado y lo añado a una variable, cuando finaliza el bucle devuelvo la variable que he cargado con los caracteres del array de cifrado. ¡¡ Ya tengo la contraseña cifrada !!. Ahora la puedo guardar en la base de datos o lo que me apetezca.
Descifrando las contraseñas guardadas en la base de datos.
A esta función le pasamos la contraseña cifrada leida de la base de datos y realizamos el proceso inverso al anterior, por cada carácter de la contraseña cifrada buscamos en el array de entrada y lo añadimos a la variable, una vez finalizado el bucle devolvemos el valor de la variable con el contenido descifrado.
Grabando un nuevo usuario.
Ejecutamos la aplicación y añadimos un nuevo usuario, como se puede ver en la imagen la contraseña que he puesto es una contraseña con un nivel de seguridad alto. Una vez pulsamos en aceptar comprueba que no existe el usuario y nos dice que lo da de alta. La contraseña para esta prueba es “jS(98|A:CC&”
Comprobando el usuario en la base de datos.
El usuario nuevo lo grabamos en la tabla “Usuario” de la base de datos “Datos” en sqlite. Como se observa en la imagen la contraseña guardada en la base de datos no coincide con la introducida por el usuario “5Lwfg#^e\\y”, se observa que la contraseña ha sido cifrada correctamente. Ahora solo falta recuperar esta contraseña y que funcione correctamente.
Recuperando la contraseña guardada en la base de datos.
Introducimos el nombre del usuario grabado en el proceso anterior y se observa que la contraseña recuperada es correcta, la función devuelve correctamente la contraseña descifrada.
El código
Private Function CifrarPassword() As String
Dim i, x, z As Integer
Dim Cifrada As String
x = 1
For i = 1 To Len(txtPassword.Text)
For x = 1 To 94
If Mid(txtPassword.Text, i, 1) = ArrEntrada[x] Then
Cifrada = Cifrada & ArrSalida[x]
Endif
Next
Next
Return Cifrada
End
Private Function DescifrarPassword(entrada As String) As String
Dim i, x As Integer
Dim Cifrada As String
x = 1
For i = 1 To Len(entrada)
For x = 1 To 94
If Mid(entrada, i, 1) = ArrSalida[x] Then
Cifrada = Cifrada & ArrEntrada[x]
Endif
Next
Next
Return Cifrada
End
Si tenéis alguna duda o queréis mejorar la rutina por favor comentadlo y haced participes al resto de lectores.
Muchas gracias.