Cómo garantizar la privacidad de los archivos que almaceno

1

Quiero crear una aplicación para Android donde los usuarios de una oficina (uso típico) puedan cargar documentos escaneados al servicio de back-end de la aplicación para su uso posterior.

por ejemplo Un abogado quiere subir una frase sensitiveDocument.png .

La privacidad garantizada para el usuario es un punto de venta importante para el producto. Del ejemplo anterior, el abogado desea que él sea la única persona que puede leer el documento, ni yo mismo como administrador de S3 (planeo usar Amazon S3 para el almacenamiento), y no mencionar a otros usuarios.

Además, quiero asegurarles a mis usuarios que no puedo leer sus archivos.

Idea

Una clave de usuario controlada por el usuario : el usuario cifra simétricamente el archivo con su clave, carga el archivo cifrado y cuando quiere leer el archivo, recupera el archivo cifrado y lo descifra. la aplicación de Android.

Contras

  • El usuario debe recordar otro bit de información además de la contraseña.
  • Como alternativa a la anterior, la aplicación puede generar y almacenar la clave automáticamente, pero ...
  • De cualquier manera, el usuario puede perder la clave, por ejemplo, en el primer caso. si olvidó la clave, y en el lado de la aplicación, por ejemplo, si la clave se elimina accidentalmente o si el teléfono es robado, etc.

¿Hay alguna manera de hacer esto correctamente?

    
pregunta sanrodari 15.01.2014 - 19:33
fuente

3 respuestas

1

Si el usuario puede leer su documento, pero usted no puede, entonces el usuario debe "saber" (es decir, recordar o almacenar) algún valor que usted no sepa. Un "valor" secreto que se usa para desbloquear el acceso a algunos documentos: los criptógrafos llaman a estos valores "claves".

Una contraseña es una clave que el usuario puede recordar, es decir, puede almacenarla en su cerebro. Esto tiene deficiencias, la principal de las cuales es que las contraseñas realistas son débiles contra la fuerza bruta. el hashing de contraseña adecuado se utiliza para tratar de hacer frente a esta debilidad . En cualquier caso, los usuarios pueden olvidar contraseñas.

Desde un punto de vista criptográfico, una forma "razonable" de hacer las cosas es la siguiente:

  • Cada usuario tiene dos "contraseñas": una normal ( P ) y una "contraseña de recuperación" ( R ) que no es realmente una contraseña, ya que es una gran secuencia de letras aleatorias, y el usuario no intentará recordarla.
  • El usuario escribe la contraseña de recuperación en un trozo de papel que almacena en un lugar seguro (por ejemplo, en un banco). La contraseña de recuperación está ahí para recuperar los datos cuando el usuario olvida su contraseña.
  • Cada archivo está cifrado con una clave simétrica K , llamada "clave maestra" (cada usuario tiene su propia "clave maestra").
  • El sistema de almacenamiento, donde están los documentos, también contiene el cifrado de K por P , y el cifrado de K por R . Cuando se encripta "por la contraseña P ", quiero decir que se utiliza una sal aleatoria específica del usuario en una buena función de hashing de contraseña para convertir P en una clave simétrica K P , y esa clave simétrica se usa para cifrar K . De manera similar con R .

Cuando el usuario desea leer sus documentos, ingresa a P , de donde se deriva KP (usando la sal almacenada); esto permite recuperar K y, por lo tanto, descifrar los documentos.

Cuando el usuario cambia su contraseña a P ', basta con recuperar K (como arriba), generar una nueva sal, luego calcular K P ' , encripta K con eso, y almacena el resultado (junto con el nuevo salt) en el servidor.

Cuando el usuario olvida su contraseña, va a su banco, recupera su contraseña de recuperación R y la usa para recuperar K y luego elige una nueva contraseña.

Con lo anterior, el servidor de almacenamiento sysadmin puede obtener suficiente información para "probar contraseñas" (lo que se denomina "ataque de diccionario sin conexión"). Esto es inevitable, y es por eso que usamos una buena función de hashing de contraseñas con sales y muchas iteraciones.

Como lo indica @ scuzzy-delta, un punto crítico es que el cliente no es un desarrollador, por lo que necesariamente tendrá que confiar en algún software, en algún momento, no jugarle trucos desagradables. Esto cubre su aplicación, pero también el sistema operativo; y, más generalmente, será responsabilidad del cliente asegurarse de que su PC no esté cargada de malware. Bajo estas condiciones, no puede garantizar que los documentos del cliente no serán saqueados; pero puede asegurarse de que no se lo culpará si le auditan el código (recuerde que sus clientes son abogados: pueden ser feroces). La auditoría es muy costosa, y cada vez más si el código es más grande, por lo que desea mantener su aplicación lo más pequeña posible.

Se sabe que la criptografía es difícil de implementar, por lo que se recomienda ampliamente que se adhiera a los formatos estándar existentes y, si es posible, a las bibliotecas estándar. El formato OpenPGP sería un buen lugar para comenzar. Lo ideal sería encontrar un buen formato implementado tanto por Android como por iOS (el código que ya está en el teléfono no necesita ser auditado, al menos no para la auditoría que cubre su propia máscara).

    
respondido por el Tom Leek 15.01.2014 - 20:43
fuente
2

Un paso más es usar una función de derivación de clave para obtener una clave de la contraseña del usuario. Luego puede cifrar la clave de datos utilizada para cifrar cada archivo con la clave derivada del usuario y puede almacenar la forma cifrada de la clave de datos en su servidor con el archivo. Sin la contraseña del usuario, la clave no se puede utilizar, pero también permite que el usuario acceda a ella desde múltiples dispositivos sin tener que lidiar con la administración de claves.

    
respondido por el AJ Henderson 15.01.2014 - 19:51
fuente
1

@AJ Henderson es correcto: use una función de derivación de claves en lugar de hacer que el usuario cree / recuerde / ingrese la clave real.

Más allá de eso, mencionó que desea tranquilizar al usuario de que no puede leer sus archivos, lo que significa que debe proporcionar alguna prueba de que es sincero. Las mejores pruebas son caras de falsificar. Así que podrías considerar lo siguiente:

  • Código abierto para el código de inspección
  • Ofrezca una "recompensa por errores de seguridad" (para obtener puntos adicionales, hágalos mantener en custodia por un tercero neutral)
  • Como alternativa o adición a la fuente abierta, invite a un tercero respetado a realizar una auditoría del código fuente ( el proceso está actualmente en curso para Truecrypt y es muy interesante de seguir).
  • Prometer reembolsos en caso de una violación de seguridad
respondido por el scuzzy-delta 15.01.2014 - 20:02
fuente

Lea otras preguntas en las etiquetas