Almacene los hashes para un conjunto finito de cadenas que requerirían mucho tiempo para revertir a través de la búsqueda en la tabla, pero también permitir la agrupación

1

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 :)

    
pregunta Erik Philips 23.03.2018 - 22:59
fuente

1 respuesta

1

No soy un experto en el campo, pero este parece ser un buen caso de uso para un Módulo de seguridad de hardware que encripta todo hashes antes de almacenarlos en la base de datos.

Usando los algoritmos apropiados, los hashes idénticos serían idénticos cuando se encriptaran, por lo tanto, su necesidad de indexación quedaría satisfecha.

Un atacante con acceso a la base de datos no podría reconstruir los hashes. Para construir una tabla de búsqueda, el atacante requeriría un acceso prolongado al HSM. Esto debería satisfacer sus requisitos de seguridad.

    
respondido por el Enos D'Andrea 24.03.2018 - 06:41
fuente

Lea otras preguntas en las etiquetas