Servicio seguro de transferencia de archivos. Introducción a la… | por Mateo Schenk octubre 2022

Hace unas semanas comencé con una pregunta simple: ¿cómo funciona la carga de archivos en la aplicación del servidor Ktor? Acabo de configurar un proyecto de muestra para un patio de juegos para experimentos. Ese era el plan, pero como antes leí un artículo sobre transferencia segura de archivos, se me ocurrió la idea de combinar ambos temas. Así nació el proyecto “ktor-encryption-server”. El primer y único requisito que traté de resolver fue proporcionar una forma segura de transferir un archivo de un usuario a otro. En el principio no había nada. Ahora, unas semanas más tarde, el proyecto del parque infantil, que ni siquiera tenía pruebas automatizadas porque nunca hubo ninguna intención de hacerlo público, sorprendentemente se ha convertido en un proyecto más serio y estoy escribiendo este artículo para describir lo que he estado haciendo hoy. Como se mencionó anteriormente, el principal caso de uso que el servidor de cifrado de Ktor pretende resolver es transferir archivos de forma segura de un usuario a otro. Hay 2 métodos diferentes para cifrar archivos disponibles, utilizando algoritmos de cifrado simétricos o asimétricos. No es parte de este artículo comparar los dos de una manera científica. Puede encontrar mucha información sobre este tema (por ejemplo, cifrado simétrico frente a asimétrico) buscándolo en Google. Para el proyecto ktor-encryption-server, utilicé el algoritmo AES simétrico (consulte https://www.nist.gov/publications/advanced-encryption-standard-aes para obtener más información) con una longitud de clave de 256 bytes. El estándar de cifrado avanzado (AES) es un subconjunto específico de un cifrado de bloque llamado Rijndael. AES incluye solo tres variantes de Rijndael: AES-128, AES-192 y AES-256. La diferencia entre estas variantes es el tamaño de la clave y la cantidad de rondas utilizadas, pero, y esto a menudo se pasa por alto, no el tamaño del bloque. Hoy en día, este algoritmo se considera seguro incluso si se utilizan supercomputadoras para descifrarlo. Hay varios modos disponibles para el algoritmo AES:
- Modo ECB: Modo libro de códigos electrónico.
- Modo CBC: modo de encadenamiento de bloques de cifrado.
- Modo CFB: modo de realimentación de cifrado.
- Modo OFB: modo de retroalimentación de salida.
- Modo CTR: modo contador.
Elegí GCM, que es un modo de contador y tiene un alto rendimiento. Todo esto se relaciona con la teoría del mecanismo de cifrado, que explicaré en este artículo. El cifrado AES se utiliza para 2 casos de uso de la aplicación:
- Contraseña de usuario (para guardar en la base de datos)
- Cargar el contenido del archivo (para guardar el archivo localmente)
En la siguiente parte, daré una descripción general de la funcionalidad que proporciona el servidor de cifrado Ktor hasta la fecha (el desarrollo aún está en marcha, pero la funcionalidad básica está disponible). Para poder subir archivos, se requiere un registro de usuario, que se especifica mediante un nombre de usuario (que debe ser único en todo el servidor) y una contraseña, que debe cumplir con ciertos requisitos. No hay conexión de un usuario a una dirección de correo electrónico. Los requisitos de contraseña son fijos actualmente, lo que significa que cada contraseña debe cumplir con lo siguiente:
- Tiene una longitud de al menos 16 caracteres/dígitos
- Contiene al menos un dígito
- Contiene al menos una letra mayúscula
- Contiene al menos una letra minúscula
- Contiene al menos un carácter especial.
Uso la funcionalidad de org.passay para esto. Las definiciones de punto final específicas se pueden encontrar como una colección de Postman en el repositorio. También hay planes para proporcionar una especificación OpenAPI en el futuro. Los siguientes casos de uso requieren la autenticación básica de un usuario existente.
Contenidos
cambiar la contraseña
El usuario puede cambiar la contraseña inicial. Se aplican los mismos requisitos a la nueva contraseña que cuando se creó por primera vez.
Cambiar ajustes
El usuario puede cambiar la configuración relacionada con el usuario, por el momento, esto es solo la cantidad de días hasta que un archivo cargado caduque y se elimine del servidor.
Subir datos)
El usuario puede subir uno o más archivos al servidor. Para cada archivo se devuelve un nombre de archivo cifrado y una contraseña generada aleatoriamente (con los mismos requisitos que para la contraseña de usuario). Esta información es necesaria para descargar el archivo.
Obtener archivos cargados
El usuario puede obtener una descripción general de todos los archivos actualmente activos que carga. Los archivos caducados (y eliminados) no forman parte de esta información.
Cargar historial de archivos
El usuario puede obtener una descripción general de las operaciones realizadas en todos y cada uno de los archivos cargados. Actualmente, la carga y cada descarga son historia. El historial se eliminará una vez que caduque el archivo cargado.
Eliminar archivos subidos
El usuario puede eliminar un archivo cargado. Solo es posible eliminar un solo archivo a la vez.
borrar usuario
El usuario puede eliminar la cuenta, lo que también eliminará todos los archivos subidos activos con el historial correspondiente.
descargar archivo
Hay una operación que no está vinculada a un usuario, descargar un archivo cargado al proporcionar el nombre de archivo y la contraseña encriptados. No es posible descargar varios archivos al mismo tiempo. Hay varias configuraciones disponibles que tienen valores predeterminados establecidos en el archivo application.conf, pero se pueden personalizar anulándolas.
Fuente de datos
De forma predeterminada, ktor-encryption-server utiliza una base de datos de archivos h2. Esta no es una solución para uso productivo, pero suficiente para la actual demo.database { driverClass = «org.h2.Driver» url = «jdbc:h2:file:./db» user = «root» password = «password» maxPoolSize = 10 }
parámetros de cifrado
Los parámetros del proceso de cifrado también se pueden personalizar cambiando los valores predeterminados que vienen con la aplicación.Tenga en cuenta que los parámetros no se validan al iniciar el servidor. Es decir, si no son válidos, se producirán resultados inesperados durante el cifrado.
cargar ubicación
De forma predeterminada, las cargas se almacenan en un directorio de cargas relacionado con el directorio de trabajo de la aplicación. Esto se puede cambiar a cualquier ruta siempre que la aplicación tenga acceso de escritura.uploadSettings{directoryPath=»./uploads»}El servidor ejecuta tareas que se activan en períodos de tiempo establecidos. Hasta el momento no es posible ajustar el período de ejecución de la tarea.
tarea de limpieza
La tarea de limpieza busca diariamente en el directorio de carga configurado archivos que no tienen una entrada asociada en la base de datos. Estos archivos llamados «huérfanos» no se pueden descifrar porque la información de cifrado ya no está disponible, incluso la contraseña todavía está allí. Por lo tanto, los archivos se eliminan. Normalmente, esto no debería suceder, ya que al eliminar la entrada del archivo de carga en la base de datos también se elimina el archivo asociado en el directorio de carga. Pero accidentalmente o por error es posible (por ejemplo, archivo bloqueado para acceso). La limpieza es para esos casos.
tarea de proceso
El usuario tiene un período de vencimiento para cargar archivos especificado en la configuración. La tarea de caducidad comprueba periódicamente si este período ha caducado y si es necesario eliminar el archivo cargado. El proceso de eliminación realiza los siguientes pasos:
- Elimina el archivo cargado de la base de datos.
- Elimine el historial en la base de datos relacionado con este archivo de carga.
- Elimine el archivo en el directorio de carga.