Función hash criptográfica
# Función hash criptográfica

Funciones hash criptográficas (CHF) son aquellas que cifran una entrada y actúan de forma parecida a las funciones hash, ya que comprimen la entrada a una salida de menor longitud y son fáciles de calcular.

Se llaman funciones hash criptográficas a aquellas funciones hash que se utilizan en el área de la criptografía. Este tipo de funciones se caracterizan por cumplir propiedades que las hacen idóneas para su uso en sistemas que confían en la criptografía para dotarse de seguridad. Estas propiedades las hacen resistentes frente ataques maliciosos que intentan romper esa seguridad.

## Propiedades

Fundamentalmente queremos pedir las siguientes propiedades a estas funciones: que dada una x sea muy fácil calcular h(x), pero que, contrariamente, x sea difícil de calcular dada una y=h(x). Además pedimos que sea difícil encontrar una pareja (x,y) con x≠y tal que h(x)=h(y), es decir, que sea difícil producir colisiones.

Establecer qué propiedades tiene que cumplir una función hash criptográfica es difícil ya que son usadas en aplicaciones criptográficas muy diversas, y que por tanto requieren propiedades diferentes. Sin embargo en general podemos decir que es necesario que sean deterministas (un mensaje siempre tiene el mismo valor hash) y de bajo coste (para que sean utilizables en la práctica). Además normalmente se suele requerir que sean uniformes y con efecto avalancha con el objetivo de que sea imposible predecir cualquier valor hash a partir de otros valores hash capturados.

Para determinar las propiedades requeridas para asegurar la seguridad es necesario saber cuál es el objetivo principal de la función. Podemos distinguir dos tipos de funciones: las que tienen como objetivo principal verificar la integridad, a las que se llaman Códigos de detección de modificaciones, y las que tienen como objetivo principal la autenticación del origen del mensaje, a las que se llaman Códigos de autenticación de mensajes. Estos nombres no son muy correctos ya que estas funciones no son códigos y además ambos tipos permiten la autenticación de mensajes. Sin embargo son los más ampliamente aceptados.

### Código de detección de modificaciones

El objetivo de estas funciones es poder detectar si un mensaje ha sido modificado o no. Por tanto permiten la verificación de la integridad del mensaje. Su funcionamiento consiste en calcular el valor hash del mensaje y que este sirva como prueba para una posible verificación de si el mensaje ha sido modificado. A las funciones hash diseñadas con este objetivo se las llama Códigos de detección de modificaciones (en inglés: Modification Detection Codes, MDC)

Para cumplir su objetivo la función hash tiene que cumplir propiedades que la haga resistente frente ataques de adversarios maliciosos cuyo objetivo es que la función no cumpla su cometido. Según la propiedad que se estime necesaria que cumpla se puede decir que hay dos tipos de Códigos de detección de modificaciones:

* Las que requieren que la función hash sea CRHF. Por tanto es difícil encontrar dos mensajes con el mismo valor hash.

### Código de autenticación de mensajes

El objetivo de estas funciones es permitir comprobar, sin usar ningún mecanismo adicional, la autenticidad del origen de un mensaje asegurando además la integridad de dicho mensaje. Debido a esta funcionalidad se las llama Códigos de Autenticación de Mensajes (en inglés: Message Authentication Codes, MAC).

Las MAC son funciones hash con clave, la cual mantienen en secreto tanto el que se quiere autenticar como el que verifica la autenticación. Para que sea resistente frente ataques es necesario que la función comprima y que sea resistente a la computación de nuevos valores hash.

## Aplicaciones de la función de hash criptograficas

Las funciones de hash criptográficas tienen múltiples aplicaciones prácticas:

* Verificación de archivos y mensajes
* Almacenamiento de constraseñas
* Creación y verificación de firmas digitales
* Búsqueda en bases de datos
* Creación de una cadena de bloques
* Sistema de prueba de trabajo

## Implementación

A continuación listamos la implementación de Azrael en Java, una función hash criptográfica iterativa construida a la medida que devuelve una salida de 320 bits o 40 bytes para entradas de longitud arbitraria, y también Azrael512 con una salida de 512 bits o 64 bytes.

A raíz de los algoritmos cuánticos, la paradoja del cumpleaños cuántico (∛) ahora nos impone una cota de 768 bits de salida para mantener la seguridad, ante este asunto ofrecemos AzraelX4.

