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?