Respuestas:
CRC funciona bien para detectar errores aleatorios en los datos que pueden ocurrir, por ejemplo, por interferencia de red, ruido de línea, distorsión, etc.
CRC es computacionalmente mucho menos complejo que MD5 o SHA1. El uso de una función hash como MD5 probablemente sea excesivo para la detección de errores aleatorios. Sin embargo, usar CRC para cualquier tipo de verificación de seguridad sería mucho menos seguro que una función de hashing más compleja como MD5.
Y sí, CRC es mucho más fácil de implementar en hardware integrado, incluso puede obtener diferentes soluciones empaquetadas para esto en IC.
MD5
, SHA-1
también debe evitarse, SHA-2
se recomienda alguna variante .
CRC está diseñado contra cambios involuntarios en los datos. Es decir, es bueno para detectar errores involuntarios, pero será inútil como una forma de asegurarse de que los datos no se manejen de forma malintencionada.
También mira esto .
Encontré un estudio que muestra cuán inapropiados son los hashes CRC para las tablas hash . También explica las características reales del algoritmo. El estudio también incluye la evaluación de otros algoritmos hash y es una buena referencia para mantener.
La conclusión relevante sobre CRC para hashes:
CRC32 nunca fue diseñado para el uso de tablas hash. Realmente no hay una buena razón para usarlo para este propósito, y le recomiendo que evite hacerlo. Si decide usar CRC32, es fundamental que use los bits hash del extremo opuesto al que se introducen los octetos clave. El final depende de la implementación específica de CRC32. No trate CRC32 como una función hash de "recuadro negro", y no la use como un hash de propósito general. Asegúrese de probar la idoneidad de cada aplicación.
ACTUALIZAR
Parece que el sitio está caído. Sin embargo, el archivo de Internet tiene una copia .
Ejecuté cada línea de este código PHP en 1.000.000 de bucle. Los resultados están en comentarios (#).
hash('crc32', 'The quick brown fox jumped over the lazy dog.');# 750ms 8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');# 700ms 8 chars
hash('md5', 'The quick brown fox jumped over the lazy dog.');# 770ms 32 chars
hash('sha1', 'The quick brown fox jumped over the lazy dog.');# 880ms 40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms 64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms 96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars
Mi conclusión:
Use "sha256" (o superior) cuando necesite una capa de seguridad adicional.
No use "md5" o "sha1" porque tienen:
"The quick brown fox jumped over the lazy dog."
), verá cuánto CRC es más rápido que MD5.
Para obtener información sobre la implementación, la velocidad y la confiabilidad de CRC, consulte Una guía sencilla para los algoritmos de detección de errores de CRC . Tiene todo en CRC.
A menos que alguien intente modificar sus datos maliciosamente y ocultar el cambio, CRC es suficiente. Simplemente use un polinomio "Bueno" (estándar).
Todo depende de sus requisitos y expectativas.
Aquí hay breves breves diferencias entre estos algoritmos de función hash :
es un algoritmo criptográfico hash,
produce un valor hash de 160 bits (20 bytes) conocido como resumen de mensaje
es un hash criptográfico y desde 2005 ya no se considera seguro,
se puede usar con fines de cifrado,
publicado por primera vez en 1993 (como SHA-0), luego 1995 como SHA-1,
serie: SHA-0, SHA-1, SHA-2, SHA-3,
En resumen, el uso de SHA-1 ya no se considera seguro contra oponentes bien financiados, porque en 2005, los criptoanalistas encontraron ataques contra SHA-1, lo que sugiere que puede no ser lo suficientemente seguro para el uso continuo de schneier . US NIST aconseja que las agencias federales dejen de usar SHA1-1 para aplicaciones que requieren resistencia a colisiones y deben usar SHA-2 después de 2010 NIST .
Por lo tanto, si está buscando una solución simple y rápida para verificar la integridad de los archivos (contra la corrupción), o para algunos propósitos simples de almacenamiento en caché en términos de rendimiento, puede considerar CRC-32, para el hash que considere usar MD5, sin embargo, si está desarrollando una aplicación profesional (que debe ser segura y consistente), para evitar cualquier probabilidad de colisión, use SHA-2 y superior (como SHA-3).
Alguna prueba de referencia simple en PHP:
# Testing static text.
$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real 0m0.845s
user 0m0.830s
sys 0m0.008s
$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real 0m1.103s
user 0m1.089s
sys 0m0.009s
$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real 0m1.132s
user 0m1.116s
sys 0m0.010s
# Testing random number.
$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(rand(0,$i));'
real 0m1.754s
user 0m1.735s
sys 0m0.012s\
$ time php -r 'for ($i=0;$i<1000000;$i++) md5(rand(0,$i));'
real 0m2.065s
user 0m2.042s
sys 0m0.015s
$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(rand(0,$i));'
real 0m2.050s
user 0m2.021s
sys 0m0.015s
Relacionado:
No dices qué es lo que estás tratando de proteger.
Un CRC a menudo se usa en sistemas integrados como un control contra la corrupción accidental de datos en lugar de evitar la modificación maliciosa del sistema. Ejemplos de los lugares donde un CRC puede ser útil es validar una imagen EPROM durante la inicialización del sistema para protegerse contra la corrupción del firmware. El gestor de arranque del sistema calculará el CRC para el código de la aplicación y lo comparará con el valor almacenado antes de permitir que se ejecute el código. Esto protege contra la posibilidad de corrupción accidental del programa o una descarga fallida.
Un CRC también se puede usar de manera similar para proteger los datos de configuración almacenados en FLASH o EEPROM. Si el CRC es incorrecto, los datos se pueden marcar como no válidos y se puede usar un conjunto de datos predeterminado o de respaldo. El CRC puede no ser válido debido a una falla del dispositivo o si el usuario desconectó la alimentación durante una actualización del almacén de datos de configuración.
Ha habido comentarios de que un hash proporciona una mayor probabilidad de detectar corrupción que un CRC con errores de múltiples bits. Esto es cierto, y la decisión sobre si utilizar o no un CRC de 16 o 32 bits dependerá de las consecuencias de seguridad de un bloque de datos corrupto y de si puede justificar la posibilidad de 1 en 2 ^ 16 o 2 ^ 32 de bloque de datos incorrectamente declarado válido.
Muchos dispositivos tienen un generador CRC incorporado para algoritmos estándar. La serie MSP430F5X de Texas tiene una implementación de hardware del estándar CRC-CCITT.
Utilice CRC solo si los recursos de cálculo son muy reducidos (es decir, algunos entornos de inserción) o si necesita almacenar / transportar muchos valores de salida y el espacio / ancho de banda es limitado (ya que los CRC son generalmente de 32 bits donde una salida MD5 es de 128 bits, SHA1 160 bit y otras variantes SHA de hasta 512 bit).
Nunca use CRC para controles de seguridad, ya que es muy fácil falsificarlo.
Incluso para la detección de errores accidentales (en lugar de la detección de cambios maliciosos) los hashes son mejores que un simple CRC. En parte debido a la forma simple en que se calcula un CRC (y en parte porque los valores de CRC son usualmente más cortos que las salidas hash comunes, por lo que tienen un rango mucho más pequeño de valores posibles) es mucho más probable que, en una situación donde hay dos o más errores , un error enmascarará a otro, por lo que terminará con el mismo CRC a pesar de dos errores.
En resumen: a menos que tenga motivos para no utilizar un algoritmo hash decente, evite los CRC simples.
Recientemente me encontré con un uso de CRC que era inteligente. El autor de la herramienta de identificación y eliminación de duplicación de archivos jdupe (el mismo autor de la popular herramienta exif jhead) la usa durante la primera pasada a través de los archivos. Se calcula un CRC en los primeros 32K de cada archivo para marcar los archivos que parecen ser iguales, también los archivos deben tener el mismo tamaño. Estos archivos se agregan a una lista de archivos para realizar una comparación binaria completa. Acelera la comprobación de archivos multimedia de gran tamaño.
Empecemos con lo básico.
En Criptografía, un algoritmo de hash convierte muchos bits a menos bits a través de una operación de resumen. Los hashes se utilizan para confirmar la integridad de los mensajes y archivos.
Todos los algoritmos de hash generan colisiones. Una colisión es cuando varias combinaciones de muchos bits producen la misma salida de menos bits. La fuerza criptográfica de un algoritmo de hash se define por la incapacidad de un individuo para determinar cuál será la salida para una entrada dada porque si pudieran, podrían construir un archivo con un hash que coincida con un archivo legítimo y comprometer la integridad asumida. del sistema. La diferencia entre CRC32 y MD5 es que MD5 genera un hash más grande que es más difícil de predecir.
Cuando desee implementar la integridad del mensaje, lo que significa que el mensaje no ha sido alterado en tránsito, la incapacidad de predecir colisiones es una propiedad importante. Un hash de 32 bits puede describir 4 mil millones de mensajes o archivos diferentes usando 4 mil millones de hashes únicos diferentes. Si tiene 4 mil millones y 1 archivos, se garantiza que tendrá 1 colisión. 1 TB Bitspace tiene la posibilidad de miles de millones de colisiones. Si soy un atacante y puedo predecir cuál será el hash de 32 bits, puedo construir un archivo infectado que colisione con el archivo de destino; que tiene el mismo hash
Además, si estoy haciendo una transmisión de 10 mbps, entonces la posibilidad de que un paquete se corrompa de la forma correcta para omitir crc32 y continuar hasta el destino y ejecutar es muy baja. Digamos que a 10mbps obtengo 10 errores \ segundo . Si aumento eso a 1gbps, ahora obtengo 1,000 errores por segundo . Si llego hasta 1 exabit por segundo, entonces tengo una tasa de error de 1,000,000,000 de errores por segundo . Digamos que tenemos una tasa de colisión de 1 \ 1,000,000errores de transmisión, lo que significa que 1 en un millón de errores de transmisión da como resultado que los datos corruptos pasen sin ser detectados. A 10mbps, recibo datos de error que se envían cada 100,000 segundos o aproximadamente una vez al día. A 1 gbps sucedería una vez cada 5 minutos. A 1 exabit por segundo, estamos hablando varias veces por segundo.
Si abre Wireshark, verá que su encabezado Ethernet típico tiene un CRC32, su encabezado IP tiene un CRC32 y su encabezado TCP tiene un CRC32, y eso es además de lo que pueden hacer los protocolos de capa superior; por ejemplo, IPSEC puede usar MD5 o SHA para la verificación de integridad además de lo anterior. Hay varias capas de verificación de errores en las comunicaciones de red típicas, y TODAVÍA funcionan de vez en cuando a velocidades inferiores a 10 mbps.
La verificación de redundancia cíclica (CRC) tiene varias versiones comunes y varias poco comunes, pero generalmente está diseñada para indicar cuándo un mensaje o archivo se ha dañado en tránsito (volteo de varios bits). CRC32 en sí mismo no es un protocolo de verificación de errores muy bueno para los estándares actuales en entornos empresariales grandes y escalares debido a la tasa de colisión; El disco duro de los usuarios promedio puede tener más de 100k archivos, y los archivos compartidos en una empresa pueden tener decenas de millones. La relación entre el espacio hash y la cantidad de archivos es demasiado baja. CRC32 es computacionalmente barato de implementar, mientras que MD5 no lo es.
MD5 fue diseñado para detener el uso intencional de colisiones para hacer que un archivo malicioso se vea benigno. Se considera inseguro porque el espacio hash se ha mapeado lo suficiente como para permitir que ocurran algunos ataques, y algunas colisiones son predecibles. SHA1 y SHA2 son los nuevos niños en el bloque.
Para la verificación de archivos, Md5 está comenzando a ser utilizado por muchos proveedores porque puede crear archivos multigigabyte o multiterrabyte rápidamente y apilarlo sobre el uso general del sistema operativo y el soporte de CRC32. No se sorprenda si en la próxima década los sistemas de archivos comienzan a usar MD5 para la verificación de errores.