Hash Code y Checksum: ¿cuál es la diferencia?

115

Tengo entendido que un código hash y una suma de comprobación son cosas similares: un valor numérico, calculado para un bloque de datos, que es relativamente único.

es decir, la probabilidad de que dos bloques de datos produzcan el mismo valor numérico hash / suma de comprobación es lo suficientemente baja como para que pueda ignorarse a los efectos de la aplicación.

Entonces, ¿tenemos dos palabras para lo mismo o existen diferencias importantes entre los códigos hash y las sumas de verificación?

Richard Ev
fuente
3
Para resumir las respuestas a continuación: Un código hash reduce la entrada a un número pequeño, de una manera que minimiza la posibilidad de colisiones. Una suma de verificación, por otro lado, reduce la entrada a un número pequeño, de una manera que minimiza la posibilidad de colisiones. Puede hacer que un sonido sea diferente del otro reformulando arbitrariamente esa descripción.
Dan Stahlke
3
@DanStahlke - No, eso no es lo que dicen las respuestas a continuación. Sí, ambos reducen la entrada a un número menor. Pero hay muchas, muchas formas de hacerlo, ¿cómo elegir qué algoritmo usar? Eso depende de tu objetivo. Para resumir las dos respuestas principales: el objetivo de una suma de comprobación es " detectar los errores más comunes ". Elija un algoritmo que produzca una suma de comprobación diferente, para los errores que sean "más comunes" en su escenario. Si le preocupa que se alternen uno o dos bits, puede elegir un algoritmo que garantice la detección de ese error específico. Esta es una compensación muy específica.
ToolmakerSteve
1
@DanStahlke: por otro lado, el código hash cubre una amplia gama de posibles compensaciones. Si nos referimos a un valor utilizado para hacer una tabla hash, sabemos que habrá muchas colisiones. Esta es una compensación muy diferente (que una suma de comprobación). Estamos tratando de reducir las colisiones en promedio . No garantizamos nada. Puede haber algunas entradas que difieran solo en un bit, pero que produzcan el mismo hash. Esto está perfectamente bien, si en promedio obtenemos una buena distribución de valores hash. Sin embargo, sería inaceptable para una suma de comprobación.
ToolmakerSteve

Respuestas:

72

Yo diría que una suma de comprobación es necesariamente un código hash . Sin embargo, no todos los códigos hash son buenas sumas de comprobación.

Una suma de comprobación tiene un propósito especial: verifica o verifica la integridad de los datos (algunos pueden ir más allá al permitir la corrección de errores ). Las sumas de comprobación "buenas" son fáciles de calcular y pueden detectar muchos tipos de corrupción de datos (por ejemplo, uno, dos, tres bits erróneos).

Un código hash simplemente describe una función matemática que asigna datos a algún valor. Cuando se utiliza como medio de indexación en estructuras de datos (por ejemplo, una tabla hash), es deseable una baja probabilidad de colisión.

Zach Scrivena
fuente
6
Tal vez uno podría usarse como el otro, pero considerando que tienen diferentes objetivos de diseño, esto solo confunde el problema.
Wim Coenen
8
@gumbo: no, no todos los códigos hash son una suma de comprobación. Vea el ejemplo de cadena de MSalters a continuación.
MarcH
41

Hay un propósito diferente detrás de cada uno de ellos:

  • Código hash: diseñado para ser aleatorio en su dominio (para minimizar las colisiones en tablas hash y demás). Los códigos hash criptográficos también están diseñados para ser computacionalmente imposibles de revertir.
  • Suma de comprobación: diseñado para detectar los errores más comunes en los datos y, a menudo, para ser rápido de calcular (para una suma de comprobación eficaz de flujos rápidos de datos).

En la práctica, las mismas funciones suelen ser buenas para ambos propósitos. En particular, un código hash criptográficamente fuerte es una buena suma de control (es casi imposible que un error aleatorio rompa una función hash fuerte), si puede pagar el costo computacional.

Rafał Dowgird
fuente
1
También es bueno mencionar que la versión no criptográfica de los códigos hash puede proporcionar una buena compensación entre el tiempo de cálculo (cercano a CRC) y la detección de errores, ya sea intencional o simplemente un error de comunicación / descomposición de bits (no se puede esperar que CRC detecte la manipulación intencional porque es relativamente fácil diseñar intencionalmente una colisión).
gaborous
1
Para mí, la frase clave en su respuesta es que la suma de comprobación está diseñada para detectar los errores más comunes . Si eso es. es un algoritmo hash que se ha elegido para producir diferentes valores de posibles corrupciones de los datos. Ese es un propósito específico, y conduce a algoritmos específicos, que se optimizan para eso, dependiendo de los tipos de perturbaciones que nos preocupan.
ToolmakerSteve
22

De hecho, existen algunas diferencias:

  • Las sumas de comprobación solo deben ser diferentes cuando la entrada es diferente (con la mayor frecuencia posible), pero es casi tan importante que sean rápidas de calcular.
  • Los códigos hash (para usar en tablas hash) tienen los mismos requisitos y, además, deben distribuirse uniformemente en todo el espacio del código, especialmente para entradas que son similares.
  • Los hash criptográficos tienen el requisito mucho más estricto de que, dado un hash, no puede construir una entrada que produzca este hash. Los tiempos de cómputo vienen en segundo lugar y, dependiendo de la aplicación, incluso puede ser deseable que el hash sea muy lento de computar (para combatir ataques de fuerza bruta).
Michael Borgwardt
fuente
1
No creo que las sumas de comprobación sean diferentes para diferentes entradas y tenga algún beneficio. Son solo para verificar la integridad, no para hacer hash.
user541686
1
@Mehrdad: entonces, ¿cómo propones verificar la integridad sin obtener diferentes resultados para diferentes entradas?
Michael Borgwardt
Er, ¿tal vez escribí mal lo que dije? Me refería a la parte en la que dijiste "en la medida de lo posible"; solo digo que no hay razón para que sean impredecibles o "lejanos" como los hashes. Siempre que haya algún cambio en la suma de verificación cuando la entrada sufre un cambio típico, es una suma de verificación fina. Compare eso con los hash, que también tienen el objetivo de distribuir las cosas de la manera más uniforme, aleatoria, impredecible o "lejos" posible en su codominio.
user541686
Creo que malinterpretaste lo que quise decir con "en la medida de lo posible". Solo quise decir que las colisiones deberían ser lo más raras posible, aunque, por supuesto, son inevitables. Cambiaré la redacción.
Michael Borgwardt
@Mehrdad: al principio eso no tenía sentido para mí. Si una suma de verificación no tiene una buena distribución sobre los posibles valores de suma de verificación, eso significa que hay algunos valores de suma de verificación que se devuelven para muchos más valores de entrada (que para otras sumas de verificación). Pero, ¿eso disminuye la utilidad de la suma de comprobación? [Aumenta las probabilidades de que los datos perturbados devuelvan el mismo resultado, ¿verdad?] Hmm, estoy equivocado, tienes razón: la suma de comprobación solo tiene que ser buena para detectar posibles perturbaciones. Es posible que eso no requiera una distribución uniforme de todos los valores.
ToolmakerSteve
10

Los códigos hash y las sumas de comprobación se utilizan para crear un valor numérico corto a partir de un elemento de datos. La diferencia es que el valor de la suma de comprobación debe cambiar, incluso si se realiza una pequeña modificación en el elemento de datos. Para un valor hash, el requisito es simplemente que los elementos de datos del mundo real deben tener valores hash distintos.

Un claro ejemplo son las cuerdas. Una suma de comprobación para una cadena debe incluir todos y cada uno de los bits, y el orden es importante. Por otro lado, un código hash a menudo se puede implementar como una suma de comprobación de un prefijo de longitud limitada. Eso significaría que "aaaaaaaaaaba" tendría el mismo hash que "aaaaaaaaaaab", pero los algoritmos hash pueden lidiar con tales colisiones.

MSalters
fuente
Esta respuesta es la que me suena a la campana. Entonces, la integridad de los datos no es el foco de un hash.
truthadjustr
9

Wikipedia lo dice bien:

Las funciones de suma de comprobación están relacionadas con funciones hash, huellas digitales, funciones de aleatorización y funciones hash criptográficas. Sin embargo, cada uno de esos conceptos tiene diferentes aplicaciones y, por lo tanto, diferentes objetivos de diseño. Los dígitos de control y los bits de paridad son casos especiales de sumas de control, apropiados para pequeños bloques de datos (como números de Seguro Social, números de cuentas bancarias, palabras de computadora, bytes individuales, etc.). Algunos códigos de corrección de errores se basan en sumas de verificación especiales que no solo detectan errores comunes, sino que también permiten recuperar los datos originales en ciertos casos.

Jon Skeet
fuente
28
Después de leer eso, todavía me pregunto cuál es la diferencia.
kirk.burleson
@ kirk.burleson - Yo diría que son el mismo principio , pero en la práctica uno siempre hace concesiones . En diferentes situaciones, se aplican diferentes compensaciones, por lo que se utilizan diferentes enfoques. No es realmente una justificación para que haya dos palabras diferentes, solo digo que si busca buenas técnicas para las sumas de verificación, puede encontrar un conjunto diferente de algoritmos que cuando busca códigos hash.
ToolmakerSteve
5

Una suma de comprobación protege contra cambios accidentales.

Un hash criptográfico protege contra un atacante muy motivado.

Cuando envía bits por el cable, puede suceder accidentalmente que algunos bits se inviertan, eliminen o inserten. Para permitir que el receptor detecte (o en ocasiones corrija) accidentes como este, el remitente utiliza una suma de comprobación.

Pero si asume que hay alguien que está modificando activa e inteligentemente el mensaje en el cable y desea protegerse contra este tipo de atacante, entonces use un hash criptográfico (estoy ignorando la firma criptográfica del hash, o usando un canal secundario o similar, ya que la pregunta no parece eludir esto).

usuario3464863
fuente
3
"hash criptográfico" aumenta la confusión entre "hash" y "suma de comprobación". La "suma de comprobación criptográfica" es mejor porque no es así.
MarcH
5

Aunque el hash y las sumas de comprobación son similares en el sentido de que ambos crean un valor basado en el contenido de un archivo, el hash no es lo mismo que crear una suma de comprobación. Una suma de comprobación tiene como objetivo verificar (verificar) la integridad de los datos e identificar errores de transmisión de datos, mientras que un hash está diseñado para crear una huella digital única de los datos.

Fuente: CompTIA® Security + Guide to Network Security Fundamentals - Quinta edición - Mark Ciampa - Página 191

N Randhawa
fuente
4

En estos días son intercambiables, pero en otros tiempos una suma de comprobación era una técnica muy simple en la que agregabas todos los datos (generalmente en bytes) y agregabas un byte al final con ese valor en ... saber si alguno de los datos originales se ha dañado. Similar a un bit de verificación, pero con bytes.

Steven Robbins
fuente
4

La diferencia entre las funciones de código hash y suma de comprobación es que están diseñadas para diferentes propósitos.

  • Se usa una suma de verificación para averiguar si algo en la entrada ha cambiado.

  • Se usa un código hash para averiguar si algo en la entrada ha cambiado y para tener la mayor "distancia" posible entre los valores del código hash individuales.

    Además, podría haber más requisitos para una función hash, en oposición a esta regla, como la capacidad de formar árboles / clústeres / cubos de valores de código hash antes.

    Y si agrega algo de aleatorización inicial compartida, llega al concepto de cifrado / intercambio de claves moderno.


Acerca de la probabilidad:

Por ejemplo, supongamos que los datos de entrada en realidad siempre cambian (el 100% del tiempo). Y supongamos que tiene una función de suma de comprobación / hash "perfecta", que genera un valor de suma de comprobación / hash de 1 bit. Por lo tanto, obtendrá diferentes valores de suma de comprobación / hash, el 50% del tiempo, para datos de entrada aleatorios.

  • Si exactamente 1 bit en sus datos de entrada aleatorios ha cambiado, podrá detectarlo el 100% del tiempo, sin importar cuán grandes sean los datos de entrada.

  • Si 2 bits en sus datos de entrada aleatorios han cambiado, su probabilidad de detectar "un cambio" se divide por 2, porque ambos cambios podrían neutralizarse entre sí, y ninguna función hash / suma de verificación detectaría que 2 bits son realmente diferentes en los datos de entrada .

    ...

Esto significa que, si el número de bits en sus datos de entrada es varias veces mayor que el número de bits en su valor hash / suma de verificación, su probabilidad de obtener diferentes valores hash / suma de verificación, para diferentes valores de entrada, se reduce y no es una constante .

Sascha Wedler
fuente
2

Tiendo a usar la palabra suma de comprobación cuando me refiero al código (numérico o de otro tipo) creado para un archivo o dato que se puede usar para verificar que el archivo o los datos no estén dañados. El uso más común que encuentro es verificar que los archivos enviados a través de la red no hayan sido alterados (deliberadamente o de otra manera).

Ian1971
fuente
1
Debido a que las sumas de verificación no están diseñadas para ser difíciles de revertir, esto sugiere que no serían buenas para verificar si algo fue alterado deliberadamente.
benblasdell
0

En la fragmentación de datos del clúster de Redis, utiliza un hash slotpara decidir a qué nodo va. Tomemos, por ejemplo, la operación de módulo a continuación:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

los 6 viene dos veces a través de diferentes entradas. El propósito del hash es simplemente asignar un valor de entrada a un valor de salida y la singularidad no es parte del trato. Entonces, dos entradas diferentes que producen la misma salida están bien en el mundo de los hashes.

Una suma de comprobación, por otro lado, debe diferir la salida incluso si cambia un bit en la entrada porque su propósito no es mapear, sino detectar corrupción de datos. Entonces, dos entradas diferentes que producen la misma salida no son aceptables en una suma de comprobación.

Truthadjustr
fuente
-4

Una suma de comprobación es simplemente un número generado a partir del campo de datos por oring (por adición lógica, por lo tanto, suma). La suma de comprobación tiene la capacidad de detectar una corrupción de cualquier bit o número de bits dentro del campo de datos desde el cual se genera, es decir, verifica si hay errores, eso es todo, no puede corregirlos. Una suma de comprobación es un hash porque el tamaño de la suma de comprobación es más pequeño que los datos originales. Sí, tendrá colisiones porque la suma de comprobación no es en absoluto sensible a la posición del bit en el campo de datos.

Una verificación de redundancia cíclica (CRC) es algo bastante diferente, más complejo y NO se llama suma de verificación. Es la aplicación de una serie polinomial que tiene la capacidad de corregir cualquier número elegido de bits corruptos individuales dentro del campo de datos a partir del cual se generó. La creación de un CRC da como resultado un número mayor en tamaño que el campo de datos original (a diferencia de la suma de comprobación); de ahí el nombre que incluye la palabra "redundancia" y el precio que paga por la capacidad de corrección de errores. Por lo tanto, un CRC NO es un hash y no se debe confundir ni nombrar como una suma de verificación, porque la redundancia necesariamente aumenta el tamaño de los datos originales.

CapitanSensible
fuente