UNIVERSIDAD DE TENANCINGO UdeT MATERIA: Criptografía DOCENTE: Carlos Alejandro Guadarrama Romero ALUMNO: Diego Flores González CUARTO SEMESTRE Introducción La seguridad en línea es un tema de creciente importancia en la era digital actual. A medida que más servicios y aplicaciones migran a la web, la protección de los datos personales y sensibles se ha convertido en una prioridad esencial para desarrolladores y usuarios por igual. Una de las principales preocupaciones es la seguridad de las contraseñas, que son la primera línea de defensa con el acceso no autorizado a cuentas y sistemas. En este contexto, la encriptación de contraseñas juega un papel crucial. La encriptación es el proceso de transformar datos legibles en un formato codificado que solo puede ser descifrado por aquellos que posen la clave adecuada. Entre los diversos métodos de encriptación disponibles, el algoritmo SHA-512 se destaca por su robustez y seguridad. SHA-512, que forma parte de la familia de algoritmos de hash seguro (SHA, por sus siglas en inglés), genera un valor hash de 512 bits a partir de una entrada de datos, ofreciendo una alta resistencia a los ataques de fuerza bruta y colisiones El proyecto que se presenta a continuación aborda la implementación de la encriptación de contraseñas utilizando el método SHA-512 en una página web. El objetivo principal es garantizar que las contraseñas de los usuarios se almacenan de manera segura, minimizando el riesgo de comprometer información sensible. Además, se exploran diversas estrategias de seguridad web para proteger la integridad y confidencialidad de los datos en tránsito y en reposo. A lo largo de este proyecto, se detallará el proceso de integración de SHA-512 en el sistema de autenticación de la página, destacando las mejores practicas y consideraciones técnicas necesarias para asegurar una implementación efectiva. Se analizarán también otras medidas complementarias de seguridad, tales como el uso de certificados SS/TLS para el cifrado de la comunicación, la implementación de políticas de gestión de contraseñas robustas, y la protección contra ataques comunes con el Cross-Site Scripting (XSS) y la inyección SQL Planteamiento del problema En el entorno digital actual, la seguridad de la información se ha convertido en un desafío crítico para las organizaciones y los individuos. Con la creciente dependencia de las aplicaciones web para realizar transacciones financieras, manejar datos personales, y acceder a servicios esenciales, la protección de la información sensible ha adquirido una importancia sin precedentes. Entre los aspectos más críticos de la seguridad web se encuentra la protección de contraseñas, que son la primera línea de defensa contra accesos no autorizados y brechas de seguridad. A pesar de los avances en tecnología, las contraseñas siguen siendo una de las vulnerabilidades más explotadas por los atacantes cibernéticos. Las técnicas comunes de ataque, como el phishing, la fuerza bruta, y los ataques de diccionario, ponen en riesgo la integridad y confidencialidad de los sistemas. Además, la reutilización de contraseñas y la creación de contraseñas débiles por parte de los usuarios aumentan significativamente las posibilidades de una brecha de seguridad. El problema principal que este proyecto busca abordar es la vulnerabilidad de las contraseñas almacenadas y manejadas en una página web. Muchas aplicaciones web no implementan medidas de seguridad adecuadas para encriptar y proteger las contraseñas, lo que puede llevar a la exposición de información sensible en caso de una violación de seguridad. La falta de encriptación robusta y prácticas de gestión de contraseñas deficientes son factores clave que contribuyen a este problema. El objetivo de este proyecto es desarrollar e implementar un sistema de encriptación de contraseñas utilizando el algoritmo SHA-512, un método de hash seguro que ofrece una alta resistencia a los ataques. SHA-512 transforma las contraseñas en valores hash de 512 bits, haciendo que sea extremadamente difícil para los atacantes revertir el proceso y obtener las contraseñas originales. Este enfoque, combinado con otras medidas de seguridad, busca reducir significativamente el riesgo de accesos no autorizados y proteger la información de los usuarios. Además de la encriptación de contraseñas, este proyecto también explorará la implementación de otras prácticas de seguridad esenciales, como el uso de certificados SSL/TLS para proteger la comunicación entre el cliente y el servidor, y la implementación de políticas de gestión de contraseñas que promuevan la creación y almacenamiento de contraseñas seguras. Se evaluarán y aplicarán medidas para proteger contra ataques comunes como Cross-Site Scripting (XSS) y la inyección SQL, asegurando un enfoque integral hacia la seguridad web. En resumen, el planteamiento del problema se centra en la necesidad urgente de mejorar la seguridad de las contraseñas en las páginas web mediante la implementación de encriptación robusta y prácticas de gestión de contraseñas eficaces. Este proyecto tiene como objetivo proporcionar una solución técnica que no solo proteja las contraseñas de los usuarios, sino que también establezca un marco de seguridad más amplio para proteger contra diversas amenazas cibernéticas, contribuyendo así a un entorno digital más seguro y confiable. Objetivos Objetivo General Implementar un sistema de encriptación robusto utilizando el algoritmo SHA-512 para proteger las contraseñas de los usuarios en una página web, asegurando la confidencialidad y la integridad de los datos personales. Objetivos Específicos Desarrollar un Módulo de Encriptación: Implementar el algoritmo SHA-512 para encriptar las contraseñas de los usuarios antes de almacenarlas en la base de datos. Asegurar que las contraseñas encriptadas no puedan ser revertidas a su forma original mediante técnicas de ataque comunes. Implementar Certificados SSL/TLS: Configurar certificados SSL/TLS para asegurar la comunicación entre el cliente y el servidor. Garantizar que los datos transmitidos estén cifrados y protegidos contra interceptaciones. Establecer Políticas de Gestión de Contraseñas: Crear y aplicar políticas que fomenten la creación de contraseñas seguras y únicas por parte de los usuarios. Implementar técnicas adicionales como 'salting' y 'peppering' para fortalecer la seguridad de las contraseñas almacenadas. Proteger contra Ataques Comunes: Implementar medidas de seguridad para proteger la página web contra ataques de Cross-Site Scripting (XSS) y inyección SQL. Realizar pruebas de penetración y auditorías de seguridad para identificar y mitigar posibles vulnerabilidades. Desarrollar Documentación y Capacitación: Crear documentación técnica detallada sobre la implementación del sistema de encriptación y otras medidas de seguridad. Proveer guías de usuario y capacitación para administradores y desarrolladores sobre las mejores prácticas en seguridad web. Desarrollo En nuestra página utilizamos la minería de datos, especialmente en el caso de las bases de datos. Usamos una base de datos en XAMPP, la cual está conectada a nuestra página web. En la primera página, tenemos una conexión establecida con esta base de datos que nos permite registrar a todos nuestros nuevos usuarios que desean ingresar a nuestro sitio. También usamos PHP para conectar correctamente la base de datos con la página. Además, contamos con una sección de inicio de sesión. Este es un apartado donde podrás ver, como se ve la base de datos en formato de tablas Esta imagen muestra un script PHP embebido en una página HTML que maneja la autenticación de usuarios para una aplicación web. A continuación se presenta una descripción de cada parte del script: 1. Configuración de la conexión a la base de datos: • Se definen las variables $servername, $database, $username, y $password con los datos necesarios para conectarse a la base de datos acceso en un servidor local (localhost). 2. Recepción de datos del formulario: • Se reciben las variables $usuario y $pas a través del método POST, que contienen el nombre de usuario y la contraseña ingresados por el usuario en el formulario de inicio de sesión. 3. Hashing de la contraseña: • La contraseña se convierte en un hash utilizando el algoritmo sha512 para asegurar la integridad y seguridad de las contraseñas almacenadas. 4. Establecimiento de la conexión con la base de datos: • Se usa la función mysqli_connect para conectar al servidor de base de datos con las credenciales especificadas. Si la conexión falla, se muestra un mensaje de error y se detiene la ejecución del script. 5. Consulta y verificación del usuario: • Se realiza una consulta SQL para buscar en la tabla usuario un registro que coincida con el nombre de usuario y la contraseña hash proporcionados. • Si se encuentra una coincidencia (mysqli_num_rows($resultado) > 0), se redirige al usuario a la página index.html. • Si no se encuentra coincidencia, se muestra un mensaje de error indicando que el nombre de usuario o la contraseña son incorrectos. 6. Liberación de recursos y cierre de la conexión: • Se libera el resultado de la consulta y se cierra la conexión a la base de datos. En este apartado, también implementamos la encriptación de las contraseñas para garantizar la seguridad de nuestros usuarios. De esta manera, las contraseñas no estarán vulnerables y permanecerán seguras. Incluso si alguien lograra acceder a la base de datos y visualizar las contraseñas, estas aparecerán encriptadas y no podrán ser leídas. Código LOGIN Este código implementa un formulario de autenticación en una página web, donde se verifican las credenciales del usuario (nombre de usuario y contraseña) contra una base de datos. A continuación, se presenta una documentación detallada de cada sección del código. Estructura del Documento HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initialscale=1.0"> <title>Document</title> </head> <body> <!DOCTYPE html>: Define el documento como un archivo HTML5. <html lang="en">: Comienza el documento HTML, especificando que el idioma del contenido es inglés. <head>: Contiene metadatos sobre el documento. o <meta charset="UTF-8">: Especifica que la codificación de caracteres es UTF-8. o <meta name="viewport" content="width=device-width, initial- scale=1.0">: Ajusta el ancho del viewport para que coincida con el ancho del dispositivo. o <title>Document</title>: Establece el título del documento en el navegador. <body>: Comienza el cuerpo del documento, que contendrá el contenido visible de la página. Código PHP para Autenticación de Usuario <?php $servername="localhost"; $database="acceso"; $username="root"; $password=""; $usuario=$_POST["usernamei"]; $pas=$_POST["passwordi"]; $pas = hash('sha512', $pas); $conexion=mysqli_connect($servername, $username, $password, $database); if(!$conexion) { echo "Error en la conexión: " . mysqli_connect_error(); die(); } else { $consulta = "SELECT * FROM usuario WHERE usuario='$usuario' AND contraseña='$pas'"; $resultado = mysqli_query($conexion, $consulta); if (mysqli_num_rows($resultado) > 0){ header("Location: index.html"); exit; // Detiene la ejecución del script después de la redirección } else { header("Location: index.html"); exit; } mysqli_free_result($resultado); mysqli_close($conexion); } ?> <?php: Inicia un bloque de código PHP. Variables de Conexión: $servername = "localhost";: Define el nombre del servidor de la base de datos. $database = "acceso";: Define el nombre de la base de datos. $username = "root";: Define el nombre de usuario para la conexión a la base de datos. $password = "";: Define la contraseña para la conexión a la base de datos. Captura de Datos del Formulario: $usuario = $_POST["usernamei"];: Captura el nombre de usuario ingresado en el formulario. $pas = $_POST["passwordi"];: Captura la contraseña ingresada en el formulario. $pas = hash('sha512', $pas);: Encripta la contraseña usando el algoritmo SHA-512. Conexión a la Base de Datos: $conexion = mysqli_connect($servername, $username, $password, $database);: Intenta establecer una conexión con la base de datos. if (!$conexion) { ... }: Verifica si la conexión fue exitosa. Si no, muestra un mensaje de error y detiene la ejecución. Consulta a la Base de Datos: $consulta = "SELECT * FROM usuario WHERE usuario='$usuario' AND contraseña='$pas'";: Prepara una consulta SQL para verificar si las credenciales existen en la base de datos. $resultado = mysqli_query($conexion, $consulta);: Ejecuta la consulta SQL. Verificación de Resultados: if (mysqli_num_rows($resultado) > 0) { ... } else { ... }: Verifica si la consulta devolvió algún resultado. o Si las credenciales son correctas, redirige a index.html. o Si las credenciales son incorrectas, también redirige a index.html. Liberación de Recursos y Cierre de Conexión: mysqli_free_result($resultado);: Libera la memoria asociada con el resultado. mysqli_close($conexion);: Cierra la conexión a la base de datos. </body> </html> Cierra el cuerpo del documento HTML y la estructura HTML. REGISTRO Este código implementa un formulario de registro de usuario en una página web, donde se capturan datos como nombre de usuario, correo electrónico y contraseña. A continuación, se proporciona una documentación detallada de cada sección del código. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initialscale=1.0"> <title>Document</title> </head> <body> <!DOCTYPE html>: Define el documento como un archivo HTML5. <html lang="en">: Comienza el documento HTML, especificando que el idioma del contenido es inglés. <head>: Contiene metadatos sobre el documento. <meta charset="UTF-8">: Especifica que la codificación de caracteres es UTF-8. <meta name="viewport" content="width=device-width, initial-scale=1.0">: Ajusta el ancho del viewport para que coincida con el ancho del dispositivo. <title>Document</title>: Establece el título del documento en el navegador. <body>: Comienza el cuerpo del documento, que contendrá el contenido visible de la página. Código PHP para Registro de Usuario <?php $servername = "localhost"; $database = "acceso"; $username = "root"; $password = ""; $usuario = $_POST["usuariou"]; $email = $_POST["emailu"]; $contra = $_POST["passwordu"]; $contra = hash('sha512', $contra); // Corregido: se debe hashear la variable $contra $conexion = mysqli_connect($servername, $username, $password, $database); if (!$conexion) { echo "Error en la conexión: "; die("Conexión fallida" . mysqli_connect_errno()); } else { $insertar = "INSERT INTO usuario (usuario, email, contraseña) VALUES ('$usuario', '$email', '$contra')"; $query = mysqli_query($conexion, $insertar); if ($query) { header("Location: index.html"); } else { echo "Error al registrar el usuario: " . mysqli_error($conexion); } mysqli_close($conexion); } ?> <?php: Inicia un bloque de código PHP. Variables de Conexión: $servername = "localhost";: Define el nombre del servidor de la base de datos. $database = "acceso";: Define el nombre de la base de datos. $username = "root";: Define el nombre de usuario para la conexión a la base de datos. $password = "";: Define la contraseña para la conexión a la base de datos. Captura de Datos del Formulario: $usuario = $_POST["usuariou"];: Captura el nombre de usuario ingresado en el formulario. $email = $_POST["emailu"];: Captura el correo electrónico ingresado en el formulario. $contra = $_POST["passwordu"];: Captura la contraseña ingresada en el formulario. $contra = hash('sha512', $contra);: Encripta la contraseña usando el algoritmo SHA512 antes de almacenarla en la base de datos. Conexión a la Base de Datos: $conexion = mysqli_connect($servername, $username, $password, $database);: Intenta establecer una conexión con la base de datos. if (!$conexion) { ... }: Verifica si la conexión fue exitosa. Si no, muestra un mensaje de error y detiene la ejecución. Inserción de Datos en la Base de Datos: $insertar = "INSERT INTO usuario (usuario, email, contraseña) VALUES ('$usuario', '$email', '$contra')";: Prepara una consulta SQL para insertar los datos del usuario en la tabla usuario. $query = mysqli_query($conexion, $insertar);: Ejecuta la consulta SQL. Verificación de la Operación: if ($query) { ... } else { ... }: Verifica si la consulta de inserción fue exitosa. Si es exitosa, redirige al usuario a index.html. Si falla, muestra un mensaje de error indicando la razón del fallo. Cierre de Conexión: mysqli_close($conexion);: Cierra la conexión a la base de datos después de completar la operación. Cierra el cuerpo del documento HTML y la estructura HTML. Notas Adicionales Seguridad: Al igual que en el primer código, este también tiene una vulnerabilidad de inyección SQL debido a la interpolación directa de variables en la consulta SQL. Se recomienda usar consultas preparadas para prevenir este tipo de ataques. Manejo de Errores: Es útil proporcionar retroalimentación específica al usuario sobre el estado del registro (por ejemplo, usuario ya existente) en lugar de redirigir simplemente a la misma página. Validación del Lado del Cliente: Considerar la validación de las entradas del formulario en el lado del cliente antes de enviarlas al servidor. Planificación Cronograma Mes 1: Investigación y recolección de datos. Mes 2: Diseño de la solución y selección de algoritmos. Mes 3-4: Implementación técnica de SHA-512, SSL/TLS, y defensas contra ataques. Mes 5: Pruebas de penetración y auditorías de seguridad. Mes 6: Documentación, capacitación, y lanzamiento del sistema mejorado. Recursos Necesarios Herramientas de Desarrollo: Lenguajes de programación, entornos de desarrollo integrados (IDEs), y bibliotecas para encriptación. Infraestructura de Red: Servidores web seguros con soporte para SSL/TLS. Equipo de Seguridad: Profesionales en seguridad informática y auditores de seguridad. Materiales de Capacitación: Guías, tutoriales, y recursos educativos sobre seguridad web y encriptación. Conclusiones La protección de las contraseñas y la información sensible en las páginas web es una necesidad imperiosa en el contexto actual de ciberseguridad. Este proyecto tiene como objetivo abordar esta necesidad mediante la implementación de un sistema de encriptación de contraseñas utilizando el algoritmo SHA-512, reconocido por su robustez y alta resistencia a ataques. A través de una metodología estructurada en fases, se garantizará una implementación efectiva que incluye desde la investigación inicial y el diseño de la solución hasta la implementación técnica, pruebas, y documentación. La planificación detallada asegura que se consideren todos los aspectos necesarios para el éxito del proyecto, incluyendo los recursos técnicos y humanos, así como un cronograma realista. Al finalizar este proyecto, se espera no solo haber implementado un sistema seguro para la encriptación de contraseñas, sino también haber establecido un marco de seguridad integral que proteja contra una variedad de amenazas cibernéticas. Esto no solo incrementará la confianza de los usuarios en la plataforma, sino que también contribuirá a un entorno digital más seguro y confiable. La implementación de estas medidas de seguridad es crucial para proteger los datos personales y sensibles de los usuarios, minimizar los riesgos de accesos no autorizados y brechas de seguridad, y cumplir con las normativas y estándares de seguridad vigentes. Este proyecto, por lo tanto, representa un paso significativo hacia la mejora de la seguridad en las aplicaciones web y la protección de la información en el mundo digital.