Herramientas de desarrollo · Calculadora de hash SHA
Hexadecimal, Base64 y bytes sin formato: tres formas de escribir el mismo resumen SHA
· Cómo funciona
sha-256 base64 codificación formatos de archivo
sha256sum imprime hexadecimal, package-lock.json almacena base64 y Docker usa un prefijo sha256:. Todos pueden tener los mismos 32 bytes. Esta publicación explica cada representación y cómo convertir entre ellas.
Los hashes que parecen diferentes pero coinciden: una cadena de archivo de bloqueo y una suma de comprobación de terminal para el mismo archivo
Un resumen SHA-256 es fundamentalmente 32 bytes. La forma en que escribe esos bytes determina cómo se verá el resumen. Un resumen, 32 bytes idénticos, aparece como 64 caracteres hexadecimales (dos por byte), o 44 caracteres base64 (aproximadamente cuatro por cada tres bytes), o diferentes longitudes y formatos según la codificación. La confusión surge porque un archivo de bloqueo puede mostrar una representación y un terminal muestra otra, ambos para los mismos 32 bytes subyacentes.
Comprender la codificación es el paso que convierte "¿por qué se ven diferentes?" en "Puedo confirmar que son iguales". Las tres representaciones son equivalentes una vez que las decodificas en bytes.
Un resumen son bytes: 20, 32, 48 o 64 de ellos, según el algoritmo, antes de cualquier codificación de texto.
Antes de que exista cualquier representación textual, el resultado es un ArrayBuffer de bytes de resumen. ToolAcre envuelve ese búfer con Uint8Array, luego escribe cada byte como dos dígitos hexadecimales o convierte cada byte en un carácter binario antes de llamar a btoa. Ninguno de los formateadores vuelve a ejecutar el hash y ninguno cambia un solo bit de resumen.
El ancho de bytes sigue el algoritmo seleccionado en esta herramienta: SHA-1 devuelve veinte bytes, SHA-256 treinta y dos, SHA-384 cuarenta y ocho y SHA-512 sesenta y cuatro. Esas son salidas admitidas verificadas por los metadatos y las pruebas del algoritmo. Los bytes sin formato son apropiados para la comparación programática; hexadecimal y base64 son notaciones de transporte para canales que esperan texto.
Hex: dos caracteres por byte, por qué domina las herramientas de línea de comandos y la cuestión del caso
La representación hexadecimal utiliza los dígitos 0-9 y las letras A-F (o a-f) para representar los 16 valores posibles de un cuarteto de 4 bits. Dos dígitos hexadecimales representan un byte. El resumen SHA-256 de la entrada abc es 32 bytes, por lo que se muestra como 64 caracteres hexadecimales: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Este es el formato que imprimen la mayoría de las herramientas de línea de comandos. El hexadecimal es legible por humanos y no es ambiguo; cada byte está representado exactamente por los mismos dos caracteres cada vez.
Hexadecimal es el formato predeterminado para sumas de verificación y hashes en la documentación y en la línea de comando. Es fácil de leer y copiar, y no hay relleno, no distingue entre mayúsculas y minúsculas en la interpretación (aunque la convención dicta minúsculas o mayúsculas de manera consistente) y no hay caracteres especiales que deban escaparse en las URL o JSON. La desventaja es que requiere el doble de caracteres que de bytes sin formato, razón por la cual existen otros formatos.
Base64 y base64url: aproximadamente cuatro caracteres por cada tres bytes, relleno y dónde aparece cada uno (SRI, npm, huellas digitales SSH)
Base64 codifica tres bytes como cuatro caracteres extraídos de un alfabeto de caracteres 64: A-Z, a-z, 0-9, +, /. Los tres bytes 61 62 63 (el Códigos ASCII para abc) codifican como YWJj en base64. Un resumen completo de 32 bytes SHA-256 codifica aproximadamente 44 caracteres base64. Rellenar con caracteres = lleva la longitud de salida a un múltiplo de 4, por lo que 44 caracteres más 0 relleno (debido a que 32 es un múltiplo de 3, no se necesita relleno). La decodificación invierte el proceso: cuatro caracteres base64 se decodifican en tres bytes.
Base64 aparece en archivos package-lock.json, npm envoltorio retráctil, atributos SRI (Subresource Integrity) en HTML y huellas digitales de clave SSH. Es compacto: aproximadamente un 33% más largo que los bytes sin formato, en comparación con el 100% más largo del hexadecimal. La desventaja es que no todas las representaciones de texto son igualmente fáciles de leer; base64 parece más confuso para el ojo humano que hexadecimal.
Formas prefijadas: sha256: en resúmenes de contenedores, sha384- en atributos de integridad, SHA256: en SSH
Base64url es una variante definida en RFC 4648 que sustituye - y _ por + y /. El alfabeto se convierte en A-Z, a-z, 0-9, -, _. Los JWT usan base64url porque + y / tienen significados especiales en las URL (+ se puede leer como un espacio en las cadenas de consulta, / es un separador de ruta). Un segmento JWT siempre está codificado en base64url y un decodificador que insiste en el estándar base64 lo rechazará. Por el contrario, un decodificador base64url que no acepte el alfabeto estándar fallará en base64 estándar.
El relleno es opcional en base64url. Almohadillas base64 estándar con = para garantizar que la longitud de salida sea un múltiplo de 4. Base64url comúnmente omite el relleno porque = en sí mismo es una URL incómoda. Un decodificador debe aceptar base64url con o sin relleno, y el codificador debe ser explícito sobre lo que produce. La herramienta ToolAcre base64 acepta ambos alfabetos y tolera la falta de relleno en la entrada, y le permite elegir el formato en la salida.
Ejemplo resuelto: un resumen convertido de hexadecimal a base64 y viceversa, con los límites de bytes marcados
Los formularios con prefijo agregan un identificador de esquema al resumen. Los resúmenes de imágenes de Docker utilizan sha256:ba7816bf..., donde sha256: es el prefijo. Las huellas digitales SSH usan SHA256:, con dos puntos. Algunas herramientas usan sha256= o SHA256= (con un signo igual). El prefijo es puramente informativo; le dice qué algoritmo produjo el resumen. La eliminación del prefijo deja los mismos bytes en la misma codificación.
Al comparar resúmenes, el prefijo es ruido. Si una herramienta imprime SHA256:ba78... y otra imprime ba78..., son el mismo resumen; el prefijo son solo metadatos sobre el formato. De manera similar, prefijos como sha256:- (usado en algunos contextos de contenedores) o sha384- (usado en atributos de integridad) son convenciones de formato que no cambian los bytes. Quítelos para comparar.
Lo que esto no cubre: qué codificación emite una herramienta determinada; compruebe el formato de salida antes de comparar
Un resumen, el SHA-256 de la entrada abc, aparece en múltiples formas: hexadecimal (64 caracteres), base64 con relleno (44 caracteres), base64url con relleno (44 caracteres, con - y _ en lugar de + y /), o con varios prefijos. Para confirmar, son los Lo mismo, decodifica cada uno en bytes y compara los bytes. La representación hexadecimal ba7816bf... decodifica en los bytes 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea... La representación base64 se convierte a la misma secuencia de bytes cuando se decodifica.
La calculadora de hash ToolAcre SHA genera resultados en hexadecimal de forma predeterminada. Si necesita base64, puede usar una herramienta separada para convertir el hexadecimal a base64, o usar la utilidad base64 en el mismo sitio para codificar el texto directamente. Las herramientas diseñadas para contextos específicos (npm para package-lock.json, Docker para resúmenes de imágenes) generan resultados en el formato que espera su contexto. Comprender que todos estos son los mismos 32 bytes en diferentes prendas elimina la confusión cuando las herramientas no están de acuerdo con el formato.
Conclusión: compare bytes, no cadenas: calcule el resumen con la calculadora de hash SHA de ToolAcre y luego conviértalo a la representación que está comparando
Para convertir manualmente un resumen hexadecimal a base64, agrupe los dígitos hexadecimales en bytes, convierta cada byte a decimal y luego codifique usando el alfabeto base64. El byte 0xba (ba hexadecimal) es decimal 186; 0x78 es 120; 0x16 es 22; 0xbf es 191. Al agrupar estos cuatro bytes y codificarlos como base64 se obtienen los caracteres w (0 + 22 en el alfabeto), como (codificación 186), AA (codificación 120), vw (codificación 191). El resumen completo requiere hacer esto 10 veces y rellenar si es necesario. Este proceso manual es instructivo pero tedioso; una herramienta de conversión base64 lo hace instantáneo.
La idea clave es que un resumen tiene primero bytes y la representación de texto es secundaria. Cada codificación de los mismos bytes se decodifica en los mismos bytes y, por lo tanto, es intercambiable a efectos de verificación de integridad. Las diferencias entre mayúsculas y minúsculas en hexadecimal, diferencias de relleno en base64, prefijos y espacios son opciones de formato que no afectan el valor real. Cuando dominas la capacidad de convertir entre representaciones, las discrepancias en el formato de resumen se convierten en problemas de depuración que puedes resolver en lugar de misterios.