Considere un sistema que recibe, pero no almacena, información confidencial X
de un usuario. Si quisiera agregar una forma de recordar cuándo un usuario ha enviado la misma X más de una vez, ¿cuál sería la forma más segura de hacerlo? X no se utiliza para ningún otro propósito; no es una contraseña.
El enfoque obvio pero inseguro sería almacenar todas las presentaciones de X y verificar si hay duplicados. Una forma de hacer esto más seguro sería computar un verificador (bcrypt o similar) de las presentaciones. Si se genera correctamente, tengo entendido que esto anularía los ataques precocinados con tablas de arco iris.
Mi preocupación es con los ataques de diccionario. Si X es relativamente fácil de adivinar, un atacante determinado probablemente puede hacer un progreso lento pero constante contra el verificador. Una solución para esto es truncar deliberadamente el verificador para aumentar el número de posibles plaintexts que coincida. Debido a que X no es una contraseña, debería estar bien aumentar el número de falsos positivos (se detectó un duplicado cuando no hay ninguna). Pero en el lado del atacante, pueden encontrar que es fácil encontrar un texto plano que coincida, pero hay tantos de ellos que es imposible saber cuál es el original.
En otras palabras, si la entropía del verificador es significativamente menor que la entropía de texto sin formato, el conjunto de todos los textos que coincidan con un verificador dado debería ser mucho mayor que si las entropías fueran de un tamaño comparable. Entonces es imposible saber qué texto en claro es el original.
¿Es este un enfoque válido? ¿O es excesivo si el verificador se calcula utilizando un algoritmo lento como bcrypt?