Pregunta

Entiendo 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 de 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 la misma cosa, o hay diferencias importantes entre los códigos hash y las sumas de verificación?

¿Fue útil?

Solución

Diría que una suma de comprobación es necesariamente a hashcode . Sin embargo, no todos los códigos hash son buenas sumas de verificación.

Una suma de verificación tiene un propósito especial: verifica o verifica la integridad de los datos (algunos pueden ir más allá al permitir corrección de errores ). " Bueno " las sumas de comprobación 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 usa como un medio de indexación en estructuras de datos (por ejemplo, una tabla hash), es deseable una baja probabilidad de colisión.

Otros consejos

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 inviables de revertir.
  • Suma de verificació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 verificación efectiva de flujos rápidos de datos).

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

De hecho, hay algunas diferencias:

  • Las sumas de verificación solo necesitan ser diferentes cuando la entrada es diferente (tan a menudo como sea 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 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 se puede construir una entrada que produzca este hash. Los tiempos de cómputo son segundos, y dependiendo de la aplicación, incluso puede ser deseable que el hash sea muy lento de calcular (para combatir los ataques de fuerza bruta).

Wikipedia lo pone bien:

  

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

Los códigos hash y las sumas de verificación se utilizan para crear un valor numérico corto a partir de un elemento de datos. La diferencia es que un valor de suma de verificación debería 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 cadenas. Una suma de comprobación para una cadena debe incluir todos y cada uno de los elementos, y el orden es importante. Por otro lado, un código hash a menudo se puede implementar como una suma de verificación de un prefijo de longitud limitada. Eso significaría que "aaaaaaaaaaba" tendría el mismo valor hash que " aaaaaaaaaaab " ;, pero los algoritmos hash pueden lidiar con tales colisiones.

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

Una suma de control protege contra cambios accidentales.

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

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

Pero si asume que hay alguien que modifica el mensaje de forma activa e inteligente en el cable y desea protegerse contra este tipo de atacante, entonces use un hash criptográfico (estoy ignorando firmar criptográficamente el hash, o usando un canal secundario o tal, ya que la pregunta no parece eludir esto).

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

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

  • Se utiliza un código hash para averiguar si algo en la entrada ha cambiado y para tener tanta " distancia " entre valores individuales de código hash como sea posible.

    Además, podría haber requisitos adicionales para una función hash, en oposición a esta regla, como la capacidad de formar árboles / grupos / cubos de valores de código hash temprano.

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


Acerca de la probabilidad:

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

  • Si exactamente 1 bit en sus datos de entrada aleatorios ha cambiado, podrá detectar eso 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 " está dividido entre 2, porque ambos cambios podrían neutralizarse entre sí, y ninguna función hash / checkum 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 de hash / suma de verificación, su probabilidad de obtener realmente diferentes valores de hash / suma de verificación, para diferentes valores de entrada, se reduce y no es una constante .

Tiendo a usar la palabra suma de verificación cuando me refiero al código (numérico o de otro tipo) creado para un archivo o pieza de datos que puede usarse para verificar que el archivo o los datos no han sido 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).

  

Aunque el hashing y las sumas de verificación son similares en que ambos crean un valor basado en el contenido de un archivo, el hashing no es lo mismo que   creando una suma de verificación. Una suma de verificación está destinada a verificar (verificar)   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 & # 174; Guía de seguridad + sobre los fundamentos de seguridad de red - Quinta edición - Mark Ciampa -Página 191

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top