¿Cómo evitar que una aplicación encriptada del lado del cliente sea abusada como almacenamiento general?

1

El diseño de la aplicación es simple:

Entrada de usuario > Serializar como JSON > Cifrado del lado del cliente > Subir al servidor

El objeto que se almacena está estructurado de esta manera:

type: <type1|type2|type3>
    type_specific_field1: "value1"
    type_specific_field2: "value2"
    type_specific_field3: "a_very_long_value_such_as_image_data"

Todo lo que ve el servidor es un blob encriptado. Por razones de privacidad, el servidor no tiene permiso para ver el type o los nombres de campo. El usuario puede crear tantos objetos como desee, y cada objeto puede ser grande (por ejemplo, 10 MB).

El problema entonces es que un usuario podría almacenar datos arbitrarios en el blob encriptado, y el servidor no tendría forma de verificar si los datos cargados son un objeto válido o no. Podrían (ab) usar el servidor como una alternativa de almacenamiento en la nube a Dropbox, S3, etc., en lugar de para el propósito previsto.

Ideas para mitigación que tengo hasta ahora:

  • Límite de velocidad de red por usuario / dirección IP.
  • Cantidad límite de objetos por usuario.
  • Exigir prueba de trabajo para cada objeto.
  • Requiere entrada CAPTCHA cada objeto X.

Ideas que podrían funcionar en casos similares pero no en este:

  • "Prueba de espacio" no funcionará en este caso porque no se espera que el cliente guarde una copia de los objetos que cargan.
  • El requisito de pago por cada objeto o unidad de almacenamiento tampoco funcionará en este caso porque la aplicación es gratuita.

Las mitigaciones que enumeré definitivamente ayudan, pero no eliminan la posibilidad de abuso, y cada una tiene efectos perjudiciales para los usuarios legítimos.

¿Hay una manera para que el cliente pruebe, o el servidor verifique, que el blob encriptado contiene un objeto válido? ¿O otras mitigaciones criptográficas, de nivel de red o de aplicación que pueda imaginar?

    
pregunta Anders 26.04.2018 - 02:35
fuente

1 respuesta

1

Si está permitiendo almacenar objetos en su servidor y necesita limitar la cantidad de almacenamiento por usuario, debe introducir una cuota por usuario y rechazar las nuevas subidas o eliminar las más antiguas. Otras cosas no funcionarán de manera confiable si su encriptación es lo suficientemente buena y los usuarios desean usar mal sus recursos.

Sin saber su caso de uso concreto, es difícil dar algún otro consejo.

Es posible que desee agregar a su pregunta por qué que no desea limitar el número de objetos. Obviamente, do desea limitarlos, pero está tratando de evitar contar los objetos / espacio de almacenamiento utilizado por los objetos, pero limítelos reduciendo la velocidad con la que se pueden crear.

    
respondido por el allo 26.04.2018 - 13:51
fuente

Lea otras preguntas en las etiquetas