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?
language-agnostic
hash
computer-science
checksum
Richard Ev
fuente
fuente
Respuestas:
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.
fuente
Hay un propósito diferente detrás de cada uno de ellos:
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.
fuente
De hecho, existen algunas diferencias:
fuente
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.
fuente
Wikipedia lo dice bien:
fuente
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).
fuente
Fuente: CompTIA® Security + Guide to Network Security Fundamentals - Quinta edición - Mark Ciampa - Página 191
fuente
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.
fuente
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 .
fuente
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).
fuente
En la fragmentación de datos del clúster de Redis, utiliza un
hash slot
para decidir a qué nodo va. Tomemos, por ejemplo, la operación de módulo a continuación: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.
fuente
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.
fuente