Generar hash SHA-1

Escribe o pega algo y obtén su SHA-1: cuarenta caracteres hexadecimales. Está roto para firmas y certificados desde 2017, y aun así hace falta a diario, porque Git lo usa para identificar objetos y porque hay interfaces que no se han tocado en quince años. Esta página lo calcula por eso, y no porque sea una opción recomendable para algo nuevo.

Resultado

La respuesta aparece aquí mientras escribes.

  • Dónde se ejecuta

    No se sube nada, porque no hay archivo: se calcula en esta misma página.

  • Sin cola y sin cuenta

    Responde tan rápido como dé tu máquina, y nunca pregunta quién eres.

  • Tantas veces como quieras

    No se cuenta nada ni se limita nada: volver a responder no nos cuesta nada.

Cómo funciona

  1. Pega el texto en el campo.
  2. Copia los 40 caracteres hexadecimales.
  3. No se ha subido nada.

Qué se rompió exactamente en 2017

Google y el CWI de Ámsterdam publicaron dos PDF distintos con el mismo SHA-1. Costó unos 6.500 años de CPU en paralelo, y desde entonces el precio no ha dejado de bajar: hoy es cuestión de decenas de miles de euros en cómputo alquilado.

Lo que eso destruye es la capacidad de afirmar que un contenido no ha cambiado frente a alguien que puede fabricar el otro. Firmas, certificados y comprobaciones de integridad con adversario quedan fuera. Lo que no destruye es la resistencia a la preimagen: sigue sin haber forma práctica de recuperar el texto original.

Por qué Git sigue usándolo

Un identificador de objeto de Git es un SHA-1, y cambiar eso significa cambiar el formato de repositorio de todo el mundo a la vez. Hay una transición a SHA-256 especificada y en marcha desde hace años, y avanza despacio por esa razón exacta.

Mientras tanto, Git aplica una detección de colisiones que reconoce los patrones del ataque conocido y rechaza esos objetos. No convierte a SHA-1 en seguro; cierra la vía concreta que se demostró. Que sea suficiente depende de si alguien puede meter contenido en tu repositorio.

Un esquema roto no se remienda

Aparece con regularidad la idea de aplicar SHA-1 dos veces, combinarlo con una sal o encadenar dos algoritmos. Nada de eso arregla una debilidad de colisión: dos entradas que coinciden en la primera pasada coinciden también en la segunda, porque la segunda solo ve el resultado de la primera.

Para resistencia a colisiones lo único que sirve es otro algoritmo. Además, las construcciones caseras no están analizadas y a veces se comportan peor que sus piezas — hay una razón por la que HMAC es un diseño cuidadoso y no simplemente un hash sobre la clave y el mensaje pegados.

La forma corta, y cuándo colisiona

Git muestra los identificadores abreviados, tradicionalmente a siete caracteres. Son 28 bits, unos 268 millones de posibilidades, y por la paradoja del cumpleaños las colisiones se vuelven probables cuando un repositorio ronda los 16.000 objetos. Un proyecto mediano llega ahí sin esfuerzo.

Git lo resuelve alargando la forma corta automáticamente cuando hace falta, y por eso en repositorios grandes se ven ocho, nueve o diez caracteres. Quien copie un identificador abreviado a un script o a un ticket debería saberlo: es una ayuda visual, no un identificador estable.

Cuarenta caracteres

SHA-1 son 160 bits escritos como 40 dígitos hexadecimales, siempre la misma longitud. Junto con los 32 de MD5 y los 64 de SHA-256, permite reconocer de un vistazo con qué se está tratando.

Es una comprobación que ahorra tiempo cuando una documentación antigua dice «hash» sin más. Contar los caracteres responde la pregunta antes que leer el resto del documento, y evita cotejar valores producidos por algoritmos distintos.

El identificador de objeto de Git no es el hash del archivo

Git antepone a cada objeto su tipo y su longitud, separados por un byte cero, y hashea eso. El SHA-1 del contenido puro de un archivo no es, por tanto, su identificador de objeto — un resultado que se toma por un error con bastante frecuencia y no lo es.

Quien quiera reproducir un identificador a mano tiene que construir esa cabecera primero. Esta página hashea el texto que le des, sin adornos, que es lo que hace falta cuando lo que se está reproduciendo es una firma antigua o el valor esperado por una interfaz heredada.

El salto de línea, otra vez

Igual que con los otros dos: una herramienta de Unix escribe un salto de línea al final de un archivo y un campo de texto no, así que `sha1sum` de un archivo con una palabra no coincide con el SHA-1 de esa palabra escrita aquí.

Se repite en las tres páginas porque es el motivo más frecuente de que dos valores no cuadren, y porque quien llega a una de ellas rara vez ha leído las otras dos. Un byte invisible que cambia el resultado entero merece decirse cada vez.

Cuándo usarlo y cuándo no

Úsalo si algo externo lo exige y no puedes cambiarlo: un identificador de Git, una integración con un sistema antiguo, un formato de fichero definido hace veinte años. En esos casos la alternativa no es SHA-256, es no interoperar.

No lo elijas para nada nuevo. Si estás decidiendo hoy cómo firmar, cómo verificar integridad o cómo generar un identificador, SHA-256 hace el mismo trabajo sin la deuda — y no hay ninguna ventaja de SHA-1 que compense arrastrarla.

Qué significa esto para el RGPD

Lo que se hashea en un campo así suele venir de datos reales: un valor de una fila, un identificador de una integración, un contenido que hay que cotejar con un sistema antiguo. Como el cálculo ocurre en la página, nada de eso se nos comunica.

Y como en los otros dos: hashear un dato personal no lo anonimiza cuando el conjunto de entradas es acotado. Con SHA-1 vale doble, porque su velocidad hace que probar candidatos sea aún más barato que con SHA-256.

Generar hash SHA-1: preguntas frecuentes

¿Puedo seguir usando SHA-1?

Solo cuando algo externo lo exige y no puedes cambiarlo: un identificador de Git, una integración antigua, un formato definido hace décadas. Para cualquier cosa nueva, SHA-256.

Si está roto, ¿por qué lo usa Git?

Porque cambiarlo significa cambiar el formato de repositorio de todo el mundo a la vez. La transición a SHA-256 existe y avanza despacio por eso. Mientras tanto Git detecta y rechaza los objetos con el patrón del ataque conocido.

¿Sirve aplicarlo dos veces o con sal?

No. Dos entradas que colisionan en la primera pasada colisionan también en la segunda, porque la segunda solo ve el resultado de la primera. Contra colisiones solo sirve otro algoritmo.

¿Por qué no coincide con el identificador de objeto de mi commit?

Porque Git antepone el tipo y la longitud del objeto, separados por un byte cero, y hashea eso. El SHA-1 del contenido puro no es el identificador.

¿Sale de mi equipo el texto?

No. Se calcula en esta página. Y ten presente que hashear un dato personal no lo anonimiza si el conjunto de valores posibles es pequeño.

Otras herramientas