Cifrado y descifrado de datos en asp.net
¿Qué es el cifrado de datos?
El cifrado y descifrado de datos es la base principal de la seguridad de los datos que almacenamos en nuestra base de datos es recomendable cifrar aquellos datos sensibles. Esto consiste en transformar un texto plano y legible en otro texto codificado. Dentro del cifrado vamos a distinguir 2 tipos
Cifrado reversible: Permite pasar del texto codificado al original. Lo utilizaremos para cifrar los datos sensibles.
Cifrado no reversible o hash: También llamado hash, este cifrado codifica los datos de manera que no es posible volver al texto original. Lo utilizaremos para cifrar las contraseñas, ya que si partimos del mismo texto y aplicamos el mismo cifrado obtendremos la misma secuencia de caracteres.
Desarrollo del proyecto
Estructura en la base de datos
Para almacenar los datos utilizaremos una tabla en base de datos en SQL Server con los siguientes campos:
En esta tabla los datos sensibles serán el correo y la contraseña.
Correo: Lo cifraremos de manera reversible para poder recuperar su valor posteriormente
Contraseña: Puesto que sólo necesitaremos saber si la contraseña es igual a la que nos introduzca el usuario la cifraremos de manera no reversible.
Proyecto MVC
NuGets necesarios
Para mapear la base de datos y poder realizar consultas LinQ necesitaremos Microsoft.EntityFrameworkCore.
Para conectarnos a la base de datos necesitaremos Microsoft.EntityFramework.SqlServer.
Models
Puesto que vamos a utilizar un solo tipo de objetos, crearemos el model correspondiente y lo mapeamos con la tabla de la base de datos.
Context
El contexto de la aplicación consistirá en un DbSet que contiene la lista de los usuarios mapeados de la base de datos.
HelperCryptography
Para ofrecer un código más claro las funcionalidades del cifrado las añadiremos a un helper localizado en la carpeta Helpers. Tendrá las siguientes funciones:
GenerateSalt: Función que devuelve una secuencia de 27 letras en mayúsculas que junto con la clave secreta sumarán los 32 caracteres necesarios para cifrar el texto.
CompareArrays: Función que recibe 2 vectores y devuelve true si son exactamente iguales y false si son diferentes.
EncriptarPassword: Función que recibe 2 cadenas de caracteres, la contraseña y el salt y retorna un array de byes cifrados correspondiente al hash.
EncryptString: Función que recibe un texto a cifrar de manera reversible, un salt que añadir a la clave de cifrado y la clave «2post» con la cual la cifraremos y retorna el texto cifrado.
DecryptString: Función contraria a la anterior. Recibe un texto cifrado y el salt con el que se cifró para posteriormente añadir la clave secreta y así devolver el texto sin cifrar.
Repositories
Para gestionar todos los usuarios de la base de datos utilizaremos un repositorio al cual le añadiremos las funcionalidades correspondientes.
GetUsers: Devuelve todos los datos de los usuarios de la base de datos y descifra el correo para retornarlo de una manera legible.
RegisterUser: Metodo que recibe los datos del usuario a registrar en la base de datos y los cifra de manera correspondiente
Controllers
Sólo vamos a implementar un controlador, se encargará de mostrar el listado de los usuarios con la información legible y ofrecer el formulario para la creación de un usuario.
Vistas
Las vistas son básicas, un listado de User utilizando scaffolding y un formulario con campos de texto para mandar los datos a almacenar a la base de datos.
Resultado
Datos almacenados en la base de datos.
Los datos sensibles almacenados en los campos de la base de datos se encuentran cifrados. El email y la contraseña son ilegibles.
Datos mostrados en la aplicación
En la aplicación la contraseña tampoco es legible por el correo está en texto plano.
Autor/a: Sergio de San Clemente Muñoz
Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma
Centro: Tajamar
Año académico: 2021-2022
Código: GitHub