Hash (hashing)
En criptografía, una función hash convierte una entrada de cualquier tamaño en una huella de longitud fija y difícil de invertir. Un hash criptográfico tiene que resistir ataques de preimagen, de segunda preimagen y de colisión; sobre eso se sostienen las comprobaciones de integridad y las firmas digitales. Las contraseñas son la excepción: necesitan una función de derivación de clave hecha para eso, nunca un hash rápido de propósito general.
Cómo funciona
Una función hash convierte cualquier entrada en una salida de longitud fija, de forma determinista: la misma entrada da siempre el mismo resumen, y cualquier cambio en la entrada lo cambia. Un hash criptográfico como SHA-2, SHA-3 o BLAKE2 tiene que cumplir tres propiedades: resistencia a preimagen (dado un resumen, no se puede encontrar una entrada que lo produzca), resistencia a segunda preimagen (dada una entrada, no se puede encontrar otra distinta con el mismo resumen) y resistencia a colisión (no se pueden encontrar dos entradas cualesquiera que colisionen). Son esas propiedades las que permiten que un hash acredite que un fichero no ha cambiado, y las que permiten que una firma digital firme un documento firmando su resumen. Aquí la velocidad es una virtud: comprobar integridad tiene que ser rápido.
Qué sale mal
Esa misma velocidad es lo que convierte a un hash de propósito general en la herramienta equivocada para guardar contraseñas, y decir que el hash es «la base del almacenamiento de contraseñas» es, en sí mismo, el hallazgo que levantamos. Un hash rápido permite a un atacante probar miles de millones de intentos por segundo contra una base de datos robada, así que las contraseñas necesitan una función de derivación de clave como Argon2id, que es deliberadamente lenta y exigente en memoria.
El otro fallo que se ve en la práctica es tratar «no reversible» como si fuera suficiente. MD5 y SHA-1 siguen siendo no reversibles, pero su resistencia a colisión está rota, y la colisión es precisamente la propiedad de la que depende una firma: un hash roto bajo una firma es un riesgo real de falsificación aunque nadie sea capaz de invertirlo. La propiedad que importa depende del uso, no del algoritmo en abstracto.
Dónde aparece esto en una auditoría
Allá donde aparece hashing comprobamos que el algoritmo encaja con su propósito. Para almacenamiento de contraseñas señalamos cualquier hash de propósito general, incluso con salt, porque el salt elimina el precálculo pero no la velocidad. Para firmas e integridad señalamos MD5 y SHA-1 por su resistencia a colisión rota. Para integridad con clave comprobamos que se usa una construcción HMAC y no un hash ingenuo de la clave concatenada con el mensaje. El hallazgo se redacta contra el desajuste entre el algoritmo y lo que está protegiendo, porque un hash usado para el trabajo equivocado es un defecto por mucha fuerza que tenga el algoritmo.