Estoy implementando una API similar a Dropbox, y uno de mis requisitos es tener los archivos almacenados encriptados en el servidor. No es necesario que no los archivos sean ilegibles para el servidor, solo que no estén almacenados en el disco. Estoy usando Python con Flask para la parte de la API y PyCrypto para el cifrado.
No sé absolutamente nada sobre crypto y no quiero hacer nada (demasiado) estúpido. Esto es lo que he implementado, por favor, dígame cómo [un] razonable suena:
- Cuando el usuario PONE un archivo, el contenido se cifra a medida que se lee desde la red usando AES-256 MODE_CTR (quería evitar la restricción de tamaño de bloque de MODE_ECB y MODE_CBC)
- La clave de cifrado es la contraseña del usuario que se ha ingresado: esto evita el uso de una única 'clave de servidor' para cada archivo almacenado, y hace que los archivos no se puedan leer si el usuario cambia la contraseña
- La generación del contador utiliza Crypto.Util.Counter con un parámetro aleatorio
initial_value
que es específico para cada archivo y se almacena en la base de datos (como una sal de contraseña) - Estoy considerando extender la API para permitir al usuario proporcionar su propia clave de cifrado junto con la solicitud PUT. Luego tendría que proporcionar esa misma clave en su GET para recuperar el contenido descifrado.
Por supuesto, la comunicación con la API se realiza a través de HTTPS.