Hash Function Xor

3

Para una función hash, ¿cuál es el mejor método seguro, XOR o Concatenate:

h (data1 XOR data2 XOR data3 XOR data4)? o utilizar h (data1 || data2 || data3 || data4)?

    
pregunta 17.01.2013 - 11:39
fuente

3 respuestas

6

En tu ejemplo, XOR es una forma de mezclar los datos. Las funciones de hash ya proporcionan un buen cifrado, por lo que la concatenación proporcionaría un dato más largo que resistiría mejor un ataque de fuerza bruta.

Si usa XOR y el atacante puede controlar el campo data1 , entonces el atacante puede controlar la salida de la operación XOR y el hash resultante. Un ejemplo sería XOR-algo que está controlado por el atacante con algo que está cambiando, como una marca de tiempo. El atacante puede crear una entrada para controlar la salida del XOR, eliminando así el efecto de la marca de tiempo cambiante.

    
respondido por el Cristian Dobre 17.01.2013 - 11:44
fuente
6

Realmente depende de lo que estés tratando de hacer; una función hash es una herramienta . Al igual que un martillo es bueno si quieres golpear las uñas, no tanto si quieres alimentar a un bebé (un biberón es mejor para eso).

Un uso principal de las funciones hash es obtener un "resumen" que representa un dato determinado. Este es el primer paso para firmas digitales : en lugar de firmar un dato, firmamos el hash de la pieza de datos; el hash es "tan bueno" como los datos originales para fines de verificación (ya que no puede hacer trampa con una función de hash), pero el valor de hash tiene un tamaño corto y fijo que es mucho más conveniente mapear en las estructuras matemáticas utilizadas por el algoritmo de firma. Un uso similar de las funciones hash es para almacenar "tokens de verificación", como lo que ocurre con las contraseñas: almacena el hash de la contraseña, de modo que cuando la contraseña "vuelve", puede verificar que coincida con la que almacenó; pero lo que almacena no es suficiente para volver a calcular (fácilmente) la contraseña.

Aparentemente, desea agrupar un conjunto de elementos de datos : los datos de entrada son un conjunto de cuatro bloques de datos.

Si su conjunto está ordenado (considera que "datos1, datos2, datos3, datos4" son distintos de "datos1, datos2, datos4, datos3"), entonces debe usar concatenación, no XOR . Para el caso, probablemente querría hacer una codificación algo menos ambigua, porque si data1 es "df" y data2 es "gh", entonces la concatenación produce "dfgh", que es el mismo valor que obtendrías al concatenar "d" con "fgh". Si sus elementos de datos son cadenas de caracteres que nunca incluyen una coma, entonces puede concatenarlos con signos de coma como separador, lo cual es suficiente para evitar esta ambigüedad.

Si su conjunto no está ordenado (considera que "data1, data2, data3, data4" tiene el mismo significado que "data1, data2, data4, data3", y desea que ambos tengan hash para el mismo valor), entonces el XOR tampoco es la solución correcta; en su lugar, debe imponer un "paso de clasificación" en el que los cuatro elementos de datos se ordenan primero de manera inequívoca (por ejemplo, orden lexicográfico), y luego se realiza la concatenación como se indicó anteriormente.

No imagino un escenario en el que XORing haga algo útil aquí, pero tal vez tenga un caso de uso en el que el XOR haga lo correcto. Realmente depende de lo que quieras lograr.

    
respondido por el Thomas Pornin 17.01.2013 - 19:08
fuente
3

Concatenación *: Te dará:

  1. Un hash único: si algunas combinaciones de data1-4 producen el mismo XOR (sí, pueden) tendrás una colisión incluso antes de aplicar el hash.
  2. Un espacio de teclas más largo. Incluso si los datos 1-4 nunca chocan cuando se selecciona XOR, el espacio de teclas de entrada es más grande y será más difícil que brutas se introduzcan.

    • La concatenación es el "mejor método" de los dos (consulte el comentario de @ StephenTouset a continuación)
respondido por el Henning Klevjer 17.01.2013 - 11:45
fuente

Lea otras preguntas en las etiquetas