Creo que es bueno que quieras proteger la privacidad de un usuario, pero lo que estás creando parece oponerse a proteger la privacidad, por lo que no creo que sea posible hacerlo con una configuración simple (por ejemplo, la URL de envío del cliente, en cualquier forma, directamente a su servicio backend).
Como han señalado otros, el hashing usando sha1 es un buen primer paso, pero solo logra privacidad contra humanos que arriesgan un vistazo rápido a la base de datos. No le brinda mucha privacidad contra los algoritmos diseñados para analizar el contenido de la base de datos.
También está filtrando más que la URL visitada: el usuario también le dice a qué hora estuvo en línea y miró la URL dada si realiza una comprobación en tiempo real.
Algunos otros han sugerido soluciones para mitigar los problemas de privacidad. Si bien todos son mejores que no hacer nada, no resuelven el problema. Por ejemplo, la solución de Google de solo enviar 32 bits del hash se ve bien, pero
que aún solo asigna todas las direcciones URL existentes a una tabla hash con 4 mil millones de ranuras. Algunas de estas ranuras pueden contener un gran número de entradas, pero dado que no todas las direcciones URL tienen la misma probabilidad de ser visitadas (por ejemplo, es mucho más probable que se visiten las direcciones URL de Facebook que la página de inicio de alguna escuela primaria) y las direcciones URL de un solo dominio lo más probable es que haya un hash bastante equitativo en los 4 mil millones de ranuras disponibles, aún así será bastante fácil de adivinar, dado un conjunto de urls completas que contienen el mismo prefijo de 32 bits, que realmente se visitó (especialmente para google, que tiene un pagerank datos sobre una gran cantidad de urls por ahí ...)
Un ataque de este tipo involucra a alguien que está construyendo una tabla arcoiris de URL en las que está interesado. Podrías hacerlo más difícil por
- Usar una función de hash de contraseña en lugar de sha1, que toma mucho tiempo para calcular el hash, pero esto significará que el complemento de su navegador parece no responder.
- Salan tus hashes. Obviamente, no puede dar a cada usuario su propia sal, o todos los hashes para la misma URL proporcionada por diferentes usuarios serán únicos, lo que probablemente hará que su aplicación sea inútil. Pero cuanto mayor sea la base de usuarios, menos usuarios necesitarán los mismos valores de sal. Aún no protege la privacidad del usuario, pero hace que sea más difícil calcular las tablas arco iris para averiguar exactamente qué URL se visitaron, y si alguien lo hace por la sal de un usuario específico, solo la privacidad de todos los demás usuarios que comparten su sal. está comprometido.
Sin embargo, esto todavía no ayuda en absoluto en los casos en que un atacante no está interesado en el conjunto completo de URL con hash, pero solo quiere responder preguntas muy específicas (por ejemplo, qué usuarios visitaron las URL que pertenecen a los dominios en ¿Una "lista negra" dada?) Dado que tales consultas solo involucrarán una lista corta (tal vez unas pocas docenas hasta unos cientos de miles de URL, dependiendo del tamaño de la lista negra), es trivial hacer hash de cada una de ellas en una cantidad corta de tiempo, no importa qué contramedidas utilice para disminuir la velocidad.
Es peor que eso, porque muchos sitios web solo tienen algunos puntos de entrada comunes, el más probable es que solo sea el dominio seguido de una ruta vacía. Otras rutas comúnmente visitadas son las páginas de inicio de sesión, las páginas de perfil, etc., por lo que el número de urls que necesita hacer hash para determinar si alguien ha visitado un dominio específico es muy pequeño. Si un atacante hace eso, perderá a los usuarios que usaron un enlace profundo en un sitio web, pero capturará a la mayoría de ellos.
Y se pone aún peor: si un atacante logra encontrar una url completa de un hash que proporcionó un usuario, podría obtener fácilmente todas las urls para una gran parte de la sesión de navegación de ese usuario. ¿Cómo? Bueno, ya que tiene una URL, puede anularla con su propia araña personalizada, mirar todos los enlaces del documento, marcarlos y buscarlos en su base de datos. Luego él hace lo mismo con esos enlaces, y así sucesivamente.
Así que puedes hacer algunas cosas para hacerlo más difícil, pero no creo que haya una manera de evitar que el usuario confíe básicamente en ti con su historial de navegación. Las únicas formas de solucionar lo que puedo ver implicarían construir un sistema distribuido que no esté completamente bajo su control y usarlo para recopilar direcciones URL, por ejemplo, un tipo de red de mezcladores. Otro lugar podría ser que los clientes descarguen una gran parte del contenido de su base de datos, ocultando así las URL que realmente les interesaban y brindando contenido nuevo para su base de datos solo en paquetes grandes, que al menos ocultaría el componente de tiempo de la navegación del usuario. .