Tengo problemas para diseñar un sistema para contenido autenticado de mi sitio distribuido por otras personas. Estoy trabajando en Ruby on Rails, pero no creo que a nivel teórico mi pregunta no esté restringida a ese marco. Para no revelar demasiado, mi sitio (llamémoslo www.site.com) ayuda a las empresas a mantener un inventario de quién ha comprado qué artículo, y permite a los clientes ver su historial de compras.
Por lo tanto, tengo el siguiente problema:
- Supongamos que Alice vende hamburguesas con queso. Alice hace una cuenta en site.com y registra sus hamburguesas con queso como un artículo que vende. En consecuencia, site.com almacena la hamburguesa con queso de Alice en una base de datos SQL con el id 92314
- Bob es un cliente en el puesto de hamburguesas con queso de Alice y recientemente ha comprado una hamburguesa con queso.
- A Alice le gustaría contarle a Bob sobre site.com y su capacidad para rastrear las compras. Por lo tanto, Alice envía una solicitud a site.com para devolver
hashA
que corresponde al elemento con id 92314. - Bob visita
www.site.com/purchase/hashA
y se le solicita que cree una cuenta o inicie sesión para registrar su nueva compra de hamburguesa con queso de Alice's Delicious y Delectable cheeseburgers. - Charlie también visita el puesto de hamburguesas de Alice y compra una hamburguesa con queso.
- A Alice también le gustaría contarle a Charlie sobre site.com y envía una solicitud que genera
hashB
para que Charlie la use de la misma manera.
Mi pregunta es, ¿cómo puedo crear un esquema que pueda generar hashA
y hashB
de manera que mi servidor web pueda buscar los elementos de manera eficiente? Sospecho que hashB
puede generarse a partir de hashA
usando algún tipo de cifrado usando hashA
como semilla. No sé cómo, al recibir hashA
o hashB
, site.com sabrá que corresponde al ítem 92314. Sospecho que usando un nonce ayudará.
Las cosas que me gustaría evitar incluyen:
- Hacer que Charlie use
hashA
después de que lo haya usado Bob - Exponer el id 92314 al usuario
- Tener un único punto de error (es decir, una clave única que cifra los hashes para todos los identificadores)
- Se rompen las cosas si Charlie usa
hashB
antes de que Bob usehashA
.
Descargo de responsabilidad: mi experiencia es más en gráficos de computadora y menos en desarrollo web o criptografía, por lo que apuntar a Google es útil. Si esto pertenece a cualquiera de los otros sitios de stackexchange (Criptografía, Programadores, etc.). No dude en hacérmelo saber y lo moveré.