Supongamos que tenemos un servidor de almacenamiento malintencionado (un almacén de valor-clave que no utiliza el usuario, que admite server.put(key, value)
y server.get(key)
) que queremos usar para el almacenamiento seguro de archivos por usuario. Las dos interfaces que quiero asegurar son client.upload(username, filename, message)
y client.download(username, filename)
, que se comunican con server.put()
y server.get()
detrás de la escena.
Suposiciones:
- Cada usuario tiene sus claves privadas almacenadas de forma segura localmente, y las claves públicas almacenadas en un servidor de claves públicas seguro.
- El servidor malintencionado puede intentar manipular el mensaje cargado.
- El servidor malintencionado puede hacer que un usuario cargue archivos arbitrarios con cualquier nombre y contenido que desee.
- El servidor malicioso no revertirá un archivo ni lo eliminará.
- Los nombres de archivo y el contenido del archivo no están vacíos.
Requisitos:
- Las longitudes de los nombres de archivo y el contenido del archivo no tienen que ser confidenciales (por ejemplo, el servidor malintencionado no hará que el usuario cargue uno de cada dos archivos con diferentes longitudes, y trate de adivinar qué archivo / ella subió).
- Los nombres de archivo y los contenidos del archivo deben ser confidenciales.
- El cliente debe rechazar cualquier archivo que haya sido manipulado o no cargado por el usuario especificado. (Es decir, integridad y autenticación).
El diseño en el que estoy pensando es:
- clave (para usar con el servidor de almacenamiento) =
encrypt(filename, priv_key_1)
- Valor =
signed(encrypt(message, priv_key_1), priv_key_2)
¿Hay algún defecto en este diseño?