¿es posible extraer un "hash de sugerencia" de algún tipo de otro hash?

5

Soy un desarrollador web que está comenzando a sumergirse en la criptografía, así que por favor, cuéntame sobre esto ...

Digamos que tengo una colección de hashes que se generaron a partir de algunos datos comunes, es decir, cambios en múltiples registros. ¿Hay alguna manera de generar un hash secundario a partir del hash principal y compararlo con los otros hash según cómo se generó el hash principal? Por ejemplo ...

plain text             | hash      | hint hash
----------------------------------------------
"USER:123:fName:Alice" | 92eb5ff.. | 3cd24
"USER:123:fName:alice!"| 1c77753.. | 3cd24
"USER:456:fName:Bob"   | fee6ae2.. | 7d28e
"USER:456:fName:bob!"  | 7775315.. | 7d28e
"USER:789:fName:Carl"  | fec3ad7.. | 75315

Observe que todos los hashes son únicos, pero los hashes de sugerencia coinciden con los ID de registro de los que están hasheados. Entonces, si generé estos hashes basados en el texto plano y alguna clave, es decir, genHash (plainText, keyText). Si solo tuvieras los hashes, podrías asociar los hashes que están relacionados entre sí solo por sus hashes de sugerencia. Entonces, si solo tuviera los hashes, todavía podría encontrar sus asociaciones con un par de llamadas getHintHash (hash) ...

Tabla de hashes:

hash      
---------
92eb5ff.. 
1c77753..
fee6ae2..
7775315.. 
fec3ad7..

Tabla de hashes con hashes de sugerencia:

hash      | hint hash
----------------------
92eb5ff.. | 3cd24
1c77753.. | 3cd24
fee6ae2.. | 7d28e
7775315.. | 7d28e
fec3ad7.. | 75315

Ahora tengo las relaciones entre los hashes únicos sin exponer el texto sin formato que los generó. es posible? Recuerde, la función de hash obtuvo el texto en claro y una clave para que el "hash de sugerencia" se pueda basar en ...

genHash("USER:123:fName:Alice", "USER:123") -> 92eb5ff..
    
pregunta dirtdevil 03.09.2016 - 00:43
fuente

2 respuestas

2

Quieres un esquema donde, dados solo los valores hash, puedes calcular si dos hashes se refieren al mismo usuario o no. Esta es una pregunta bastante compleja, por lo que tiene una respuesta bastante compleja. Primero, asegurémonos de que todos estamos de acuerdo con los términos:

Def'n: Hash :

  

Una función hash es cualquier función que se puede usar para asignar datos de tamaño arbitrario a datos de tamaño fijo. [wikipedia / Hash_Function]

Por ejemplo, las iniciales son una función hash perfectamente válida ( John Smith --> JS , Christina Secretmessagewriter --> CS ), aunque no es buena para la criptografía porque no hace mucho para esconderla.

Def'n Cryptographic Hash :

  

Una función criptográfica hash es un algoritmo matemático que mapea datos de tamaño arbitrario a una cadena de bits de un tamaño fijo (una función hash) que está diseñada para ser también una función de una sola vía, es decir, una función que no es factible invertir. [wikipedia / Cryptographic_Hash_Function]

Si hace clic en "función unidireccional" y baja lo suficiente por el orificio del conejo, descubrirá que los hashes criptográficos deben ser indistinguibles de los aleatorios, lo que significa que si le di dos hashes, no hay forma de obtenga cualquier tipo de información sobre si las dos entradas están relacionadas (otro término googlable para esto es "efecto de avalancha").

Por lo tanto, por definición, lo que desea está en desacuerdo con la idea misma de una función criptográfica hash, cuyo objetivo es evitar la pérdida de información de cualquier .

Dependiendo de cuánto te importe la fuga de información, la respuesta puede continuar.

Lo que está pidiendo es incrustar la sugerencia de hash dentro del hash general de tal manera que se pueda extraer de nuevo. No hay seguridad real aquí porque si puedes hacerlo, también puede hacerlo un atacante que conozca tu sistema, pero explorémoslo de todos modos.

Una forma de lograr esto sería agrupar las partes USER:123 y fName:Alice por separado y concatenarlas para hacer su hash general. Tu "sugerencia de hash" es solo la primera mitad de tu hash general (o las primeras N caracteres si usas hashes de diferente tamaño). Cumple con el requisito de que getHintHash(hash) extraiga la sugerencia de hash del hash general, y le permite correlacionar el registro relacionado sin exponer realmente el texto simple.

Puedes hacer algo más complejo inventando tu propia función hash no criptográfica que difunde la sugerencia sobre el masaje en lugar de pegarlo en la parte delantera (tal vez a través de algunas matemáticas inteligentes o usando un truco de stenography bolsa de trucos), pero no está claro qué es lo que te gana.

Al final del día, puede obtener algo de security-through-darkurity y es posible que pueda comprimir tu hash es un poco más pequeño, pero en realidad es equivalente a concatenar dos hashes.

    
respondido por el Mike Ounsworth 03.09.2016 - 01:35
fuente
1

No estoy claro en tu publicación si GetHintHash es una operación de recuperación de datos o una función de cálculo pura.

Si está preguntando, "¿Puedo diseñar un sistema de almacenamiento de datos que incluya hashes de pistas que puedan recuperarse del almacenamiento a través de una función llamada GetHintHash(hash) que me permita recuperar registros relacionados?" entonces sí, obviamente, acabas de describir un sistema de este tipo.

Si está preguntando, "¿Puedo escribir una función que me diga si dos hashes se derivaron de un texto claro similar, dado que no hay otros datos que no sean los dos hashes?" La respuesta es NO , a menos que su función hash apague. Solicita el recuento de la siguiente viñeta en negrita:

  

La función hash criptográfica ideal tiene cuatro propiedades principales:

     
  • es rápido calcular el valor de hash para cualquier mensaje dado

  •   
  • no es posible generar un mensaje a partir de su valor hash, excepto al intentar todos los mensajes posibles

  •   
  • un pequeño cambio en un mensaje debería cambiar el valor de hash de manera tan extensa que el nuevo valor de hash no esté correlacionado con el valor de hash antiguo

  •   
  • no es posible encontrar dos mensajes diferentes con el mismo valor hash

  •   

(fuente: Wikipedia )

    
respondido por el John Wu 03.09.2016 - 01:36
fuente

Lea otras preguntas en las etiquetas