Español

Herramientas de desarrollo · Calculadora de hash SHA

Direccionamiento de contenido: cómo Git, Docker y npm usan SHA Digests como nombres

· Antecedentes

sha-256 docker criptografía flujo de trabajo del desarrollador

Confirmaciones de Git, capas de Docker y hashes de paquetes abordados por sus resúmenes SHA-256
Ilustración de vector original de ToolAcre

Las confirmaciones de Git, los resúmenes de imágenes de contenedores y las cadenas de integridad de archivos de bloqueo son todos la misma idea: nombrar datos por su hash. Esta publicación explica cómo abordar el contenido y qué gana cada ecosistema con él.

El sha256: en la ventana acoplable: qué es esa cadena y por qué nunca cambia para la misma imagen

Los sistemas de control de versiones, los tiempos de ejecución de contenedores y los administradores de paquetes utilizan la misma idea de nomenclatura: un archivo o una colección de bytes recibe el nombre de su resumen SHA. En Git, el identificador de carácter 40 SHA-1 de una confirmación (o carácter 64 SHA-256 en repositorios modernos) se calcula a partir del contenido de la confirmación: el árbol, el autor, la marca de tiempo y el mensaje. Cambie un solo byte y el SHA cambiará. En Docker, cada resumen de capa es un hash SHA-256 del contenido de la capa y el resumen de la imagen se calcula a partir del manifiesto. En npm y otros administradores de paquetes, los campos de integridad almacenan SHA-512 resúmenes de archivos comprimidos para verificar las descargas. El direccionamiento de contenido significa que el nombre depende sólo de los bytes, no de una base de datos central ni de una marca de tiempo.

El beneficio es la inmutabilidad dentro de cada sistema. Un git commit SHA-256:abc... siempre hará referencia al mismo árbol y mensaje porque el hash determina la identidad. Si alguien afirma tener una confirmación diferente con el mismo SHA, afirma que los mismos bytes producen dos hashes diferentes, lo que rompe la criptografía. La deduplicación se vuelve automática: dos archivos con bytes idénticos producen el mismo resumen, por lo que los sistemas de almacenamiento pueden almacenar los bytes una vez y hacer referencia a ellos dos veces. La verificación de integridad se vuelve tan simple como volver a calcular el resumen y compararlo: si los bytes se modificaron en tránsito o en reposo, el resumen ya no coincide.

Nombrar datos por su hash: la idea de abordar el contenido y por qué hace que la deduplicación y la integridad sean libres

Git almacena objetos (confirmaciones, árboles, blobs y etiquetas) codificados por su resumen SHA. El comando `git cat-file` toma un ID de objeto y recupera los bytes. El almacén de objetos está dirigido al contenido: usted solicita por resumen, no por ubicación o por nombre. Cuando clonas un repositorio, git verifica cada objeto recalculando su resumen y comparándolo con el resumen empaquetado en la transferencia. La transición de SHA-1 a SHA-256 es gradual; Los repositorios pueden admitir ambos por compatibilidad. El formato en disco almacena el tipo, tamaño y bytes comprimidos del objeto. El resumen se calcula en la forma canónica sin comprimir.

Los repositorios Git modernos pueden usar SHA-256, y la transición está en curso porque las colisiones SHA-1 ahora son prácticas (demostradas en 2017 y refinadas en 2020). Una confirmación en un repositorio que utiliza SHA-256 tiene un identificador hexadecimal de 64 caracteres en lugar de 40. El comando `git hash-object` calcula el SHA de un blob (contenido del archivo) sin almacenarlo; `git commit-tree` calcula el SHA de una estructura de árbol y un mensaje. Ambas operaciones son deterministas: los mismos bytes siempre producen el mismo resumen. Así es como GitHub y otras forjas pueden mostrar SHA de confirmación de manera consistente: calculan el mismo resumen que calculó el clon del autor.

Git utiliza objetos dirigidos a contenido y esta herramienta puede reproducir resúmenes de texto; Los detalles de la migración requieren fuentes específicas de Git.

Las imágenes de Docker se crean en capas, donde cada capa es un delta del sistema de archivos (cambios con respecto a la capa anterior). La especificación de imagen OCI define cómo calcular el resumen de una capa y el resumen del manifiesto de imagen. El resumen de la capa es el SHA-256 del archivo tar comprimido que contiene los archivos de la capa. El manifiesto es un documento JSON que enumera las capas, sus resúmenes y metadatos. El resumen de la imagen es el SHA-256 del propio manifiesto JSON. Cuando extraes una imagen usando una etiqueta como `latest`, el registro busca la etiqueta y devuelve el resumen del manifiesto. Luego puede extraer el resumen directamente, asegurándose de obtener exactamente los mismos bytes (todas las capas y metadatos) en todo momento.

El comando `docker inspect` en una imagen local muestra su resumen. Ejecutar la misma imagen desde la misma etiqueta en dos máquinas produce el mismo resumen si el registro todavía contiene esa etiqueta que apunta al mismo manifiesto. El direccionamiento de contenido hace que las cadenas de suministro de imágenes sean auditables: una canalización CI/CD puede verificar que la imagen que implementó coincide con el resumen en el registro de compilación, y un escáner de seguridad puede informar sobre todas las imágenes que se sabe que tienen una vulnerabilidad específica mediante su resumen en lugar de por etiqueta, que puede moverse.

Contenedores: manifiestos OCI y resúmenes de capas, y por qué una etiqueta se puede mover pero un resumen no

Los administradores de paquetes utilizan resúmenes para verificar las descargas contra manipulación o corrupción. En npm, el archivo `package-lock.json` incluye un campo `integrity` para cada dependencia, que contiene un hash (normalmente SHA-512) y la codificación (normalmente base64). Cuando npm descarga un tarball, vuelve a calcular el hash y lo compara. Si los hashes no coinciden, la instalación falla. Go utiliza un archivo `go.sum` con estructura similar: ruta del módulo, versión y SHA-256 de la fuente del módulo. Cargo utiliza sumas de verificación en `Cargo.lock`. El principio es idéntico: el resumen se calcula una vez cuando la dependencia se resuelve por primera vez y se verifica en cada instalación posterior.

La verificación de integridad no requiere cargar el paquete a una autoridad firmante ni almacenar las firmas por separado. El resumen ES la verificación de integridad. Para obtener la máxima seguridad, los proyectos utilizan `go.sum`, que está firmado por el sistema de transparencia del proyecto Go, o la integridad npm combinada con otra verificación, pero el caso base es simple: el editor calcula el resumen una vez, lo registra en el archivo de bloqueo y las herramientas del lado del consumidor verifican que los bytes descargados coincidan.

Las codificaciones de integridad del paquete varían; Aquí solo se afirman las salidas SHA compatibles con esta calculadora.

Los mismos bytes a través del mismo algoritmo siempre producen el mismo resumen, independientemente de dónde provengan los bytes. La compilación local de una confirmación por parte de un desarrollador produce el mismo SHA-256 que un sistema CI/CD que extrae la misma revisión del mismo repositorio. Esta reproducibilidad es la razón por la que funciona el direccionamiento de contenido: puede verificar un artefacto sin confiar en el mecanismo de entrega. El resumen se convierte en un compromiso criptográfico: cambiar incluso un byte lo invalida.

Distribuir el resumen por separado (antes de distribuir el artefacto) protege contra modificaciones en curso. Una página web publicada antes del lanzamiento puede mostrar "esperar SHA-256:abc..." y luego los usuarios pueden verificar las descargas. Un compromiso de git publicado en un repositorio público es un compromiso de bytes; el resumen lo demuestra.

Ejemplo resuelto: seguir un blob desde los bytes hasta el resumen hasta el nombre que utiliza una herramienta para él

Diferentes sistemas codifican sus resúmenes de manera diferente. Git usa hexadecimal en minúsculas de forma predeterminada (40 o 64 caracteres hexadecimales). Docker usa el formato `sha256:` seguido de hexadecimal. npm y Go usan base64 en los campos de integridad. Los bytes son los mismos; sólo difiere la representación. Un resumen SHA-256 sobre "abc" siempre tiene los mismos 256 bits, pero puede verlo como una cadena hexadecimal de 64 caracteres, una cadena base64 de 44 caracteres o una etiqueta como `sha256:` seguida de cualquiera de ellas. La conversión entre codificaciones no tiene pérdidas; el resumen tiene el mismo valor en cada representación.

Comprender la codificación es importante al comparar resúmenes entre herramientas. Si Git imprime un resumen hexadecimal y una herramienta muestra base64, debe convertir una representación a la otra para verificar que coincidan. La calculadora de hash SHA de ToolAcre muestra tanto hexadecimal como base64 para cada resumen, lo que facilita la conversión o la referencia cruzada con otros sistemas.

Lo que esto no cubre: las codificaciones específicas que utiliza cada herramienta (hexadecimal versus base64), cubiertas en una publicación separada

El direccionamiento de contenido no es específico de la criptografía, aunque los hashes criptográficos lo hacen seguro. Una suma de comprobación CRC32 también aborda datos de direcciones de contenido, pero las colisiones CRC32 son comunes y se pueden fabricar; este repositorio no marca SHA-256 como roto, mientras que CRC32 no se ofrece como una primitiva de integridad adversaria. La elección del algoritmo hash es importante para la seguridad: SHA-256 es el estándar moderno para sistemas que necesitan protección de integridad contra adversarios. SHA-1 es solo heredado (Git y otros están migrando). Elegir el algoritmo correcto es una decisión independiente de elegir el direccionamiento de contenido como esquema de nomenclatura.

El direccionamiento de contenido combinado con hashes criptográficos es la base de la integridad de la cadena de suministro en el software moderno. Se puede verificar que cada paquete que instale, cada contenedor que ejecute y cada confirmación que extraiga sean los bytes que pretendía el editor original, sin depender de una transferencia segura (aunque la transferencia segura sigue siendo una buena práctica).

Conclusión: el hash es la identidad: la calculadora de hash SHA de ToolAcre le permite calcular los mismos resúmenes en los que se basan estos sistemas

El direccionamiento del contenido es independiente de la codificación, la ubicación de almacenamiento o el mecanismo de transferencia. Los mismos bytes producen el mismo resumen, ya sea que se almacenen localmente, en una CDN, en un registro o se transmitan a través de HTTP o HTTPS seguro. El resumen es un compromiso criptográfico con los bytes, y verificarlo solo requiere los bytes y el algoritmo, no ningún servicio externo. Esta es la razón por la que el direccionamiento de contenido permite la verificación fuera de línea: puede descargar un archivo a través de un canal que no es de confianza, verificar el resumen y saber si los bytes son auténticos.

La calculadora de hash SHA de ToolAcre le permite calcular los mismos resúmenes en los que se basan estos sistemas. Pegue una cadena o mire un archivo, ejecute la calculadora y vea los resúmenes SHA-256, SHA-384 y SHA-512 que Docker, Git, npm y otras herramientas usan internamente. Compare su resumen calculado con el de la fuente original para verificar que los bytes no hayan sido modificados. La calculadora codifica UTF-8 el texto que usted pega; no procesa archivos ni material de claves, por lo que el límite entre lo que puede procesar (entrada de texto) y lo que no puede (archivos binarios, claves criptográficas en sus formas codificadas) es claro y está documentado.