He intentado captar suficiente cifrado / hashing para poder implementar un almacenamiento seguro para archivos, del lado del servidor. Una vez que haya bajado a un nivel razonable, lo revisaré con un experto. No tiene sentido llamar al experto antes de que lo entienda a un nivel razonable.
Por favor, alguien podría decirme si lo estoy haciendo bien y también si hay partes redundantes que no necesito.
Aquí está mi configuración actual:
OpenSSL
-
AES-128 para cifrado porque es más rápido y, supuestamente, tan seguro como -256
-
Modo CTR porque no necesito autenticación (como en CGM). Y porque (creo) no necesita relleno, lo que podría abrir algunas vulnerabilidades (como CBC)
-
Todos los archivos almacenados tienen un registro de base de datos donde almaceno el IV.
-
También almaceno el recuento de iteraciones para la IV, por lo que puedo volver y recalcular con más iteraciones si es necesario.
-
IV es de 16 bytes para coincidir con el tamaño de bloque de 128 bits
-
La contraseña de cifrado está codificada y almacenada en el software del servidor. La misma contraseña para todos los archivos.
- ¿Por cuánto tiempo debe ser esta contraseña aleatoria?
-
IV se calcula con pbkdf2. @ 100,000 iteraciones, sha256, sal aleatoria de 32 bits.
- también se necesita una contraseña para los cálculos IV. ¿Puedo usar la misma contraseña que para el cifrado?
Pero me pregunto si pbkdf es realmente necesario en mi caso de uso. El cifrado / descifrado de archivos se realiza en el servidor de una manera basada en la cola, es decir, no hay interacción del usuario involucrada. Así que la necesidad de ralentizar el proceso de hash no parece aplicarse aquí. ¿O he entendido mal algo? Solo necesito un IV aleatorio y único, pero no necesito que tome tiempo ...
editar - >
Una solución más simple sería no usar un IV (es decir, IV = 0) y en su lugar utilizar pbkdf para crear una contraseña de cifrado única para cada archivo. El único inconveniente que puedo ver con esto es que mis archivos estarían a la vista si alguien llegara a la base de datos.
Con la solución descrita anteriormente, un atacante necesitaría el puesto IV de la base de datos y la contraseña del servidor (y, por supuesto, el archivo para descifrar).
¿Se consideraría estúpido omitir el IV y solo usar contraseñas aleatorias únicas?
< ---
edita de nuevo --- > >
Después de contemplar un poco la respuesta y los comentarios de Polinomios, me doy cuenta de que tengo que retirarme.
El mayor problema con lo anterior es que se vuelve inseguro en el momento en que guardo la contraseña en algún lugar. Sólo algunos de los archivos son realmente sensibles. Cuando los archivos sensibles necesiten cifrado, le pediré al usuario una contraseña a través de una aplicación para bloquear y desbloquear los archivos. La contraseña solo se almacenará en la memoria y dejaré que el usuario recuerde la contraseña.
Tendré algún problema cuando más de un servidor pueda servir la aplicación. Podría resolverlo al no equilibrar la carga de la ruta para la api de la contraseña, por lo que esta pequeña tarea solo es manejada por un servidor. De lo contrario, tendría que comunicar la contraseña entre los servidores para que todos la tengan en la memoria.
Phew ... Esto de seguridad realmente requiere pensar en una base de datos / servidor / tipo de aplicación regular. Será mejor que vuelva a la codificación productiva por un tiempo y vuelva a revisar esto más tarde ...
< < ---
Gracias de antemano, // Michael