md5 - tipos - ¿Qué algoritmo de suma de verificación debería usar?
suma de verificacion redes (2)
Estoy construyendo un sistema que necesita poder encontrar si se han actualizado las manchas de bytes . En lugar de almacenar todo el blob (pueden tener hasta 5 MB), creo que debería calcular una suma de comprobación, almacenar esto y calcular la misma suma de comprobación un poco más tarde, para ver si el blog se ha actualizado.
El objetivo es minimizar lo siguiente (en ese orden):
- tamaño de la suma de comprobación
- tiempo para calcular
- Probabilidad de colisiones (2 sumas de comprobación idénticas suceden incluso si el contenido ha sido modificado).
Es aceptable que nuestro sistema tenga una colisión de no más de 1 / 1,000,000. La preocupación no es la seguridad, sino simplemente la detección de actualización / error, por lo que las colisiones raras están bien. (Por eso lo puse último en las cosas para minimizar).
Además, no podemos modificar los blobs de texto nosotros mismos.
Por supuesto, me vienen a la mente md5
, crc
o sha1
, y si quisiera una solución rápida, iría por ella. Sin embargo, más que una solución rápida, estoy buscando lo que podría ser una comparación de diferentes métodos, así como los pros y los contras .
Blake2 es la función hash más rápida que puedes usar y que se adopta principalmente:
BLAKE2 no solo es más rápido que las otras buenas funciones hash, es incluso más rápido que MD5 o SHA-1 Source
El ganador del concurso SHA-3 fue el algoritmo Keccak, pero aún no tiene una implementación popular, no se adopta por defecto en las distribuciones GNU / Linux. En cambio, Blake2 que fue candidato al concurso SHA-3 es más rápido que Keccak y es parte de coreutils de GNU . Entonces, en su distribución de GNU / Linux puede usar b2sum
para usar el algoritmo de hash Blake2.
Sugiero que eche un vistazo a esta página SO , CRC vs MD5 / SHA1.
La velocidad y las colisiones se discuten en este otro hilo .
Y como siempre, Wikipedia es tu amiga.
Si tuviera que elegir, hay una pregunta importante que responder: ¿quiere que en cualquier caso no haya colisión? O, al menos, que la probabilidad sea tan baja que esté cerca de la posibilidad de que la Luna colisione con la Tierra dentro de los próximos 5 minutos?
Si es así, elija la familia SHA.
En su caso, cambiaría la forma en que se realiza la verificación de actualización .
Por ejemplo, un número incremental podría asociarse con el blob y enviarse en lugar del hash ; la solicitud de actualización sería necesaria si el número es diferente en el otro lado. La probabilidad de colisión en este caso va de ~ 10 ^ -18 a ~ 0 (básicamente 0 + probabilidad de error ) ...
Editar los siguientes comentarios
Encontré este algoritmo, Alder-32, que es bueno para mensajes largos (MB) con un CRC de 32 bits, es decir, aproximadamente ~ 1/10 ^ 9 (MD5 tiene 128 bits de longitud).
Es rápido de calcular.
Adler-32 . Hay algunos ejemplos (enlaces) en la parte inferior.