Cifrado de archivos para una API de almacenamiento

1

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.

    
pregunta ThemCrookedVultures 17.03.2014 - 15:26
fuente

2 respuestas

2

Muy irrazonable.

La primera pregunta que creo que debes hacer es si el cifrado de archivos es necesario. Según su pregunta, suena como si la respuesta fuera afirmativa. Para mí eso significa que usted A) debería implementar el cifrado de archivos y B) hacerlo bien. Lo que describe es A pero no B, que es posiblemente peor que nada en absoluto porque puede dar a sus usuarios una falsa sensación de seguridad.

Estas son mis preocupaciones (como ingeniero y usuario potencial de su producto):

"No sé absolutamente nada sobre crypto": Crypto es fácil de equivocarse y difícil de entender, ¿por qué querría que lo implementara alguien que, por sí mismo, no sabe nada sobre crypto? Piense en los productos en los que confía como cliente, si su seguridad fuera implementada por alguien que no sabía nada sobre seguridad, ¿eso le daría confianza?

"La clave de cifrado es la contraseña de hash del usuario": generar una clave simétrica única y aleatoria por archivo es fácil. Cada vez que necesite almacenar un archivo, cree una nueva clave y cifre esa clave con algo que solo el propietario del archivo sepa (la contraseña puede no ser una mala elección). ¿Por qué querría que todos los archivos se vuelvan irrecuperables cuando cambien su contraseña?

"permite al usuario proporcionar su propia clave de cifrado": esta es realmente una excelente idea y algo que Amazon S3 acaba de presentar. Permitir a los usuarios proporcionar archivos cifrados o de texto sin formato junto con una clave de cifrado. Sus servidores asumen el trabajo de cifrado pero el usuario obtiene el control. Solo asegúrate de purgar la clave de cifrado después de usarla, no la dejes en la memoria ni en los archivos de registro.

    
respondido por el u2702 15.07.2014 - 21:41
fuente
0

Un par de punteros

  • Cuando use el cifrado simétrico puramente, tendrá problemas con conceptos como el cifrado de clave múltiple, el depósito en garantía, etc. Puede considerar usar PGP en su lugar.

  • Idealmente, cada sesión / archivo tendría su propia clave simétrica aleatoria, cuando usas la contraseña de usuario con hash, te estás perdiendo esto. PGP arreglaría esto para ti. Cuando decida usar una contraseña de usuario, asegúrese de usar un algoritmo de hashing fuerte como PBKDF2 con un MAC para generar la clave de cifrado de la contraseña suministrada.

  • Asegúrese de usar un PRNG seguro para inicializar el cifrado. Por lo que sé, el modo CTR se considera correcto (aunque no soy criptógrafo)

  • Compartir el secreto es mucho menos seguro que usar claves asimétricas, en cuyo caso el usuario puede compartir libremente su clave de encriptación (pública), mientras mantiene la clave secreta en realidad secreta. Nuevamente, esto se hace fácilmente con PGP.

respondido por el Tim Lamballais 17.03.2014 - 15:51
fuente

Lea otras preguntas en las etiquetas