Digamos que tengo un conjunto finito de cadenas (digamos medio billón). Nunca podría haber otras cadenas que necesitaría almacenar aparte de estos 500 millones de cadenas. Las cadenas pueden repetirse en mi base de datos. Necesito una forma segura de almacenar estos valores para poder tomar la entrada del usuario, ejecutar el mismo hash y probar si existe el valor. También necesito una forma de poder agrupar los valores que eran iguales antes del hash sin mucha exposición al valor original. Por último, los valores se pueden agregar en cualquier momento, por lo que la agrupación de valores no se puede realizar antes del hash. Nunca necesitaré saber el valor original de la cadena que se escribió.
Necesito poder agrupar filas según este valor, pero no necesito saber cuál fue el valor original por el que se agruparon.
Por brevedad de mi pregunta, si usara un hash (CRC-32) por sí mismo, terminaría con los valores en la siguiente tabla. (No no voy a usar CRC-32, es un ejemplo porque el hash es corto y fácil de demostrar la pregunta. Lo más probable es que haya usado bcrypt o PBKDF2)
Original
Value
Id Name Hash Not Stored
-----------------------------
1 Erik 68EFFF54 Apple
2 Tim 1A69B44E Orange
3 John 68EFFF54 Apple
Obviamente, Erik y John tienen el mismo hash que pueden agruparse. Sin embargo, debido a que tienen el mismo hash exacto dentro de un conjunto finito de valores, no sería demasiado difícil para un usuario malintencionado obtener todos los valores posibles, ejecutar el hash contra todos ellos y obtener una tabla de búsqueda.
El uso de un Salt no parece resolver el problema porque, si la base de datos se ve comprometida, no Ser demasiado difícil crear una tabla con búsquedas que incluyan las sales (obviamente tomaría más tiempo, pero dudo que tenga alguna importancia).
Podría usar un Pepper pero si el código se vio comprometido, esto también podría ser un problema.
Me parece que la mejor solución es tener una columna en la que pique el valor + pimienta + sal. Esta columna se usaría para buscar la entrada del usuario. Pero todavía estoy perplejo por saber cómo podría crear una forma segura de agrupar valores.
(También soy consciente de que CRC32 no es realmente un hash, es solo una suma de comprobación y que cumplen funciones completamente diferentes :)