Si desea almacenar datos de manera que la persona que tiene los datos no pueda leerlos, entonces
- Es necesario cifrar los datos del lado del cliente. El cifrado del lado del servidor abre la posibilidad de que alguien (por ejemplo, el operador del servicio) pueda registrar los datos mientras está en tránsito.
- El cifrado debe realizarse utilizando claves seleccionadas por el cliente. Si alguien más proporciona las claves, pueden grabarlas.
- El cliente debe estar almacenado fuera de línea (para que el operador del servicio no pueda manipularlo después del hecho) y debe tener disponible el código fuente (para que el usuario pueda auditarlo y asegurarse de que haga lo que se supone que debe hacer).
Para evitar que el operador de servicios asocie los datos con una cuenta, la operación "almacenar" no es "asociar un nuevo registro con esta cuenta", sino "almacenar un registro etiquetado con este hash", donde se proporciona el hash en cuestión por el cliente (por ejemplo, un hash con sal de su contraseña, donde la sal es el número de índice del registro deseado). A la inversa, la operación de recuperación no es "seleccionar registros asociados con esta cuenta", sino "seleccionar registros etiquetados con este hash". Además, las operaciones de "almacenamiento" y "recuperación" no pueden requerir que el usuario esté conectado. Probablemente haya una manera de que un usuario demuestre que tiene una cuenta sin revelar cuál cuenta, pero no No sé cómo hacerlo.
Teóricamente, cualquier usuario puede solicitar los registros de cualquier otro usuario, aunque con un hash de 256 bits, las probabilidades de que una solicitud aleatoria devuelva un valor son extremadamente raras (1 en 10 ^ 68, si tiene mil millones de registros almacenados ). Dado que un atacante no tiene la contraseña de descifrado, el hecho de poder recuperar el registro de otra persona tiene poco valor.