Todos estos son resúmenes, pero no son de utilidad en criptografía
https://es.wikipedia.org/wiki/Verificación_de_redundancia_cíclica
Funciones hash criptográficas son aquellas que:
Dado un mensaje
Que sea rápida de calcular
Resistencia a la preimagen: dado un hash, encontrar el mensaje exacto que tiene ese hash tiene que ser difícil
Resistencia a la colisión: encontrar dos mensajes diferentes con el mismo hash tiene que ser difícil
Sensibilidad / efecto avalancha: un cambio mínimo en el mensaje produce un valor hash completamente diferente
La única forma de encontrar preimágenes o colisiones tiene que ser la fuerza bruta
https://en.wikipedia.org/wiki/Cryptographic_hash_function#Properties
Las funciones de hash se usan mucho en criptomonedas, así que podemos utilizar sus tablas para conocer velocidades:
Más ejemplos: https://miningchamp.com/
En la imagen, un Avalon 6, bloque especializado en calcular hashes
Obvio: no puede existir una aplicación inyectiva entre un conjunto de
Existen infinitos mensajes diferentes con el mismo resumen: esto se llama "colisión"
Por ejemplo:
Si queremos resumir fotografías de 1MB en hashes de 256 bits (tamaño típico)
Es decir, hay un número
Queremos que no sea nada fácil (computacionalmente hablando) encontrar cualquiera de esas "casi infinitas" colisiones: la única forma debe de ser probar las fotografías una a una
En realidad hay un ataque a la resistencia a la colisión que deriva de la paradoja del cumpleaños:
si tenemos un grupo de 23 personas, la probabilidad de tener un par con la misma fecha de cumpleaños es del 50%
Sólo hace falta que el grupo llegue a 70 personas para que la probabilidad sea del 99%
Foto: nappy, free to use
Si tenemos un hash de tamaño
Para
Esto implica que para un hash hacen falta resúmenes el doble de largos de lo que hacía falta para las claves simétricas para obtener el mismo nivel de seguridad
La fortaleza de una función de hash de longitud
Los hashes recomendados en la actualidad son el SHA-2 (cualquier de las dos variantes) y el SHA-3
Ejemplos de valores de hash MD5, SHA256 y SHA512 de esta presentación:
> ms5sum 03-hashes.md
c99fe5e1ec0f637d77dddb32b1679c21 03-hashes.md
> sha256sum 03-hashes.md
06efc998ac8ad6867b4f1a9ee94d903503c0c52e6f1184a9561000eb303844ec 03-hashes.md
> sha512sum 03-hashes.md
64b378a66da3714e723ac8469525ac7b460d7ad7ff348b9453d177907a14fd4a
445a11c07206b7df599bcf3ec70475a6e89b4bbfe605c928c36494ff1a31311d 03-hashes.md
Si calculas los valores de hash del archivo, verás que no coinciden. Eso es porque no se puede calcular el hash de un archivo, meter el hash en el propio archivo, volver a calcular el hash ¡y que dé lo mismo! Recuerda: cualquier cambio (como por ejemplo meter el hash) cambia totalmente el hash
La familia SHA-2 fue impuesta por la NSA, la familia SHA-3 fue escogida por el NIST después de organizar una competición para definir el siguiente hash a utilizar
El SHA-3 se ha desarrollado teniendo en cuenta la eficiencia y como backup en caso de encontrar vulnerabilidades en el SHA-2 (diseños totalmente diferentes)
El SHA-2 hasta ahora ha sido sometido a un trabajo de análisis muy superior al SHA-3 y no se han encontrado ninguna vulnerabilidad
Formas de construir una función de hash:
Tablas de consulta que ofrecen un compromiso para obtener claves en texto simple a partir del resultado de una función de hash.
Son bases de datos:
Ejemplo:
$ echo -n sesame | sha256sum
d0c04f4b1951e4aeaaec8223ed2039e542f3aae805a6fa7f6d794e5afff5d272 -
$ echo -n hello | sha256sum
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 -
$ echo -n hola | sha256sum
b221d9dbb083a7f33428d7c2a3c3198ae925614d70210e28716ccaa7cd4ddb79 -
$ echo -n jñkjhafdiu232332 | sha256sum
b12ee96400fa19e7909a48f1727d3c81f6af71178209b58b612b5d2e75bf2d13 -
Integridad, Bitcoin, Cadena de custodia...
Cifrando el hash de un mensaje con nuestra clave privada, aseguramos que ese mensaje lo hemos enviado nosotros y cualquier puede verificarlo
Tenemos una presentación dedicada a firma digital
Firma digital de un mensaje = cifrado del hash de un mensaje con mi clave privada
El sistema operativo no debe guardar las contraseñas de los usuarios: si alguien consigue entrar, ¡obtiene la contraseña del usuario!
Podemos guardar simplemente su hash:
Pero esto tiene un problema: muchos usuarios usan palabras, nombres, etc. limitados. Las palabras, nombres conocidos són del orden de ≈100.000
Un atacante realizar un "diccionario" con el hash de todas las palabras, nombres, etc. (ataque de diccionario y rainbow table)
Se pueden usar hashes para detectar cuándo un atacante ha cambiado un mensaje: integridad
Se puede usar un hash para asegurar la integridad de un mensaje: HMAC
Hay modos de AES que utilizan estos esquemas: AES-GCM
MAC: Message Authenticated Code
https://en.wikipedia.org/wiki/Authenticated_encryption
Tenemos todo un tema para hablar de blockchain
Conjunto de datos en formato digital que pueden utilizarse en un tribunal para esclarecer los hechos de un delito: archivos, metadatos, logs de actividad, conexiones de tráfico en la red, discos duros, memorias USB....
Características:
Cuando se investiga un crimen... ¿cómo se protegen las evidencias digitales contra modificaciones?
Objetivo:
SO/IEC 27037:2012: Guidelines for identification, collection, acquisition and preservation of digital evidence
https://www.iso27001security.com/html/27037.html
Cuando llegue el jucio (o una investigación paralela) las evidencias digitales tienen que tener el mismo valor de hash que el inicial, lo que demuestra que la prueba no ha sido modificada
Hasta ahora hemos visto cómo ofrecer confidencialidad. La firma digital nos permite ofrecer el resto de servicios, pero para poder hacer firma digital tenemos que conocer qué son las funciones de hash
Los bits de paridad o los CRC se utilizan mucho con protocolos que esperan errores: RS232, lectura de CDs, la parte de paridad de un RAID... Un código de detección/corrección de errores se puede entender también como un "resumen" del mensaje: si el resumen no coincide con lo recibido, entonces sabemos ue ha habido un error. Pero estas funciones, en general, no sirven en criptografía: por ejemplo, la función del bloque de paridad de un RAID 4 es poder reconstruir el documento original, que es algo que no queremos que sea posible en criptografía
Ejemplos de valores de hash: - el primero "resume" un texto "Fox" en otro más largo: la función de hash siempre tiene la misma longitud, incluso si el texto es corto: SHA-256 siempre dará un resumen de 256 bits sea como sea el texto de entrada. - Los demás son variaciones del mismo texto de entrada. Fíjate: pequeñas variaciones dan un hash diferente a simple vista ¿Qué tenemos que cambiar en "The red fox jumps over the blue dog" para que tenga el mismo hash? Es decir, para que el hash no detecte el cambio. Ya que el texto es mayor de 256 bits, sabemos seguro que habrá otro texto que tendrá el mismo resumen. Pero lo único que podemos hacer es probar cambios uno y otro hasta tener suerte!
El principio del palomar dice que si tienes 9 agujeros y 10 palomas, es necesario que dos palomas compartan agujero. Puede parecer una obviedad, pero a veces se nos pasan las obviedades: Si los mensajes de 1.000.000 de caracteres se resumen en 256 caracteres... ¡por fuerza varios mensajes tendrán el mismo resumen!
Visita la referencia para ver el funcionamiento de SHA256 en cada paso. Observa que aunque sean muchas operaciones, todas ellas son XOR y shifts que son muy rápidas
Para evitar dudas, en criptografía preferimos utilizar sistemas que han sido escogidos en vez de impuestos
Visita la referencia para tener un listado de las contraseñas más usadas y tiempo que se tarda en romperlas
En la imagen se puede ver un ejemplo de cómo guarda una base de datos una contraseña protegida con bcrypt Nota: bcrypt no es exactamente un hash con salt sino un cifrado con contraseña conocida, aunque tiene la misma función que un hash. Se usa bcrypt porque es más lento que un hash, y eso añade seguridad adicional La cadena es lo que guardará la base de datos. Incluye los campos, separados con $: - Identificador del algoritmo: 2y - Número de operaciones de hash repetidas. En realidad es base 2: 2^10 - Salt - hash(password||salt)
Integridad: Capacidad de **detectar** si un mensaje ha sido modificado desde su transmisión hasta su recepción. La modificación se refiere tanto a una modificación **explícita por un atacante** como a una modificación debido a un error (por ejemplo de transmisión). > https://es.wikipedia.org/wiki/Integridad_del_mensaje
## Merkle Hash tree Si un archivo gran cambia a menudo y hay que calcular su hash cada vez, llevará mucho tiempo Solución: calcular hash solo de los bloques que cambien, y agruparlos en un árbol Permite firmar bases de datos, discos... de forma eficiente ![center w:35em](images/hashes/Hash_Tree.svg)